Merge "Add a MediaRouterParams constant for removing cast icon animation" into androidx-main
diff --git a/activity/activity-compose/build.gradle b/activity/activity-compose/build.gradle
index b8446c4..d77d1d9e 100644
--- a/activity/activity-compose/build.gradle
+++ b/activity/activity-compose/build.gradle
@@ -37,7 +37,7 @@
 
 androidx {
     name = "Activity Compose"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenGroup = LibraryGroups.ACTIVITY
     inceptionYear = "2020"
     description = "Compose integration with Activity"
diff --git a/appcompat/appcompat/api/api_lint.ignore b/appcompat/appcompat/api/api_lint.ignore
index debb275..e8903ced9 100644
--- a/appcompat/appcompat/api/api_lint.ignore
+++ b/appcompat/appcompat/api/api_lint.ignore
@@ -41,6 +41,14 @@
     Getter should be on the built object, not the builder: method androidx.appcompat.app.AlertDialog.Builder.getContext()
 
 
+GetterSetterNames: androidx.appcompat.view.ActionMode#getTitleOptionalHint():
+    Symmetric method for `setTitleOptionalHint` must be named `isTitleOptionalHint`; was `getTitleOptionalHint`
+GetterSetterNames: androidx.appcompat.widget.SwitchCompat#getShowText():
+    Symmetric method for `setShowText` must be named `isShowText`; was `getShowText`
+GetterSetterNames: androidx.appcompat.widget.SwitchCompat#getSplitTrack():
+    Symmetric method for `setSplitTrack` must be named `isSplitTrack`; was `getSplitTrack`
+
+
 ListenerLast: androidx.appcompat.app.AlertDialog.Builder#setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, String) parameter #2:
     Listeners should always be at end of argument list (method `setCursor`)
 
@@ -647,8 +655,6 @@
     Missing nullability on parameter `actionModeCallback` in method `setCustomSelectionActionModeCallback`
 MissingNullability: androidx.appcompat.widget.AppCompatCheckedTextView#setTextAppearance(android.content.Context, int) parameter #0:
     Missing nullability on parameter `context` in method `setTextAppearance`
-MissingNullability: androidx.appcompat.widget.AppCompatEditText#onCreateInputConnection(android.view.inputmethod.EditorInfo):
-    Missing nullability on method `onCreateInputConnection` return
 MissingNullability: androidx.appcompat.widget.AppCompatEditText#onCreateInputConnection(android.view.inputmethod.EditorInfo) parameter #0:
     Missing nullability on parameter `outAttrs` in method `onCreateInputConnection`
 MissingNullability: androidx.appcompat.widget.AppCompatEditText#setCustomSelectionActionModeCallback(android.view.ActionMode.Callback) parameter #0:
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
index 3984f6e..1e5bf99 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
@@ -35,6 +35,7 @@
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.pm.PackageManager;
+import android.os.Build;
 import android.view.Menu;
 import android.view.View;
 import android.view.WindowManager;
@@ -81,6 +82,11 @@
 
     @Test
     public void testActionBarOverflowVisibilityListener() {
+        if ("ranchu".equals(Build.HARDWARE)) {
+            // Skip this test on Android TV due to a bug in Espresso's menu handling.
+            return;
+        }
+
         ActionBar actionBar = mActivityTestRule.getActivity().getSupportActionBar();
         final boolean[] madeVisible = new boolean[] {false};
         actionBar.addOnMenuVisibilityListener(new ActionBar.OnMenuVisibilityListener() {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
index eabc256..0217d41 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
@@ -17,6 +17,7 @@
 package androidx.appcompat.app;
 
 import android.content.res.Configuration;
+import android.os.Bundle;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -28,6 +29,8 @@
 
 public class NightModeActivity extends BaseTestActivity {
     private final Semaphore mOnConfigurationChangeSemaphore = new Semaphore(0);
+    private final Semaphore mOnDestroySemaphore = new Semaphore(0);
+    private final Semaphore mOnCreateSemaphore = new Semaphore(0);
 
     private int mLastNightModeChange = Integer.MIN_VALUE;
     private Configuration mLastConfigurationChange;
@@ -50,6 +53,20 @@
         mLastConfigurationChange = newConfig;
     }
 
+    @Override
+    public void onCreate(Bundle bundle) {
+        super.onCreate(bundle);
+
+        mOnCreateSemaphore.release();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+        mOnDestroySemaphore.release();
+    }
+
     @Nullable
     Configuration getLastConfigurationChangeAndClear() {
         final Configuration config = mLastConfigurationChange;
@@ -83,7 +100,7 @@
      * method will return immediately.
      *
      * @param timeout maximum amount of time to wait for a configuration change
-     * @throws InterruptedException
+     * @throws InterruptedException if the lock is interrupted
      */
     public void expectOnConfigurationChange(long timeout) throws InterruptedException {
         if (Thread.currentThread() == getMainLooper().getThread()) {
@@ -92,4 +109,62 @@
 
         mOnConfigurationChangeSemaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS);
     }
+
+    /**
+     * Resets the number of received onCreate lifecycle events.
+     * <p>
+     * Call this method before {@link #expectOnCreate(long)} to ensure only future
+     * onCreate lifecycle events are counted.
+     *
+     * @see #expectOnCreate(long)
+     */
+    public void resetOnCreate() {
+        mOnCreateSemaphore.drainPermits();
+    }
+
+    /**
+     * Blocks until a single onCreate lifecycle event has been received.
+     * <p>
+     * Lifecycle events are sticky; if any events were received prior to calling this method and
+     * an event has been received, this method will return immediately.
+     *
+     * @param timeout maximum amount of time to wait for an onCreate event
+     * @throws InterruptedException if the lock is interrupted
+     */
+    public void expectOnCreate(long timeout) throws InterruptedException {
+        if (Thread.currentThread() == getMainLooper().getThread()) {
+            throw new IllegalStateException("Method cannot be called on the Activity's UI thread");
+        }
+
+        mOnCreateSemaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * Resets the number of received onDestroy lifecycle events.
+     * <p>
+     * Call this method before {@link #expectOnDestroy(long)} to ensure only future
+     * onDestroy lifecycle events are counted.
+     *
+     * @see #expectOnDestroy(long)
+     */
+    public void resetOnDestroy() {
+        mOnDestroySemaphore.drainPermits();
+    }
+
+    /**
+     * Blocks until a single onDestroy lifecycle event has been received.
+     * <p>
+     * Lifecycle events are sticky; if any events were received prior to calling this method and
+     * an event has been received, this method will return immediately.
+     *
+     * @param timeout maximum amount of time to wait for an onDestroy event
+     * @throws InterruptedException if the lock is interrupted
+     */
+    public void expectOnDestroy(long timeout) throws InterruptedException {
+        if (Thread.currentThread() == getMainLooper().getThread()) {
+            throw new IllegalStateException("Method cannot be called on the Activity's UI thread");
+        }
+
+        mOnDestroySemaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS);
+    }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
index 629ad51..0d0af97 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
@@ -40,17 +40,18 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class NightModeRotateDoesNotRecreateActivityTestCase(private val setMode: NightSetMode) {
+public class NightModeRotateDoesNotRecreateActivityTestCase(private val setMode: NightSetMode) {
     @get:Rule
-    val activityRule = NightModeActivityTestRule(
-        NightModeRotateDoesNotRecreateActivity::class.java,
-        initialTouchMode = false,
-        // Let the test method launch its own activity so that we can ensure it's RESUMED.
-        launchActivity = false
-    )
+    public val activityRule: NightModeActivityTestRule<NightModeRotateDoesNotRecreateActivity> =
+        NightModeActivityTestRule(
+            NightModeRotateDoesNotRecreateActivity::class.java,
+            initialTouchMode = false,
+            // Let the test method launch its own activity so that we can ensure it's RESUMED.
+            launchActivity = false
+        )
 
     @After
-    fun teardown() {
+    public fun teardown() {
         // Clean up after the default mode test.
         if (setMode == NightSetMode.DEFAULT) {
             activityRule.runOnUiThread {
@@ -60,7 +61,7 @@
     }
 
     @Test
-    fun testRotateDoesNotRecreateActivity() {
+    public fun testRotateDoesNotRecreateActivity() {
         // Don't run this test on SDK 26 because it has issues with setRequestedOrientation. Also
         // don't run it on SDK 24 (Nexus Player) or SDK 23 (Pixel C) because those devices only
         // support a single orientation and there doesn't seem to be a way to query supported
@@ -77,6 +78,9 @@
 
         val nightModeActivity = activityRule.activity
         val config = nightModeActivity.resources.configuration
+
+        // On API level 26 and below, the configuration object is going to be identical
+        // across configuration changes, so we need to pull the orientation value now.
         val orientation = config.orientation
 
         // Assert that the current Activity is 'dark'.
@@ -99,10 +103,10 @@
         assertNotSame(orientation, rotatedConfig.orientation)
     }
 
-    companion object {
+    public companion object {
         @JvmStatic
         @Parameterized.Parameters
-        fun data() = if (Build.VERSION.SDK_INT >= 17) {
+        public fun data(): List<NightSetMode> = if (Build.VERSION.SDK_INT >= 17) {
             listOf(NightSetMode.DEFAULT, NightSetMode.LOCAL)
         } else {
             listOf(NightSetMode.DEFAULT)
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
index 194e254..9a73838 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
@@ -18,14 +18,19 @@
 
 import android.content.res.Configuration
 import android.os.Build
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
 import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
-import androidx.appcompat.testutils.NightModeUtils.resetRotateAndWaitForRecreate
-import androidx.appcompat.testutils.NightModeUtils.rotateAndWaitForRecreate
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
+import androidx.appcompat.testutils.TestUtilsActions.rotateScreenOrientation
+import androidx.lifecycle.Lifecycle
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.filters.LargeTest
+import androidx.testutils.LifecycleOwnerUtils
+import org.junit.After
 import org.junit.Assert.assertNotSame
 import org.junit.Rule
 import org.junit.Test
@@ -34,22 +39,44 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class NightModeRotateRecreatesActivityWithConfigTestCase(private val setMode: NightSetMode) {
+public class NightModeRotateRecreatesActivityWithConfigTestCase(private val setMode: NightSetMode) {
     @get:Rule
-    val activityRule = NightModeActivityTestRule(NightModeActivity::class.java)
+    public val activityRule: NightModeActivityTestRule<NightModeActivity> =
+        NightModeActivityTestRule(
+            NightModeActivity::class.java,
+            initialTouchMode = false,
+            // Let the test method launch its own activity so that we can ensure it's RESUMED.
+            launchActivity = false
+        )
+
+    @After
+    public fun teardown() {
+        // Clean up after the default mode test.
+        if (setMode == NightSetMode.DEFAULT) {
+            activityRule.runOnUiThread {
+                AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM)
+            }
+        }
+    }
 
     @Test
-    fun testRotateRecreatesActivityWithConfig() {
-        // Don't run this test on SDK 26 because it has issues with setRequestedOrientation.
-        if (Build.VERSION.SDK_INT == 26) {
+    public fun testRotateRecreatesActivityWithConfig() {
+        // Don't run this test on SDK 26 because it has issues with setRequestedOrientation. Also
+        // don't run it on SDK 24 (Nexus Player) or SDK 23 (Pixel C) because those devices only
+        // support a single orientation and there doesn't seem to be a way to query supported
+        // screen orientations.
+        val sdkInt = Build.VERSION.SDK_INT
+        if (sdkInt == 26 || sdkInt == 24 || sdkInt == 23) {
             return
         }
 
-        // Set local night mode to YES
-        setNightModeAndWaitForRecreate(activityRule, MODE_NIGHT_YES, setMode)
+        // Set local night mode to MODE_NIGHT_YES and wait for state RESUMED.
+        val initialActivity = activityRule.launchActivity(null)
+        LifecycleOwnerUtils.waitUntilState(initialActivity, Lifecycle.State.RESUMED)
+        setNightModeAndWaitForRecreate(initialActivity, MODE_NIGHT_YES, setMode)
 
-        val activity = activityRule.activity
-        val config = activity.resources.configuration
+        val nightModeActivity = activityRule.activity
+        val config = nightModeActivity.resources.configuration
 
         // On API level 26 and below, the configuration object is going to be identical
         // across configuration changes, so we need to pull the orientation value now.
@@ -58,25 +85,30 @@
         // Assert that the current Activity is 'dark'
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, config)
 
-        rotateAndWaitForRecreate(activityRule.activity)
+        // Now rotate the device. This should result in an onDestroy lifecycle event.
+        nightModeActivity.resetOnCreate()
+        nightModeActivity.resetOnDestroy()
+        onView(ViewMatchers.isRoot()).perform(rotateScreenOrientation(nightModeActivity))
+        nightModeActivity.expectOnDestroy(5000)
 
-        // Assert that we got a new activity.
-        val activity2 = activityRule.activity
-        val config2 = activity2.resources.configuration
+        // Slow devices might need some time between onDestroy and onCreate.
+        nightModeActivity.expectOnCreate(5000)
 
-        // And assert that we have a different 'dark' Activity in a new orientation
-        assertNotSame(activity, activity2)
-        assertNotSame(orientation, config2.orientation)
-        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, config2)
+        // Assert that we got a different activity and thus it was recreated.
+        val rotatedNightModeActivity = activityRule.activity
+        val rotatedConfig = rotatedNightModeActivity.resources.configuration
+        assertNotSame(nightModeActivity, rotatedNightModeActivity)
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rotatedConfig)
 
-        // Reset the requested orientation and wait for it to apply.
-        resetRotateAndWaitForRecreate(activityRule.activity)
+        // On API level 26 and below, the configuration object is going to be identical
+        // across configuration changes, so we need to compare against the cached value.
+        assertNotSame(orientation, rotatedConfig.orientation)
     }
 
-    companion object {
+    public companion object {
         @JvmStatic
         @Parameterized.Parameters
-        fun data() = if (Build.VERSION.SDK_INT >= 17) {
+        public fun data(): List<NightSetMode> = if (Build.VERSION.SDK_INT >= 17) {
             listOf(NightSetMode.DEFAULT, NightSetMode.LOCAL)
         } else {
             listOf(NightSetMode.DEFAULT)
diff --git a/benchmark/benchmark/build.gradle b/benchmark/benchmark/build.gradle
index 98a9387..5af72d9 100644
--- a/benchmark/benchmark/build.gradle
+++ b/benchmark/benchmark/build.gradle
@@ -24,14 +24,14 @@
 
 android {
     defaultConfig {
-        // 18 needed for UI automator dependency, via benchmark-perfetto
+        // 18 needed for UI automator dependency, via benchmark-macro-junit4
         minSdkVersion 18
     }
 }
 
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
-    androidTestImplementation(project(":benchmark:benchmark-perfetto"))
+    androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(project(":tracing:tracing-ktx"))
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
diff --git a/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/PerfettoOverheadBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/PerfettoOverheadBenchmark.kt
index f3f224c..0b09e96 100644
--- a/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/PerfettoOverheadBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/PerfettoOverheadBenchmark.kt
@@ -16,12 +16,12 @@
 
 package androidx.benchmark.benchmark
 
-import android.os.Trace
 import androidx.benchmark.junit4.BenchmarkRule
 import androidx.benchmark.junit4.measureRepeated
-import androidx.benchmark.perfetto.PerfettoRule
+import androidx.benchmark.macro.junit4.PerfettoRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
+import androidx.tracing.Trace
 import androidx.tracing.trace
 import org.junit.Rule
 import org.junit.Test
diff --git a/benchmark/common/api/public_plus_experimental_current.txt b/benchmark/common/api/public_plus_experimental_current.txt
index e54d1d6..2fc34f3 100644
--- a/benchmark/common/api/public_plus_experimental_current.txt
+++ b/benchmark/common/api/public_plus_experimental_current.txt
@@ -61,6 +61,7 @@
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class InstrumentationResults {
     method public android.os.Bundle getRunEndResultBundle();
     method public void instrumentationReport(kotlin.jvm.functions.Function1<? super androidx.benchmark.InstrumentationResultScope,kotlin.Unit> block);
+    method public void reportAdditionalFileToCopy(String key, String absoluteFilePath, optional boolean reportOnRunEndOnly);
     property public final android.os.Bundle runEndResultBundle;
     field public static final androidx.benchmark.InstrumentationResults INSTANCE;
   }
diff --git a/benchmark/common/build.gradle b/benchmark/common/build.gradle
index 333e122..686ab9a 100644
--- a/benchmark/common/build.gradle
+++ b/benchmark/common/build.gradle
@@ -40,11 +40,11 @@
 }
 
 androidx {
-    name = "Android Benchmark Common"
+    name = "Android Benchmark - Common"
     publish = Publish.SNAPSHOT_AND_RELEASE
     mavenGroup = LibraryGroups.BENCHMARK
     inceptionYear = "2018"
-    description = "Android Benchmark Common"
+    description = "Android Benchmark - Common"
 }
 
 // Allow usage of Kotlin's @Experimental annotation, which is itself experimental.
diff --git a/benchmark/common/src/main/java/androidx/benchmark/InstrumentationResults.kt b/benchmark/common/src/main/java/androidx/benchmark/InstrumentationResults.kt
index eeb7a50..43c8c58 100644
--- a/benchmark/common/src/main/java/androidx/benchmark/InstrumentationResults.kt
+++ b/benchmark/common/src/main/java/androidx/benchmark/InstrumentationResults.kt
@@ -92,7 +92,8 @@
      * In am instrument terms, per-test results are printed with `INSTRUMENTATION_STATUS:`, and
      * per-run results are reported with `INSTRUMENTATION_RESULT:`.
      */
-    internal fun reportAdditionalFileToCopy(
+    @Suppress("MissingJvmstatic")
+    public fun reportAdditionalFileToCopy(
         key: String,
         absoluteFilePath: String,
         reportOnRunEndOnly: Boolean = false
diff --git a/benchmark/integration-tests/macrobenchmark/build.gradle b/benchmark/integration-tests/macrobenchmark/build.gradle
index 58fb8e8..a45af07 100644
--- a/benchmark/integration-tests/macrobenchmark/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark/build.gradle
@@ -36,7 +36,7 @@
 
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
-    androidTestImplementation(project(":benchmark:benchmark-macro"))
+    androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/FrameTimingMetricValidation.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/FrameTimingMetricValidation.kt
index bf26a4d..2e6ae44 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/FrameTimingMetricValidation.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/FrameTimingMetricValidation.kt
@@ -19,7 +19,7 @@
 import android.content.Intent
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.FrameTimingMetric
-import androidx.benchmark.macro.MacrobenchmarkRule
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/ProcessSpeedProfileValidation.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/ProcessSpeedProfileValidation.kt
index 8c1a8d1..b01e547 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/ProcessSpeedProfileValidation.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/ProcessSpeedProfileValidation.kt
@@ -17,9 +17,9 @@
 package androidx.benchmark.integration.macrobenchmark
 
 import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.StartupTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import org.junit.Rule
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt
index 33778b4..742d7dc 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt
@@ -16,8 +16,8 @@
 
 package androidx.benchmark.integration.macrobenchmark
 
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/StartupUtils.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/StartupUtils.kt
index 3244437..2cd381d 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/StartupUtils.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/StartupUtils.kt
@@ -18,9 +18,9 @@
 
 import android.content.Intent
 import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.StartupTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 
 const val TARGET_PACKAGE = "androidx.benchmark.integration.macrobenchmark.target"
 
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt
index af3e850..e62457a 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt
@@ -16,8 +16,8 @@
 
 package androidx.benchmark.integration.macrobenchmark
 
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
diff --git a/benchmark/macro-junit4/build.gradle b/benchmark/macro-junit4/build.gradle
new file mode 100644
index 0000000..5c33119
--- /dev/null
+++ b/benchmark/macro-junit4/build.gradle
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+android {
+    defaultConfig {
+        // 18 needed for UI automator. While 28 is a theoretical minimum for Perfetto, we
+        // currently leave this lower currently to enable optional usage.
+        minSdkVersion 18
+        multiDexEnabled true
+    }
+}
+
+dependencies {
+    api(JUNIT)
+    api(KOTLIN_STDLIB)
+    api("androidx.annotation:annotation:1.1.0")
+    api(project(":benchmark:benchmark-macro"))
+    implementation(project(":benchmark:benchmark-common"))
+    implementation(ANDROIDX_TEST_EXT_JUNIT)
+    implementation(ANDROIDX_TEST_UIAUTOMATOR)
+
+    androidTestImplementation(project(":internal-testutils-ktx"))
+    androidTestImplementation(project(":tracing:tracing-ktx"))
+    androidTestImplementation("androidx.test:rules:1.3.0")
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    // DexMaker has it"s own MockMaker
+}
+
+androidx {
+    name = "Android Benchmark - Macrobenchmark JUnit4"
+    publish = Publish.SNAPSHOT_ONLY
+    mavenGroup = LibraryGroups.BENCHMARK
+    inceptionYear = "2020"
+    description = "Android Benchmark - Macrobenchmark JUnit4"
+}
diff --git a/benchmark/perfetto/lint-baseline.xml b/benchmark/macro-junit4/lint-baseline.xml
similarity index 100%
rename from benchmark/perfetto/lint-baseline.xml
rename to benchmark/macro-junit4/lint-baseline.xml
diff --git a/benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/PerfettoRuleTest.kt b/benchmark/macro-junit4/src/androidTest/java/androidx/benchmark/macro/test/PerfettoRuleTest.kt
similarity index 75%
rename from benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/PerfettoRuleTest.kt
rename to benchmark/macro-junit4/src/androidTest/java/androidx/benchmark/macro/test/PerfettoRuleTest.kt
index 53715b3..9ea9dd6 100644
--- a/benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/PerfettoRuleTest.kt
+++ b/benchmark/macro-junit4/src/androidTest/java/androidx/benchmark/macro/test/PerfettoRuleTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,12 +14,15 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.test
 
 import android.os.Build
+import androidx.benchmark.macro.junit4.PerfettoRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SmallTest
+import androidx.testutils.verifyWithPolling
+import androidx.tracing.Trace
 import androidx.tracing.trace
 import org.junit.Rule
 import org.junit.Test
@@ -51,4 +54,15 @@
     fun tracingNotEnabled() {
         verifyTraceEnable(false)
     }
+}
+
+private fun verifyTraceEnable(enabled: Boolean) {
+    // We poll here, since we may need to wait for enable flags to propagate to apps
+    verifyWithPolling(
+        "Timeout waiting for Trace.isEnabled == $enabled",
+        periodMs = 50,
+        timeoutMs = 500
+    ) {
+        Trace.isEnabled() == enabled
+    }
 }
\ No newline at end of file
diff --git a/benchmark/perfetto/src/main/AndroidManifest.xml b/benchmark/macro-junit4/src/main/AndroidManifest.xml
similarity index 92%
rename from benchmark/perfetto/src/main/AndroidManifest.xml
rename to benchmark/macro-junit4/src/main/AndroidManifest.xml
index 7672086..ed2a844 100644
--- a/benchmark/perfetto/src/main/AndroidManifest.xml
+++ b/benchmark/macro-junit4/src/main/AndroidManifest.xml
@@ -14,4 +14,4 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<manifest package="androidx.benchmark.perfetto"/>
+<manifest package="androidx.benchmark.macro.junit4" />
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkRule.kt b/benchmark/macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt
similarity index 81%
rename from benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkRule.kt
rename to benchmark/macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt
index b12889a..19cbcdd 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkRule.kt
+++ b/benchmark/macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,9 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro
+package androidx.benchmark.macro.junit4
 
 import androidx.annotation.IntRange
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.MacrobenchmarkScope
+import androidx.benchmark.macro.Metric
+import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.macrobenchmarkWithStartupMode
 import org.junit.rules.TestRule
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
@@ -33,7 +38,7 @@
      * @param packageName Package name of the app being measured.
      * @param metrics List of metrics to measure.
      * @param compilationMode Mode of compilation used before capturing measurement, such as
-     * [SPEED_PROFILE], which performs
+     * [CompilationMode.SpeedProfile].
      * @param startupMode Optional mode to force app launches performed with
      * [MacrobenchmarkScope.launchIntentAndWait] (and similar variants) to be of the assigned
      * type. For example, `COLD` launches kill the process before the measureBlock, to ensure
@@ -56,9 +61,10 @@
             uniqueName = currentDescription.toUniqueName(),
             className = currentDescription.className,
             testName = currentDescription.methodName,
-            config = MacrobenchmarkConfig(
-                packageName, metrics, compilationMode, iterations
-            ),
+            packageName = packageName,
+            metrics = metrics,
+            compilationMode = compilationMode,
+            iterations = iterations,
             startupMode = startupMode,
             setupBlock = setupBlock,
             measureBlock = measureBlock
@@ -72,5 +78,5 @@
         }
     }
 
-    internal fun Description.toUniqueName() = testClass.simpleName + "_" + methodName
+    private fun Description.toUniqueName() = testClass.simpleName + "_" + methodName
 }
diff --git a/benchmark/macro-junit4/src/main/java/androidx/benchmark/macro/junit4/PerfettoRule.kt b/benchmark/macro-junit4/src/main/java/androidx/benchmark/macro/junit4/PerfettoRule.kt
new file mode 100644
index 0000000..68f0cc7
--- /dev/null
+++ b/benchmark/macro-junit4/src/main/java/androidx/benchmark/macro/junit4/PerfettoRule.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.benchmark.macro.junit4
+
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.benchmark.InstrumentationResults
+import androidx.benchmark.macro.perfetto.PerfettoCapture
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+/**
+ * Add this rule to record a Perfetto trace for each test on Q+ devices.
+ *
+ * Relies on either AGP's additionalTestOutputDir copying, or (in Jetpack CI),
+ * `additionalTestOutputFile_***` copying.
+ *
+ * When invoked locally with Gradle, file will be copied to host path like the following:
+ *
+ * ```
+ * out/androidx/benchmark/benchmark-macro/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/<deviceName>/androidx.mypackage.TestClass_testMethod.perfetto-trace
+ * ```
+ *
+ * Note: if run from Studio, the file must be `adb pull`-ed manually, e.g.:
+ * ```
+ * > adb pull /storage/emulated/0/Android/data/androidx.mypackage.test/files/test_data/androidx.mypackage.TestClass_testMethod.trace
+ * ```
+ *
+ * You can check logcat for messages tagged "PerfettoRule:" for the path of each perfetto trace.
+ * ```
+ * > adb pull /storage/emulated/0/Android/data/mypackage.test/files/PerfettoCaptureTest.trace
+ * ```
+ */
+class PerfettoRule : TestRule {
+    override fun apply(base: Statement, description: Description) = object : Statement() {
+        override fun evaluate() {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                val traceName = "${description.className}_${description.methodName}.perfetto-trace"
+                PerfettoCapture().recordAndReportFile(traceName) {
+                    base.evaluate()
+                }
+            } else {
+                Log.d(TAG, "Perfetto trace skipped due to API level (${Build.VERSION.SDK_INT})")
+                base.evaluate()
+            }
+        }
+    }
+
+    companion object {
+        internal const val TAG = "PerfettoRule"
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.Q)
+internal fun PerfettoCapture.recordAndReportFile(traceName: String, block: () -> Unit) {
+    try {
+        Log.d(PerfettoRule.TAG, "Recording perfetto trace $traceName")
+        start()
+        block()
+        val destinationPath = destinationPath(traceName)
+        stop(destinationPath)
+        Log.d(PerfettoRule.TAG, "Finished recording to $destinationPath")
+        InstrumentationResults.reportAdditionalFileToCopy("perfetto_trace", destinationPath)
+    } finally {
+        cancel()
+    }
+}
diff --git a/benchmark/macro/build.gradle b/benchmark/macro/build.gradle
index 8c96fd1..0bffae9 100644
--- a/benchmark/macro/build.gradle
+++ b/benchmark/macro/build.gradle
@@ -17,6 +17,7 @@
 import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
+import androidx.build.SupportConfigKt
 
 plugins {
     id("AndroidXPlugin")
@@ -26,8 +27,21 @@
 
 android {
     defaultConfig {
-        minSdkVersion 28
-        multiDexEnabled true
+        // 18 needed for UI automator. While 28 is a theoretical minimum for Perfetto, we
+        // currently leave this lower currently to enable optional usage.
+        minSdkVersion 18
+    }
+    sourceSets {
+        main.assets.srcDirs += [
+                new File(
+                        SupportConfigKt.getPrebuiltsRoot(project),
+                        "androidx/traceprocessor/trace_processor_shell_aarch64"
+                ),
+                new File(
+                        SupportConfigKt.getPrebuiltsRoot(project),
+                        "androidx/traceprocessor/trace_processor_shell_arm32"
+                )
+        ]
     }
 }
 
@@ -35,20 +49,16 @@
     api(JUNIT)
     api(KOTLIN_STDLIB)
     api("androidx.annotation:annotation:1.1.0")
-    implementation(project(":benchmark:benchmark-common"))
-    implementation(project(":benchmark:benchmark-perfetto"))
-    implementation(ANDROIDX_TEST_EXT_JUNIT)
-    implementation(ANDROIDX_TEST_UIAUTOMATOR)
 
-    androidTestImplementation("androidx.test:rules:1.3.0")
+    implementation(project(":benchmark:benchmark-common"))
+    implementation(ANDROIDX_TEST_CORE)
+    implementation(ANDROIDX_TEST_UIAUTOMATOR)
+    implementation(ANDROIDX_TEST_RULES)
+
+    androidTestImplementation(project(":internal-testutils-ktx"))
+    androidTestImplementation(project(":tracing:tracing-ktx"))
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
-    // DexMaker has it"s own MockMaker
 }
 
 androidx {
@@ -60,9 +70,9 @@
 }
 
 // Define a task dependency so the app is installed before we run macro benchmarks.
-tasks.getByPath(':benchmark:benchmark-macro:connectedCheck')
+tasks.getByPath(':benchmark:benchmark-macro-junit4:connectedCheck')
         .dependsOn(
                 tasks.getByPath(
                         ':benchmark:integration-tests:macrobenchmark-target:installRelease'
                 )
-        )
+        )
\ No newline at end of file
diff --git a/benchmark/macro/src/androidTest/AndroidManifest.xml b/benchmark/macro/src/androidTest/AndroidManifest.xml
index 893555e..be6e99a 100644
--- a/benchmark/macro/src/androidTest/AndroidManifest.xml
+++ b/benchmark/macro/src/androidTest/AndroidManifest.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2020 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
+  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.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.benchmark.macro.test">
@@ -29,7 +29,7 @@
     </queries>
     <application>
         <activity
-            android:name=".TrivialStartupActivity"
+            android:name="androidx.benchmark.macro.TrivialStartupActivity"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/ActionsTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ActionsTest.kt
similarity index 90%
rename from benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/ActionsTest.kt
rename to benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ActionsTest.kt
index d5e016d..59c12f2 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/ActionsTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ActionsTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,12 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro.test
+package androidx.benchmark.macro
 
-import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.MacrobenchmarkScope
-import androidx.benchmark.macro.compile
-import androidx.benchmark.macro.device
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/IdeSummaryStringTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt
similarity index 92%
rename from benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/IdeSummaryStringTest.kt
rename to benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt
index 038d710..b7a2544 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/IdeSummaryStringTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro.test
+package androidx.benchmark.macro
 
 import androidx.benchmark.Stats
-import androidx.benchmark.macro.ideSummaryString
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import org.junit.Assert.assertEquals
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/StartupTimingMetricTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
similarity index 83%
rename from benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/StartupTimingMetricTest.kt
rename to benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
index 6bbf570..f9526ed 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/StartupTimingMetricTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
@@ -14,14 +14,11 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro.test
+package androidx.benchmark.macro
 
 import android.content.Intent
 import android.os.Build
-import androidx.benchmark.macro.MacrobenchmarkConfig
-import androidx.benchmark.macro.MacrobenchmarkScope
-import androidx.benchmark.macro.PerfettoCaptureWrapper
-import androidx.benchmark.macro.StartupTimingMetric
+import androidx.benchmark.macro.perfetto.PerfettoCaptureWrapper
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -36,8 +33,7 @@
     @LargeTest
     @Test
     fun noResults() {
-        assumeFalse(Build.SUPPORTED_64_BIT_ABIS.isEmpty())
-
+        assumeFalse(Build.SUPPORTED_64_BIT_ABIS.isEmpty() or Build.SUPPORTED_32_BIT_ABIS.isEmpty())
         val packageName = "fake.package.fiction.nostartups"
         val metrics = measureStartup(packageName) {
             // Do nothing
@@ -71,12 +67,7 @@
 fun measureStartup(packageName: String, measureBlock: () -> Unit): Map<String, Long> {
     val wrapper = PerfettoCaptureWrapper()
     val metric = StartupTimingMetric()
-    val config = MacrobenchmarkConfig(
-        packageName = packageName,
-        iterations = 1,
-        metrics = listOf(metric)
-    )
-    metric.configure(config)
+    metric.configure(packageName)
     wrapper.start()
     measureBlock()
     val tracePath = wrapper.stop(packageName, 1)!!
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/TrivialStartupActivity.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/TrivialStartupActivity.kt
similarity index 92%
rename from benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/TrivialStartupActivity.kt
rename to benchmark/macro/src/androidTest/java/androidx/benchmark/macro/TrivialStartupActivity.kt
index a07b0329..ce2400d 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/test/TrivialStartupActivity.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/TrivialStartupActivity.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro.test
+package androidx.benchmark.macro
 
 import android.app.Activity
 import android.os.Build
diff --git a/benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/PerfettoCaptureTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt
similarity index 83%
rename from benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/PerfettoCaptureTest.kt
rename to benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt
index f5eb123..1f24a66 100644
--- a/benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/PerfettoCaptureTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt
@@ -14,17 +14,17 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.perfetto
 
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.testutils.verifyWithPolling
 import androidx.tracing.Trace
 import androidx.tracing.trace
 import org.junit.After
 import org.junit.Assert.assertTrue
-import org.junit.Assert.fail
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -67,27 +67,9 @@
     }
 }
 
-@Suppress("SameParameterValue")
-private fun verifyWithPoll(
-    message: String,
-    periodMs: Long,
-    timeoutMs: Long,
-    tryBlock: () -> Boolean
-) {
-    var totalDurationMs = 0L
-    while (!tryBlock()) {
-        Thread.sleep(periodMs)
-
-        totalDurationMs += periodMs
-        if (totalDurationMs > timeoutMs) {
-            fail(message)
-        }
-    }
-}
-
 fun verifyTraceEnable(enabled: Boolean) {
     // We poll here, since we may need to wait for enable flags to propagate to apps
-    verifyWithPoll(
+    verifyWithPolling(
         "Timeout waiting for Trace.isEnabled == $enabled",
         periodMs = 50,
         timeoutMs = 500
diff --git a/benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/ShellUtilsTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt
similarity index 98%
rename from benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/ShellUtilsTest.kt
rename to benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt
index dbb48da..15592ce4 100644
--- a/benchmark/perfetto/src/androidTest/java/androidx/benchmark/perfetto/ShellUtilsTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.perfetto
 
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
diff --git a/benchmark/macro/src/main/AndroidManifest.xml b/benchmark/macro/src/main/AndroidManifest.xml
index b9cd06a..a599d46 100644
--- a/benchmark/macro/src/main/AndroidManifest.xml
+++ b/benchmark/macro/src/main/AndroidManifest.xml
@@ -14,4 +14,4 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<manifest package="androidx.benchmark.macro" />
+<manifest package="androidx.benchmark.macro"/>
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/Actions.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/Actions.kt
index ea94414..4b53c8a 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/Actions.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/Actions.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt
index c386a1e..30529d6 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,7 +14,21 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro
+package androidx.benchmark.macro/*
+ * 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 androidx.test.platform.app.InstrumentationRegistry
 
@@ -30,15 +44,16 @@
     }
 
     object None : CompilationMode(null) {
-        override fun toString() = "CompilationMode.None"
+        override fun toString() = "androidx.benchmark.macro.CompilationMode.None"
     }
 
     class SpeedProfile(val warmupIterations: Int = 3) : CompilationMode("speed-profile") {
-        override fun toString() = "CompilationMode.SpeedProfile(iterations=$warmupIterations)"
+        override fun toString() =
+            "androidx.benchmark.macro.CompilationMode.SpeedProfile(iterations=$warmupIterations)"
     }
 
     object Speed : CompilationMode("speed") {
-        override fun toString() = "CompilationMode.Speed"
+        override fun toString() = "androidx.benchmark.macro.CompilationMode.Speed"
     }
 }
 
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/IdeSummaryString.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/IdeSummaryString.kt
index 24e628d..d555ecf 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/IdeSummaryString.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/IdeSummaryString.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
index 1424c88..6a7f105 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,96 +14,28 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro
+package androidx.benchmark.macro/*
+ * 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 android.content.Intent
 import android.util.Log
 import androidx.benchmark.BenchmarkResult
 import androidx.benchmark.InstrumentationResults
 import androidx.benchmark.MetricResult
 import androidx.benchmark.ResultWriter
-import androidx.benchmark.perfetto.executeShellScript
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.uiautomator.By
-import androidx.test.uiautomator.UiDevice
-import androidx.test.uiautomator.Until
-
-/**
- * Provides access to common operations in app automation, such as killing the app,
- * or navigating home.
- */
-public class MacrobenchmarkScope(
-    private val packageName: String,
-    /**
-     * Controls whether launches will automatically set [Intent.FLAG_ACTIVITY_CLEAR_TASK].
-     *
-     * Default to true, so Activity launches go through full creation lifecycle stages, instead of
-     * just resume.
-     */
-    private val launchWithClearTask: Boolean
-) {
-    private val instrumentation = InstrumentationRegistry.getInstrumentation()
-    private val context = instrumentation.context
-    private val device = UiDevice.getInstance(instrumentation)
-
-    /**
-     * Launch the package, with a customizable intent.
-     */
-    fun launchPackageAndWait(
-        block: (Intent) -> Unit = {}
-    ) {
-        val intent = context.packageManager.getLaunchIntentForPackage(packageName)
-            ?: throw IllegalStateException("Unable to acquire intent for package $packageName")
-
-        block(intent)
-        launchIntentAndWait(intent)
-    }
-
-    fun launchIntentAndWait(intent: Intent) {
-        // Must launch with new task, as we're not launching from an existing task
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-        if (launchWithClearTask) {
-            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
-        }
-        context.startActivity(intent)
-        device.wait(
-            Until.hasObject(By.pkg(packageName).depth(0)),
-            5000 /* ms */
-        )
-    }
-
-    fun pressHome(delayDurationMs: Long = 300) {
-        device.pressHome()
-        Thread.sleep(delayDurationMs)
-    }
-
-    fun killProcess() {
-        Log.d(TAG, "Killing process $packageName")
-        device.executeShellCommand("am force-stop $packageName")
-    }
-
-    /**
-     * Drop Kernel's in-memory cache of disk pages.
-     *
-     * Enables measuring disk-based startup cost, without simply accessing cache of disk data
-     * held in memory, such as during [cold startup](StartupMode.COLD).
-     */
-    fun dropKernelPageCache() {
-        val result = device.executeShellScript(
-            "echo 3 > /proc/sys/vm/drop_caches && echo Success || echo Failure"
-        ).trim()
-        check(result == "Success") {
-            "Failed to drop kernel page cache, result: '$result'"
-        }
-    }
-}
-
-data class MacrobenchmarkConfig(
-    val packageName: String,
-    val metrics: List<Metric>,
-    val compilationMode: CompilationMode = CompilationMode.SpeedProfile(),
-    val iterations: Int
-)
+import androidx.benchmark.macro.perfetto.PerfettoCaptureWrapper
 
 /**
  * macrobenchmark test entrypoint, which doesn't depend on JUnit.
@@ -114,18 +46,21 @@
     uniqueName: String,
     className: String,
     testName: String,
-    config: MacrobenchmarkConfig,
+    packageName: String,
+    metrics: List<Metric>,
+    compilationMode: CompilationMode = CompilationMode.SpeedProfile(),
+    iterations: Int,
     launchWithClearTask: Boolean,
     setupBlock: MacrobenchmarkScope.(Boolean) -> Unit,
     measureBlock: MacrobenchmarkScope.() -> Unit
 ) {
     val startTime = System.nanoTime()
-    val scope = MacrobenchmarkScope(config.packageName, launchWithClearTask)
+    val scope = MacrobenchmarkScope(packageName, launchWithClearTask)
 
     // always kill the process at beginning of test
     scope.killProcess()
 
-    config.compilationMode.compile(config.packageName) {
+    compilationMode.compile(packageName) {
         setupBlock(scope, false)
         measureBlock(scope)
     }
@@ -134,29 +69,29 @@
     // output, and give it different (test-wide) lifecycle
     val perfettoCollector = PerfettoCaptureWrapper()
     try {
-        config.metrics.forEach {
-            it.configure(config)
+        metrics.forEach {
+            it.configure(packageName)
         }
         var isFirstRun = true
-        val metricResults = List(config.iterations) { iteration ->
+        val metricResults = List(iterations) { iteration ->
             setupBlock(scope, isFirstRun)
             isFirstRun = false
             perfettoCollector.start()
 
             try {
-                config.metrics.forEach {
+                metrics.forEach {
                     it.start()
                 }
                 measureBlock(scope)
             } finally {
-                config.metrics.forEach {
+                metrics.forEach {
                     it.stop()
                 }
             }
             val tracePath = perfettoCollector.stop(uniqueName, iteration)
-            config.metrics
+            metrics
                 // capture list of Map<String,Long> per metric
-                .map { it.getMetrics(config.packageName, tracePath!!) }
+                .map { it.getMetrics(packageName, tracePath!!) }
                 // merge into one map
                 .reduce { sum, element -> sum + element }
         }.mergeToMetricResults()
@@ -167,8 +102,8 @@
             statsList.forEach { it.putInBundle(bundle, "") }
         }
 
-        val warmupIterations = if (config.compilationMode is CompilationMode.SpeedProfile) {
-            config.compilationMode.warmupIterations
+        val warmupIterations = if (compilationMode is CompilationMode.SpeedProfile) {
+            compilationMode.warmupIterations
         } else {
             0
         }
@@ -179,7 +114,7 @@
                 testName = testName,
                 totalRunTimeNs = System.nanoTime() - startTime,
                 metrics = metricResults,
-                repeatIterations = config.iterations,
+                repeatIterations = iterations,
                 thermalThrottleSleepSeconds = 0,
                 warmupIterations = warmupIterations
             )
@@ -208,39 +143,14 @@
     }.sortedBy { it.stats.name }
 }
 
-enum class StartupMode {
-    /**
-     * Startup from scratch - app's process is not alive, and must be started in addition to
-     * Activity creation.
-     *
-     * See
-     * [Cold startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#cold)
-     */
-    COLD,
-
-    /**
-     * Create and display a new Activity in a currently running app process.
-     *
-     * See
-     * [Warm startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#warm)
-     */
-    WARM,
-
-    /**
-     * Bring existing activity to the foreground, process and Activity still exist from previous
-     * launch.
-     *
-     * See
-     * [Hot startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#hot)
-     */
-    HOT
-}
-
 fun macrobenchmarkWithStartupMode(
     uniqueName: String,
     className: String,
     testName: String,
-    config: MacrobenchmarkConfig,
+    packageName: String,
+    metrics: List<Metric>,
+    compilationMode: CompilationMode = CompilationMode.SpeedProfile(),
+    iterations: Int,
     startupMode: StartupMode?,
     setupBlock: MacrobenchmarkScope.() -> Unit,
     measureBlock: MacrobenchmarkScope.() -> Unit
@@ -249,7 +159,10 @@
         uniqueName = uniqueName,
         className = className,
         testName = testName,
-        config = config,
+        packageName = packageName,
+        metrics = metrics,
+        compilationMode = compilationMode,
+        iterations = iterations,
         setupBlock = { firstIterationAfterCompile ->
             if (startupMode == StartupMode.COLD) {
                 killProcess()
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
new file mode 100644
index 0000000..9b8c818
--- /dev/null
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
@@ -0,0 +1,96 @@
+/*
+ * 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.benchmark.macro
+
+import android.content.Intent
+import android.util.Log
+import androidx.benchmark.macro.perfetto.executeShellScript
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.Until
+
+/**
+ * Provides access to common operations in app automation, such as killing the app,
+ * or navigating home.
+ */
+public class MacrobenchmarkScope(
+    private val packageName: String,
+    /**
+     * Controls whether launches will automatically set [Intent.FLAG_ACTIVITY_CLEAR_TASK].
+     *
+     * Default to true, so Activity launches go through full creation lifecycle stages, instead of
+     * just resume.
+     */
+    private val launchWithClearTask: Boolean
+) {
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
+    private val context = instrumentation.context
+    private val device = UiDevice.getInstance(instrumentation)
+
+    /**
+     * Launch the package, with a customizable intent.
+     */
+    fun launchPackageAndWait(
+        block: (Intent) -> Unit = {}
+    ) {
+        val intent = context.packageManager.getLaunchIntentForPackage(packageName)
+            ?: throw IllegalStateException("Unable to acquire intent for package $packageName")
+
+        block(intent)
+        launchIntentAndWait(intent)
+    }
+
+    fun launchIntentAndWait(intent: Intent) {
+        // Must launch with new task, as we're not launching from an existing task
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+        if (launchWithClearTask) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
+        }
+        context.startActivity(intent)
+        device.wait(
+            Until.hasObject(By.pkg(packageName).depth(0)),
+            5000 /* ms */
+        )
+    }
+
+    fun pressHome(delayDurationMs: Long = 300) {
+        device.pressHome()
+        Thread.sleep(delayDurationMs)
+    }
+
+    fun killProcess() {
+        Log.d(TAG, "Killing process $packageName")
+        device.executeShellCommand("am force-stop $packageName")
+    }
+
+    /**
+     * Drop Kernel's in-memory cache of disk pages.
+     *
+     * Enables measuring disk-based startup cost, without simply accessing cache of disk data
+     * held in memory, such as during [cold startup](androidx.benchmark.macro.StartupMode.COLD).
+     */
+    fun dropKernelPageCache() {
+        val result = device.executeShellScript(
+            "echo 3 > /proc/sys/vm/drop_caches && echo Success || echo Failure"
+        ).trim()
+        // User builds don't allow drop caches yet.
+        if (result != "Success") {
+            Log.w(TAG, "Failed to drop kernel page cache, result: '$result'")
+        }
+    }
+}
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt
index 6892aee..2a0f056 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -17,8 +17,9 @@
 package androidx.benchmark.macro
 
 import android.util.Log
-import androidx.benchmark.perfetto.PerfettoResultsParser.parseResult
-import androidx.benchmark.perfetto.PerfettoTraceParser
+import androidx.annotation.RequiresApi
+import androidx.benchmark.macro.perfetto.PerfettoResultsParser.parseResult
+import androidx.benchmark.macro.perfetto.PerfettoTraceParser
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 
@@ -26,7 +27,7 @@
  * Metric interface.
  */
 sealed class Metric {
-    abstract fun configure(config: MacrobenchmarkConfig)
+    abstract fun configure(packageName: String)
 
     abstract fun start()
 
@@ -44,8 +45,8 @@
     private lateinit var packageName: String
     private val helper = JankCollectionHelper()
 
-    override fun configure(config: MacrobenchmarkConfig) {
-        packageName = config.packageName
+    override fun configure(packageName: String) {
+        this.packageName = packageName
         helper.addTrackedPackages(packageName)
     }
 
@@ -137,13 +138,14 @@
 /**
  * Captures app startup metrics.
  */
+@RequiresApi(29)
 class StartupTimingMetric : Metric() {
     private lateinit var packageName: String
     private lateinit var device: UiDevice
     private lateinit var parser: PerfettoTraceParser
 
-    override fun configure(config: MacrobenchmarkConfig) {
-        packageName = config.packageName
+    override fun configure(packageName: String) {
+        this.packageName = packageName
         val instrumentation = InstrumentationRegistry.getInstrumentation()
         device = instrumentation.device()
         parser = PerfettoTraceParser()
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/StartupMode.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/StartupMode.kt
new file mode 100644
index 0000000..a6b3603
--- /dev/null
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/StartupMode.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.benchmark.macro
+
+enum class StartupMode {
+    /**
+     * Startup from scratch - app's process is not alive, and must be started in addition to
+     * Activity creation.
+     *
+     * See
+     * [Cold startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#cold)
+     */
+    COLD,
+
+    /**
+     * Create and display a new Activity in a currently running app process.
+     *
+     * See
+     * [Warm startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#warm)
+     */
+    WARM,
+
+    /**
+     * Bring existing activity to the foreground, process and Activity still exist from previous
+     * launch.
+     *
+     * See
+     * [Hot startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#hot)
+     */
+    HOT
+}
\ No newline at end of file
diff --git a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt
similarity index 77%
rename from benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt
rename to benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt
index 82afd7c..c85c791 100644
--- a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoCapture.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt
@@ -14,10 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.perfetto
 
+import android.os.Environment
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
+import androidx.benchmark.macro.R
 import androidx.test.platform.app.InstrumentationRegistry
 import java.io.File
 
@@ -79,4 +81,20 @@
             throw IllegalStateException("Unable to store perfetto trace")
         }
     }
+
+    /*
+     * Get path for an file to be written to additionalTestOutputDir
+     *
+     * NOTE: this method of getting additionalTestOutputDir duplicates behavior in
+     *androidx.benchmark.Arguments`, and should be unified at some point.
+     */
+    fun destinationPath(traceName: String): String {
+        val additionalTestOutputDir = InstrumentationRegistry.getArguments()
+            .getString("additionalTestOutputDir")
+
+        @Suppress("DEPRECATION") // Legacy code path for versions of agp older than 3.6
+        val testOutputDir = additionalTestOutputDir?.let { File(it) }
+            ?: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+        return File(testOutputDir, traceName).absolutePath
+    }
 }
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/PerfettoCaptureWrapper.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt
similarity index 74%
rename from benchmark/macro/src/main/java/androidx/benchmark/macro/PerfettoCaptureWrapper.kt
rename to benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt
index 35a28e5..e43d8a8 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/PerfettoCaptureWrapper.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,13 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.macro
+package androidx.benchmark.macro.perfetto
 
 import android.os.Build
 import android.util.Log
-import androidx.benchmark.perfetto.PerfettoCapture
-import androidx.benchmark.perfetto.destinationPath
-import androidx.benchmark.perfetto.reportAdditionalFileToCopy
+import androidx.benchmark.InstrumentationResults
+import androidx.benchmark.macro.TAG
 
 /**
  * Wrapper for PerfettoCapture, which does nothing on API < Q
@@ -46,10 +45,16 @@
             val iterString = iteration.toString().padStart(3, '0')
             // NOTE: macrobench still using legacy .trace name until
             // Studio supports .perfetto-trace extension (b/171251272)
-            val traceName = "${benchmarkName}_iter$iterString.trace"
-            val destination = destinationPath(traceName).absolutePath
-            capture?.stop(destination)
-            reportAdditionalFileToCopy("perfetto_trace_$iterString", destination)
+            val traceName = "${benchmarkName}_iter$iterString.trace".replace(
+                oldValue = " ",
+                newValue = ""
+            )
+            val destination = capture!!.destinationPath(traceName)
+            capture!!.stop(destination)
+            InstrumentationResults.reportAdditionalFileToCopy(
+                key = "perfetto_trace_$iterString",
+                absoluteFilePath = destination
+            )
             return destination
         }
         return null
diff --git a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoHelper.java b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.java
similarity index 99%
rename from benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoHelper.java
rename to benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.java
index 2643ed5..9dcdb3d 100644
--- a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoHelper.java
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto;
+package androidx.benchmark.macro.perfetto;
 
 import android.os.SystemClock;
 import android.util.Log;
diff --git a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoResultsParser.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt
similarity index 97%
rename from benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoResultsParser.kt
rename to benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt
index edc45c5..68f256e 100644
--- a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoResultsParser.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.perfetto
 
 import org.json.JSONArray
 import org.json.JSONObject
diff --git a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoTraceParser.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceParser.kt
similarity index 80%
rename from benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoTraceParser.kt
rename to benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceParser.kt
index 785be51..ef26f9b 100644
--- a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoTraceParser.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceParser.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.perfetto
 
 import android.content.Context
 import android.os.Build
@@ -27,7 +27,7 @@
  * Enables parsing perfetto traces on-device on Q+ devices.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-@RequiresApi(21)
+@RequiresApi(29)
 class PerfettoTraceParser {
 
     /**
@@ -42,9 +42,16 @@
         val instrumentation = InstrumentationRegistry.getInstrumentation()
         val context: Context = instrumentation.context
         shellFile = File(context.cacheDir, "trace_processor_shell")
-        // TODO: support other ABIs
-        if (Build.SUPPORTED_64_BIT_ABIS.isEmpty()) {
-            throw IllegalStateException("Unsupported ABI")
+        val suffix = when {
+            Build.SUPPORTED_64_BIT_ABIS.isNotEmpty() -> {
+                "aarch64"
+            }
+            Build.SUPPORTED_32_BIT_ABIS.isNotEmpty() -> {
+                "arm32"
+            }
+            else -> {
+                throw IllegalStateException("Unsupported ABI")
+            }
         }
         // Write the trace_processor_shell to the external directory so we can process
         // perfetto metrics on device.
@@ -57,8 +64,7 @@
                 throw IllegalStateException("Unable to create new file $shellFile")
             }
             shellFile.outputStream().use {
-                // TODO: Copy the file based on the ABI
-                context.assets.open("trace_processor_shell_aarch64").copyTo(it)
+                context.assets.open("trace_processor_shell_$suffix").copyTo(it)
             }
         }
     }
diff --git a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/ShellUtils.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt
similarity index 98%
rename from benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/ShellUtils.kt
rename to benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt
index 7fccfd4..c0ba71c 100644
--- a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/ShellUtils.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.benchmark.perfetto
+package androidx.benchmark.macro.perfetto
 
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
diff --git a/benchmark/perfetto/src/main/res/raw/trace_config.textproto b/benchmark/macro/src/main/res/raw/trace_config.textproto
similarity index 100%
rename from benchmark/perfetto/src/main/res/raw/trace_config.textproto
rename to benchmark/macro/src/main/res/raw/trace_config.textproto
diff --git a/benchmark/perfetto/build.gradle b/benchmark/perfetto/build.gradle
deleted file mode 100644
index 767aee8..0000000
--- a/benchmark/perfetto/build.gradle
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryGroups
-import androidx.build.Publish
-import androidx.build.SupportConfigKt
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.library")
-    id("kotlin-android")
-}
-
-android {
-    defaultConfig {
-        // 18 needed for UI automator. Though this library isn't useful before API 28, we set a
-        // lower minSdkVersion to enable optional usage, based on API level.
-        minSdkVersion 18
-    }
-    sourceSets {
-        main.assets.srcDirs += new File(
-                SupportConfigKt.getPrebuiltsRoot(project),
-                "androidx/traceprocessor/trace_processor_shell"
-        )
-    }
-}
-
-dependencies {
-    api(JUNIT)
-    api(KOTLIN_STDLIB)
-    api("androidx.annotation:annotation:1.1.0")
-
-    implementation(ANDROIDX_TEST_CORE)
-    implementation(ANDROIDX_TEST_UIAUTOMATOR)
-    implementation(ANDROIDX_TEST_RULES)
-
-    androidTestImplementation(project(":tracing:tracing-ktx"))
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-}
-
-androidx {
-    name = "Android Benchmark - Perfetto"
-    publish = Publish.SNAPSHOT_ONLY
-    mavenGroup = LibraryGroups.BENCHMARK
-    inceptionYear = "2020"
-    description = "Android Benchmark - Perfetto"
-}
diff --git a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoRule.kt b/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoRule.kt
deleted file mode 100644
index df2a961..0000000
--- a/benchmark/perfetto/src/main/java/androidx/benchmark/perfetto/PerfettoRule.kt
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.benchmark.perfetto
-
-import android.os.Build
-import android.os.Bundle
-import android.os.Environment
-import android.util.Log
-import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
-import androidx.test.platform.app.InstrumentationRegistry
-import org.junit.rules.TestRule
-import org.junit.runner.Description
-import org.junit.runners.model.Statement
-import java.io.File
-
-/**
- * Add this rule to record a Perfetto trace for each test on Q+ devices.
- *
- * Relies on either AGP's additionalTestOutputDir copying, or (in Jetpack CI),
- * `additionalTestOutputFile_***` copying.
- *
- * When invoked locally with Gradle, file will be copied to host path like the following:
- *
- * ```
- * out/androidx/benchmark/benchmark-perfetto/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/<deviceName>/androidx.mypackage.TestClass_testMethod.trace
- * ```
- *
- * Note: if run from Studio, the file must be `adb pull`-ed manually, e.g.:
- * ```
- * > adb pull /storage/emulated/0/Android/data/androidx.mypackage.test/files/test_data/androidx.mypackage.TestClass_testMethod.trace
- * ```
- *
- * You can check logcat for messages tagged "PerfettoRule:" for the path of each perfetto trace.
- * ```
- * > adb pull /storage/emulated/0/Android/data/mypackage.test/files/PerfettoCaptureTest.trace
- * ```
- */
-class PerfettoRule : TestRule {
-    override fun apply(base: Statement, description: Description) = object : Statement() {
-        override fun evaluate() {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-                val traceName = "${description.className}_${description.methodName}.perfetto-trace"
-                PerfettoCapture().recordAndReportFile(traceName) {
-                    base.evaluate()
-                }
-            } else {
-                Log.d(TAG, "Perfetto trace skipped due to API level (${Build.VERSION.SDK_INT})")
-                base.evaluate()
-            }
-        }
-    }
-
-    companion object {
-        internal const val TAG = "PerfettoRule"
-    }
-}
-
-@RequiresApi(Build.VERSION_CODES.Q)
-internal fun PerfettoCapture.recordAndReportFile(traceName: String, block: () -> Unit) {
-    try {
-        Log.d(PerfettoRule.TAG, "Recording perfetto trace $traceName")
-        start()
-        block()
-        val dst = destinationPath(traceName)
-        stop(dst.absolutePath)
-        Log.d(PerfettoRule.TAG, "Finished recording to ${dst.absolutePath}")
-        reportAdditionalFileToCopy("perfetto_trace", dst.absolutePath)
-    } finally {
-        cancel()
-    }
-}
-
-/*
-   NOTE: this method of getting additionalTestOutputDir duplicates behavior in
-   androidx.benchmark.Arguments`, and should be unified at some point.
-*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-fun destinationPath(traceName: String): File {
-    val additionalTestOutputDir = InstrumentationRegistry.getArguments()
-        .getString("additionalTestOutputDir")
-
-    @Suppress("DEPRECATION") // Legacy code path for versions of agp older than 3.6
-    val testOutputDir = additionalTestOutputDir?.let { File(it) }
-        ?: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
-    return File(testOutputDir, traceName)
-}
-
-/**
- * Report additional file to be copied.
- *
- * Note that this is a temporary reimplementation of
- * `InstrumentationResults.reportAdditionalFileToCopy`, and should be unified at some point.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-fun reportAdditionalFileToCopy(
-    @Suppress("SameParameterValue") key: String,
-    absoluteFilePath: String
-) {
-    val bundle = Bundle().also {
-        it.putString("additionalTestOutputFile_$key", absoluteFilePath)
-    }
-    InstrumentationRegistry
-        .getInstrumentation()
-        .sendStatus(2, bundle)
-}
diff --git a/biometric/biometric-ktx/api/current.txt b/biometric/biometric-ktx/api/current.txt
index 1342c5a8..cda35b7 100644
--- a/biometric/biometric-ktx/api/current.txt
+++ b/biometric/biometric-ktx/api/current.txt
@@ -46,6 +46,9 @@
   }
 
   public final class CredentialAuthExtensionsKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticate(androidx.biometric.auth.CredentialAuthPrompt, androidx.biometric.auth.AuthPromptHost host, androidx.biometric.BiometricPrompt.CryptoObject? crypto, kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticateWithCredentials(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticateWithCredentials(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public static androidx.biometric.auth.AuthPrompt startCredentialAuthentication(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional java.util.concurrent.Executor? executor, androidx.biometric.auth.AuthPromptCallback callback);
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public static androidx.biometric.auth.AuthPrompt startCredentialAuthentication(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional java.util.concurrent.Executor? executor, androidx.biometric.auth.AuthPromptCallback callback);
   }
diff --git a/biometric/biometric-ktx/api/public_plus_experimental_current.txt b/biometric/biometric-ktx/api/public_plus_experimental_current.txt
index 1342c5a8..cda35b7 100644
--- a/biometric/biometric-ktx/api/public_plus_experimental_current.txt
+++ b/biometric/biometric-ktx/api/public_plus_experimental_current.txt
@@ -46,6 +46,9 @@
   }
 
   public final class CredentialAuthExtensionsKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticate(androidx.biometric.auth.CredentialAuthPrompt, androidx.biometric.auth.AuthPromptHost host, androidx.biometric.BiometricPrompt.CryptoObject? crypto, kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticateWithCredentials(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticateWithCredentials(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public static androidx.biometric.auth.AuthPrompt startCredentialAuthentication(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional java.util.concurrent.Executor? executor, androidx.biometric.auth.AuthPromptCallback callback);
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public static androidx.biometric.auth.AuthPrompt startCredentialAuthentication(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional java.util.concurrent.Executor? executor, androidx.biometric.auth.AuthPromptCallback callback);
   }
diff --git a/biometric/biometric-ktx/api/restricted_current.txt b/biometric/biometric-ktx/api/restricted_current.txt
index 1342c5a8..cda35b7 100644
--- a/biometric/biometric-ktx/api/restricted_current.txt
+++ b/biometric/biometric-ktx/api/restricted_current.txt
@@ -46,6 +46,9 @@
   }
 
   public final class CredentialAuthExtensionsKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticate(androidx.biometric.auth.CredentialAuthPrompt, androidx.biometric.auth.AuthPromptHost host, androidx.biometric.BiometricPrompt.CryptoObject? crypto, kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticateWithCredentials(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public static suspend Object? authenticateWithCredentials(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional kotlin.coroutines.Continuation<? super androidx.biometric.BiometricPrompt.AuthenticationResult> p);
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public static androidx.biometric.auth.AuthPrompt startCredentialAuthentication(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional java.util.concurrent.Executor? executor, androidx.biometric.auth.AuthPromptCallback callback);
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public static androidx.biometric.auth.AuthPrompt startCredentialAuthentication(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.CryptoObject? crypto, CharSequence title, optional CharSequence? description, optional java.util.concurrent.Executor? executor, androidx.biometric.auth.AuthPromptCallback callback);
   }
diff --git a/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt b/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt
index 4b7aeed..9d9368e 100644
--- a/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt
+++ b/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt
@@ -27,6 +27,7 @@
 import androidx.biometric.auth.Class2BiometricOrCredentialAuthPrompt
 import androidx.biometric.auth.Class3BiometricAuthPrompt
 import androidx.biometric.auth.Class3BiometricOrCredentialAuthPrompt
+import androidx.biometric.auth.CredentialAuthPrompt
 import androidx.biometric.auth.authenticate
 import androidx.fragment.app.Fragment
 import java.nio.charset.Charset
@@ -221,3 +222,61 @@
         // Handle auth failure due biometric credentials being rejected.
     }
 }
+
+@Sampled
+@Suppress("UnsafeNewApiCall", "NewApi")
+suspend fun Fragment.credentialAuth() {
+    // To use credential authentication, we need to create a CryptoObject.
+    // First create a spec for the key to be generated.
+    val keyPurpose = KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
+    val keySpec = KeyGenParameterSpec.Builder(KEY_NAME, keyPurpose).apply {
+        setBlockModes(KeyProperties.BLOCK_MODE_CBC)
+        setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
+        setUserAuthenticationRequired(true)
+
+        // Require authentication for each use of the key.
+        val timeout = 0
+        // Set the key type according to the allowed auth type.
+        val keyType = KeyProperties.AUTH_DEVICE_CREDENTIAL
+        setUserAuthenticationParameters(timeout, keyType)
+    }.build()
+
+    // Generate and store the key in the Android keystore.
+    KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEYSTORE_INSTANCE).run {
+        init(keySpec)
+        generateKey()
+    }
+
+    // Prepare the crypto object to use for authentication.
+    val cipher = Cipher.getInstance(
+        "${KeyProperties.KEY_ALGORITHM_AES}/${KeyProperties.BLOCK_MODE_CBC}/" +
+            KeyProperties.ENCRYPTION_PADDING_PKCS7
+    ).apply {
+        val keyStore = KeyStore.getInstance(KEYSTORE_INSTANCE).apply { load(null) }
+        init(Cipher.ENCRYPT_MODE, keyStore.getKey(KEY_NAME, null) as SecretKey)
+    }
+
+    val cryptoObject = BiometricPrompt.CryptoObject(cipher)
+    val payload = "A message to encrypt".toByteArray(Charset.defaultCharset())
+
+    // Construct AuthPrompt with localized Strings to be displayed to UI.
+    val authPrompt = CredentialAuthPrompt.Builder(title).apply {
+        setDescription(description)
+    }.build()
+
+    try {
+        val authResult = authPrompt.authenticate(AuthPromptHost(this), cryptoObject)
+
+        // Encrypt a payload using the result of crypto-based auth.
+        val encryptedPayload = authResult.cryptoObject?.cipher?.doFinal(payload)
+
+        // Use the encrypted payload somewhere interesting.
+        sendEncryptedPayload(encryptedPayload)
+    } catch (e: AuthPromptErrorException) {
+        // Handle irrecoverable error during authentication.
+        // Possible values for AuthPromptErrorException.errorCode are listed in the @IntDef,
+        // androidx.biometric.BiometricPrompt.AuthenticationError.
+    } catch (e: AuthPromptFailureException) {
+        // Handle auth failure due biometric credentials being rejected.
+    }
+}
diff --git a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricAuthExtensions.kt b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricAuthExtensions.kt
index 4c43052..a940f035 100755
--- a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricAuthExtensions.kt
+++ b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricAuthExtensions.kt
@@ -205,33 +205,16 @@
 }
 
 /**
- * Creates a [Class2BiometricAuthPrompt] with the given parameters.
- */
-private fun buildClass2BiometricAuthPrompt(
-    title: CharSequence,
-    negativeButtonText: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-): Class2BiometricAuthPrompt = Class2BiometricAuthPrompt.Builder(title, negativeButtonText)
-    .apply {
-        subtitle?.let { setSubtitle(it) }
-        description?.let { setDescription(it) }
-        setConfirmationRequired(confirmationRequired)
-    }
-    .build()
-
-/**
  * Creates a [Class2BiometricAuthPrompt] with the given parameters and starts authentication.
  */
 private fun startClass2BiometricAuthenticationInternal(
     host: AuthPromptHost,
     title: CharSequence,
     negativeButtonText: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-    executor: Executor? = null,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+    executor: Executor?,
     callback: AuthPromptCallback
 ): AuthPrompt {
     val prompt = buildClass2BiometricAuthPrompt(
@@ -248,3 +231,20 @@
         prompt.startAuthentication(host, executor, callback)
     }
 }
+
+/**
+ * Creates a [Class2BiometricAuthPrompt] with the given parameters.
+ */
+private fun buildClass2BiometricAuthPrompt(
+    title: CharSequence,
+    negativeButtonText: CharSequence,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+): Class2BiometricAuthPrompt = Class2BiometricAuthPrompt.Builder(title, negativeButtonText)
+    .apply {
+        subtitle?.let { setSubtitle(it) }
+        description?.let { setDescription(it) }
+        setConfirmationRequired(confirmationRequired)
+    }
+    .build()
diff --git a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricOrCredentialAuthExtensions.kt b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricOrCredentialAuthExtensions.kt
index 8c772e3..a41bf5d 100755
--- a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricOrCredentialAuthExtensions.kt
+++ b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class2BiometricOrCredentialAuthExtensions.kt
@@ -199,32 +199,16 @@
 }
 
 /**
- * Creates a [Class2BiometricOrCredentialAuthPrompt] with the given parameters.
- */
-private fun buildClass2BiometricOrCredentialAuthPrompt(
-    title: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-): Class2BiometricOrCredentialAuthPrompt = Class2BiometricOrCredentialAuthPrompt.Builder(title)
-    .apply {
-        subtitle?.let { setSubtitle(it) }
-        description?.let { setDescription(it) }
-        setConfirmationRequired(confirmationRequired)
-    }
-    .build()
-
-/**
  * Creates a [Class2BiometricOrCredentialAuthPrompt] with the given parameters and starts
  * authentication.
  */
 private fun startClass2BiometricOrCredentialAuthenticationInternal(
     host: AuthPromptHost,
     title: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-    executor: Executor? = null,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+    executor: Executor?,
     callback: AuthPromptCallback
 ): AuthPrompt {
     val prompt = buildClass2BiometricOrCredentialAuthPrompt(
@@ -240,3 +224,19 @@
         prompt.startAuthentication(host, executor, callback)
     }
 }
+
+/**
+ * Creates a [Class2BiometricOrCredentialAuthPrompt] with the given parameters.
+ */
+private fun buildClass2BiometricOrCredentialAuthPrompt(
+    title: CharSequence,
+    subtitle: CharSequence? = null,
+    description: CharSequence? = null,
+    confirmationRequired: Boolean = true,
+): Class2BiometricOrCredentialAuthPrompt = Class2BiometricOrCredentialAuthPrompt.Builder(title)
+    .apply {
+        subtitle?.let { setSubtitle(it) }
+        description?.let { setDescription(it) }
+        setConfirmationRequired(confirmationRequired)
+    }
+    .build()
diff --git a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricAuthExtensions.kt b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricAuthExtensions.kt
index 0e24d45..f5d0ee3 100755
--- a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricAuthExtensions.kt
+++ b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricAuthExtensions.kt
@@ -207,23 +207,6 @@
 }
 
 /**
- * Creates a [Class3BiometricAuthPrompt] with the given parameters.
- */
-private fun buildClass3BiometricAuthPrompt(
-    title: CharSequence,
-    negativeButtonText: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-): Class3BiometricAuthPrompt = Class3BiometricAuthPrompt.Builder(title, negativeButtonText)
-    .apply {
-        subtitle?.let { setSubtitle(it) }
-        description?.let { setDescription(it) }
-        setConfirmationRequired(confirmationRequired)
-    }
-    .build()
-
-/**
  * Creates a [Class3BiometricAuthPrompt] with the given parameters and starts authentication.
  */
 private fun startClass3BiometricAuthenticationInternal(
@@ -231,10 +214,10 @@
     crypto: CryptoObject?,
     title: CharSequence,
     negativeButtonText: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-    executor: Executor? = null,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+    executor: Executor?,
     callback: AuthPromptCallback
 ): AuthPrompt {
     val prompt = buildClass3BiometricAuthPrompt(
@@ -251,3 +234,20 @@
         prompt.startAuthentication(host, crypto, executor, callback)
     }
 }
+
+/**
+ * Creates a [Class3BiometricAuthPrompt] with the given parameters.
+ */
+private fun buildClass3BiometricAuthPrompt(
+    title: CharSequence,
+    negativeButtonText: CharSequence,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+): Class3BiometricAuthPrompt = Class3BiometricAuthPrompt.Builder(title, negativeButtonText)
+    .apply {
+        subtitle?.let { setSubtitle(it) }
+        description?.let { setDescription(it) }
+        setConfirmationRequired(confirmationRequired)
+    }
+    .build()
diff --git a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricOrCredentialAuthExtensions.kt b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricOrCredentialAuthExtensions.kt
index ec27ec6..e26acf4 100755
--- a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricOrCredentialAuthExtensions.kt
+++ b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/Class3BiometricOrCredentialAuthExtensions.kt
@@ -209,22 +209,6 @@
 }
 
 /**
- * Creates a [Class3BiometricOrCredentialAuthPrompt] with the given parameters.
- */
-private fun buildClass3BiometricOrCredentialAuthPrompt(
-    title: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-): Class3BiometricOrCredentialAuthPrompt = Class3BiometricOrCredentialAuthPrompt.Builder(title)
-    .apply {
-        subtitle?.let { setSubtitle(it) }
-        description?.let { setDescription(it) }
-        setConfirmationRequired(confirmationRequired)
-    }
-    .build()
-
-/**
  * Creates a [Class3BiometricOrCredentialAuthPrompt] with the given parameters and starts
  * authentication.
  */
@@ -233,10 +217,10 @@
     host: AuthPromptHost,
     crypto: CryptoObject?,
     title: CharSequence,
-    subtitle: CharSequence? = null,
-    description: CharSequence? = null,
-    confirmationRequired: Boolean = true,
-    executor: Executor? = null,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+    executor: Executor?,
     callback: AuthPromptCallback
 ): AuthPrompt {
     val prompt = buildClass3BiometricOrCredentialAuthPrompt(
@@ -252,3 +236,20 @@
         prompt.startAuthentication(host, crypto, executor, callback)
     }
 }
+
+/**
+ * Creates a [Class3BiometricOrCredentialAuthPrompt] with the given parameters.
+ */
+@RequiresApi(Build.VERSION_CODES.R)
+private fun buildClass3BiometricOrCredentialAuthPrompt(
+    title: CharSequence,
+    subtitle: CharSequence?,
+    description: CharSequence?,
+    confirmationRequired: Boolean,
+): Class3BiometricOrCredentialAuthPrompt = Class3BiometricOrCredentialAuthPrompt.Builder(title)
+    .apply {
+        subtitle?.let { setSubtitle(it) }
+        description?.let { setDescription(it) }
+        setConfirmationRequired(confirmationRequired)
+    }
+    .build()
diff --git a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/CredentialAuthExtensions.kt b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/CredentialAuthExtensions.kt
index ca775f7..fe98720 100755
--- a/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/CredentialAuthExtensions.kt
+++ b/biometric/biometric-ktx/src/main/java/androidx/biometric/auth/CredentialAuthExtensions.kt
@@ -18,11 +18,52 @@
 import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.biometric.BiometricPrompt
+import androidx.biometric.BiometricPrompt.AuthenticationResult
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
+import kotlinx.coroutines.suspendCancellableCoroutine
 import java.util.concurrent.Executor
 
 /**
+ * Shows an authentication prompt to the user.
+ *
+ * @param host A wrapper for the component that will host the prompt.
+ * @param crypto A cryptographic object to be associated with this authentication.
+ *
+ * @return [AuthenticationResult] for a successful authentication.
+ *
+ * @throws AuthPromptErrorException  when an unrecoverable error has been encountered and
+ * authentication has stopped.
+ * @throws AuthPromptFailureException when an authentication attempt by the user has been rejected.
+ *
+ * @see CredentialAuthPrompt.authenticate(
+ *     AuthPromptHost host,
+ *     BiometricPrompt.CryptoObject,
+ *     AuthPromptCallback
+ * )
+ *
+ * @sample androidx.biometric.samples.auth.credentialAuth
+ */
+@RequiresApi(Build.VERSION_CODES.R)
+public suspend fun CredentialAuthPrompt.authenticate(
+    host: AuthPromptHost,
+    crypto: BiometricPrompt.CryptoObject?,
+): AuthenticationResult {
+    return suspendCancellableCoroutine { continuation ->
+        val authPrompt = startAuthentication(
+            host,
+            crypto,
+            Runnable::run,
+            CoroutineAuthPromptCallback(continuation)
+        )
+
+        continuation.invokeOnCancellation {
+            authPrompt.cancelAuthentication()
+        }
+    }
+}
+
+/**
  * Prompts the user to authenticate with the screen lock credential (i.e. PIN, pattern, or password)
  * for the device.
  *
@@ -60,6 +101,31 @@
  * @param crypto A cryptographic object to be associated with this authentication.
  * @param title The title to be displayed on the prompt.
  * @param description An optional description to be displayed on the prompt.
+ * @return [AuthenticationResult] for a successful authentication.
+ *
+ * @throws AuthPromptErrorException  when an unrecoverable error has been encountered and
+ * authentication has stopped.
+ * @throws AuthPromptFailureException when an authentication attempt by the user has been rejected.
+ *
+ * @see CredentialAuthPrompt
+ */
+@RequiresApi(Build.VERSION_CODES.R)
+public suspend fun FragmentActivity.authenticateWithCredentials(
+    crypto: BiometricPrompt.CryptoObject?,
+    title: CharSequence,
+    description: CharSequence? = null
+): AuthenticationResult {
+    val authPrompt = buildCredentialAuthPrompt(title, description)
+    return authPrompt.authenticate(AuthPromptHost(this), crypto)
+}
+
+/**
+ * Prompts the user to authenticate with the screen lock credential (i.e. PIN, pattern, or password)
+ * for the device.
+ *
+ * @param crypto A cryptographic object to be associated with this authentication.
+ * @param title The title to be displayed on the prompt.
+ * @param description An optional description to be displayed on the prompt.
  * @param executor An executor for [callback] methods. If `null`, these will run on the main thread.
  * @param callback The object that will receive and process authentication events.
  * @return An [AuthPrompt] handle to the shown prompt.
@@ -85,6 +151,31 @@
 }
 
 /**
+ * Prompts the user to authenticate with the screen lock credential (i.e. PIN, pattern, or password)
+ * for the device.
+ *
+ * @param crypto A cryptographic object to be associated with this authentication.
+ * @param title The title to be displayed on the prompt.
+ * @param description An optional description to be displayed on the prompt.
+ * @return [AuthenticationResult] for a successful authentication.
+ *
+ * @throws AuthPromptErrorException  when an unrecoverable error has been encountered and
+ * authentication has stopped.
+ * @throws AuthPromptFailureException when an authentication attempt by the user has been rejected.
+ *
+ * @see CredentialAuthPrompt
+ */
+@RequiresApi(Build.VERSION_CODES.R)
+public suspend fun Fragment.authenticateWithCredentials(
+    crypto: BiometricPrompt.CryptoObject?,
+    title: CharSequence,
+    description: CharSequence? = null
+): AuthenticationResult {
+    val authPrompt = buildCredentialAuthPrompt(title, description)
+    return authPrompt.authenticate(AuthPromptHost(this), crypto)
+}
+
+/**
  * Creates a [CredentialAuthPrompt] with the given parameters and starts authentication.
  */
 @RequiresApi(Build.VERSION_CODES.R)
@@ -92,17 +183,25 @@
     host: AuthPromptHost,
     crypto: BiometricPrompt.CryptoObject?,
     title: CharSequence,
-    description: CharSequence? = null,
-    executor: Executor? = null,
+    description: CharSequence?,
+    executor: Executor?,
     callback: AuthPromptCallback
 ): AuthPrompt {
-    val prompt = CredentialAuthPrompt.Builder(title).apply {
-        description?.let { setDescription(it) }
-    }.build()
-
+    val prompt = buildCredentialAuthPrompt(title, description)
     return if (executor == null) {
         prompt.startAuthentication(host, crypto, callback)
     } else {
         prompt.startAuthentication(host, crypto, executor, callback)
     }
-}
\ No newline at end of file
+}
+
+/**
+ * Creates a [CredentialAuthPrompt] with the given parameters.
+ */
+@RequiresApi(Build.VERSION_CODES.R)
+private fun buildCredentialAuthPrompt(
+    title: CharSequence,
+    description: CharSequence?
+): CredentialAuthPrompt = CredentialAuthPrompt.Builder(title)
+    .apply { description?.let { setDescription(it) } }
+    .build()
\ No newline at end of file
diff --git a/biometric/biometric/src/main/res/values-af/strings.xml b/biometric/biometric/src/main/res/values-af/strings.xml
index aeb3cec..54ec3ec 100644
--- a/biometric/biometric/src/main/res/values-af/strings.xml
+++ b/biometric/biometric/src/main/res/values-af/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Gebruik wagwoord"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Geen PIN, patroon of wagwoord is gestel nie."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Hierdie toestel ondersteun nie PIN, patroon of wagwoord nie."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Vingerafdrukikoon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-am/strings.xml b/biometric/biometric/src/main/res/values-am/strings.xml
index 9091046..445bbf9 100644
--- a/biometric/biometric/src/main/res/values-am/strings.xml
+++ b/biometric/biometric/src/main/res/values-am/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"የይለፍ ቃል ተጠቀም"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ምንም ፒን፣ ሥርዓተ ጥለት ወይም የይለፍ ቃል አልተቀናበረም።"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ይህ መሣሪያ ፒን፣ ስርዓተ-ጥለት ወይም የይለፍ ቃል አይደግፍም።"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"የጣት አሻራ አዶ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ar/strings.xml b/biometric/biometric/src/main/res/values-ar/strings.xml
index 1ccd05f..fd3f0fc 100644
--- a/biometric/biometric/src/main/res/values-ar/strings.xml
+++ b/biometric/biometric/src/main/res/values-ar/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"استخدام كلمة المرور"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"لم يتم ضبط رقم تعريف شخصي أو نقش أو كلمة مرور."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"هذا الجهاز لا يتيح استخدام رقم تعريف شخصي أو نقش أو كلمة مرور."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"رمز بصمة الإصبع"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-as/strings.xml b/biometric/biometric/src/main/res/values-as/strings.xml
index 5bb8e9f..7ffcf66f 100644
--- a/biometric/biometric/src/main/res/values-as/strings.xml
+++ b/biometric/biometric/src/main/res/values-as/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"কোনো পিন, আৰ্হি অথবা পাছৱৰ্ড ছেট কৰা হোৱা নাই।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"এই ডিভাইচটোত পিন, আৰ্হি অথবা পাছৱৰ্ড ব্যৱহাৰ কৰিব নোৱাৰি।"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ফিংগাৰপ্ৰিণ্টৰ চিহ্ন"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-az/strings.xml b/biometric/biometric/src/main/res/values-az/strings.xml
index f8d8bc6..73bcb61 100644
--- a/biometric/biometric/src/main/res/values-az/strings.xml
+++ b/biometric/biometric/src/main/res/values-az/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Parol istifadə edin"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, model və ya parol ayarlanmayıb."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Bu cihaz PIN, model və ya parolu dəstəkləmir."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Barmaq izi ikonası"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml b/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml
index 0eba41c..e8b2961 100644
--- a/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml
+++ b/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Koristite lozinku"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Niste podesili ni PIN, ni šablon, ni lozinku."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ovaj uređaj ne podržava PIN, šablon ili lozinku."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona otiska prsta"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-be/strings.xml b/biometric/biometric/src/main/res/values-be/strings.xml
index a321556..de8ff2b 100644
--- a/biometric/biometric/src/main/res/values-be/strings.xml
+++ b/biometric/biometric/src/main/res/values-be/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Выкарыстаць пароль"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не заданы PIN-код, узор разблакіроўкі ці пароль."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Гэта прылада не падтрымлівае PIN-код, узор разблакіроўкі ці пароль."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Значок адбітка пальца"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-bg/strings.xml b/biometric/biometric/src/main/res/values-bg/strings.xml
index f456913..7d65941 100644
--- a/biometric/biometric/src/main/res/values-bg/strings.xml
+++ b/biometric/biometric/src/main/res/values-bg/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Използване на парола"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Няма зададен ПИН код, фигура или парола."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Устройството не поддържа ПИН код, фигура или парола."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Икона за отпечатък"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-bn/strings.xml b/biometric/biometric/src/main/res/values-bn/strings.xml
index fe2df274..f5bcf6a 100644
--- a/biometric/biometric/src/main/res/values-bn/strings.xml
+++ b/biometric/biometric/src/main/res/values-bn/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"পাসওয়ার্ড ব্যবহার করুন"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"পিন, প্যাটার্ন অথবা পাসওয়ার্ড সেট করা নেই।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"এই ডিভাইসে পিন, প্যাটার্ন বা পাসওয়ার্ড ব্যবহার করা যাবে না।"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ফিঙ্গারপ্রিন্ট আইকন"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-bs/strings.xml b/biometric/biometric/src/main/res/values-bs/strings.xml
index 1c75406..c03ae0e 100644
--- a/biometric/biometric/src/main/res/values-bs/strings.xml
+++ b/biometric/biometric/src/main/res/values-bs/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Koristi lozinku"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nije postavljen PIN, uzorak niti lozinka."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ovaj uređaj ne podržava PIN, uzorak ili lozinku."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona za otisak prsta"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ca/strings.xml b/biometric/biometric/src/main/res/values-ca/strings.xml
index 5e5cc59..bc8a6ab 100644
--- a/biometric/biometric/src/main/res/values-ca/strings.xml
+++ b/biometric/biometric/src/main/res/values-ca/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Utilitza la contrasenya"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No s\'ha definit cap PIN, patró o contrasenya."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Aquest dispositiu no admet utilitzar cap PIN, patró ni contrasenya."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icona d\'empremta digital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-cs/strings.xml b/biometric/biometric/src/main/res/values-cs/strings.xml
index c07c033..e8ec9c1 100644
--- a/biometric/biometric/src/main/res/values-cs/strings.xml
+++ b/biometric/biometric/src/main/res/values-cs/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Použít heslo"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Není nastaven žádný PIN, gesto ani heslo."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Toto zařízení nepodporuje kódy PIN, hesla ani gesta."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona otisku prstů"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-da/strings.xml b/biometric/biometric/src/main/res/values-da/strings.xml
index aa07374..5dab45b 100644
--- a/biometric/biometric/src/main/res/values-da/strings.xml
+++ b/biometric/biometric/src/main/res/values-da/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Brug adgangskode"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Der er ikke angivet pinkode, mønster eller adgangskode."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Denne enhed understøtter ikke pinkode, mønster eller adgangskode."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon for fingeraftryk"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-de/strings.xml b/biometric/biometric/src/main/res/values-de/strings.xml
index 8b4b2a5..9064a21 100644
--- a/biometric/biometric/src/main/res/values-de/strings.xml
+++ b/biometric/biometric/src/main/res/values-de/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Passwort nutzen"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Keine PIN, kein Muster und kein Passwort festgelegt."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dieses Gerät kann nicht mit einer PIN, einem Muster oder einem Passwort gesperrt bzw. entsperrt werden."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerabdruck-Symbol"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-el/strings.xml b/biometric/biometric/src/main/res/values-el/strings.xml
index 3404f0a..fe34039 100644
--- a/biometric/biometric/src/main/res/values-el/strings.xml
+++ b/biometric/biometric/src/main/res/values-el/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Χρήση κωδικού πρόσβασης"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Δεν έχει οριστεί PIN, μοτίβο ή κωδικός πρόσβασης."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Αυτή η συσκευή δεν υποστηρίζει PIN, μοτίβο ή κωδικό πρόσβασης."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rAU/strings.xml b/biometric/biometric/src/main/res/values-en-rAU/strings.xml
index 0360ad8..2941203 100644
--- a/biometric/biometric/src/main/res/values-en-rAU/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rAU/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Use password"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rCA/strings.xml b/biometric/biometric/src/main/res/values-en-rCA/strings.xml
index 0360ad8..2941203 100644
--- a/biometric/biometric/src/main/res/values-en-rCA/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rCA/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Use password"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rGB/strings.xml b/biometric/biometric/src/main/res/values-en-rGB/strings.xml
index 0360ad8..2941203 100644
--- a/biometric/biometric/src/main/res/values-en-rGB/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rGB/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Use password"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rIN/strings.xml b/biometric/biometric/src/main/res/values-en-rIN/strings.xml
index 0360ad8..2941203 100644
--- a/biometric/biometric/src/main/res/values-en-rIN/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rIN/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Use password"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rXC/strings.xml b/biometric/biometric/src/main/res/values-en-rXC/strings.xml
index 1b61e95..37a588c 100644
--- a/biometric/biometric/src/main/res/values-en-rXC/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rXC/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎Use password‎‏‎‎‏‎"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎No PIN, pattern, or password set.‎‏‎‎‏‎"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎This device does not support PIN, pattern, or password.‎‏‎‎‏‎"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎Fingerprint icon‎‏‎‎‏‎"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-es-rUS/strings.xml b/biometric/biometric/src/main/res/values-es-rUS/strings.xml
index 7d59230..4071fc9 100644
--- a/biometric/biometric/src/main/res/values-es-rUS/strings.xml
+++ b/biometric/biometric/src/main/res/values-es-rUS/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Usar contraseña"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No se estableció ningún PIN, patrón ni contraseña."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo no admite PIN, patrón ni contraseña."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícono de huella digital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-es/strings.xml b/biometric/biometric/src/main/res/values-es/strings.xml
index 4855577..45a35ea 100644
--- a/biometric/biometric/src/main/res/values-es/strings.xml
+++ b/biometric/biometric/src/main/res/values-es/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Usar contraseña"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No se ha definido el PIN, el patrón o la contraseña."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo no admite PINs, patrones ni contraseñas."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icono de huella digital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-et/strings.xml b/biometric/biometric/src/main/res/values-et/strings.xml
index e89e61a..966be71 100644
--- a/biometric/biometric/src/main/res/values-et/strings.xml
+++ b/biometric/biometric/src/main/res/values-et/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Kasuta parooli"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-koodi, mustrit ega parooli pole määratud."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"See seade ei toeta PIN-koodi, mustrit ega parooli."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Sõrmejälje ikoon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-eu/strings.xml b/biometric/biometric/src/main/res/values-eu/strings.xml
index 9763be0..36d6be6 100644
--- a/biometric/biometric/src/main/res/values-eu/strings.xml
+++ b/biometric/biometric/src/main/res/values-eu/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Erabili pasahitza"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ez da ezarri PIN koderik, eredurik edo pasahitzik."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Gailuak ez du onartzen PIN kode, eredu edo pasahitzik."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Hatz-markaren ikonoa"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fa/strings.xml b/biometric/biometric/src/main/res/values-fa/strings.xml
index 19d7df7..c1f485e 100644
--- a/biometric/biometric/src/main/res/values-fa/strings.xml
+++ b/biometric/biometric/src/main/res/values-fa/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"استفاده از گذرواژه"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"پین، الگو، یا گذرواژه‌ای تنظیم نشده است."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"این دستگاه از پین، الگو، یا گذرواژه پشتیبانی نمی‌کند."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"نماد اثر انگشت"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fi/strings.xml b/biometric/biometric/src/main/res/values-fi/strings.xml
index bd9b84b..2cf51ce 100644
--- a/biometric/biometric/src/main/res/values-fi/strings.xml
+++ b/biometric/biometric/src/main/res/values-fi/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Käytä salasanaa"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-koodia, kuviota tai salasanaa ei ole lisätty."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Tämä laite ei tue PIN-koodia, kuviota eikä salasanaa."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Sormenjälkikuvake"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fr-rCA/strings.xml b/biometric/biometric/src/main/res/values-fr-rCA/strings.xml
index 4c41421..a4c0691 100644
--- a/biometric/biometric/src/main/res/values-fr-rCA/strings.xml
+++ b/biometric/biometric/src/main/res/values-fr-rCA/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Utiliser le mot de passe"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Aucun NIP, schéma ni mot de passe défini"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Cet appareil ne prend pas en charge les NIP, les schémas ni les mots de passe."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icône d\'empreinte digitale"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fr/strings.xml b/biometric/biometric/src/main/res/values-fr/strings.xml
index add4cca..90fc5a8 100644
--- a/biometric/biometric/src/main/res/values-fr/strings.xml
+++ b/biometric/biometric/src/main/res/values-fr/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Utiliser un mot de passe"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Aucun code, schéma ni mot de passe n\'est défini."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Cet appareil n\'est pas compatible avec les codes, schémas ni mots de passe."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icône d\'empreinte digitale"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-gl/strings.xml b/biometric/biometric/src/main/res/values-gl/strings.xml
index cc61b9c..9ae8069 100644
--- a/biometric/biometric/src/main/res/values-gl/strings.xml
+++ b/biometric/biometric/src/main/res/values-gl/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Usar contrasinal"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Non se estableceu ningún PIN, padrón nin contrasinal."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo non permite usar un PIN, padrón ou contrasinal."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icona de impresión dixital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-gu/strings.xml b/biometric/biometric/src/main/res/values-gu/strings.xml
index 1352a27..4ee936a 100644
--- a/biometric/biometric/src/main/res/values-gu/strings.xml
+++ b/biometric/biometric/src/main/res/values-gu/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"પાસવર્ડનો ઉપયોગ કરો"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"કોઈ પિન, પૅટર્ન અથવા પાસવર્ડ સેટ કરેલો નથી."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"આ ડિવાઇસ પિન, પૅટર્ન અથવા પાસવર્ડને સપોર્ટ કરતું નથી."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ફિંગરપ્રિન્ટ આઇકન"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hi/strings.xml b/biometric/biometric/src/main/res/values-hi/strings.xml
index dacd79b..3fcc142 100644
--- a/biometric/biometric/src/main/res/values-hi/strings.xml
+++ b/biometric/biometric/src/main/res/values-hi/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"पासवर्ड का इस्तेमाल करें"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"पिन, पैटर्न या पासवर्ड सेट नहीं है."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"इस डिवाइस को पिन, पैटर्न या पासवर्ड की मदद से लॉक/अनलॉक नहीं किया जा सकता."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"फ़िंगरप्रिंट आइकॉन"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hr/strings.xml b/biometric/biometric/src/main/res/values-hr/strings.xml
index 97bb511..ebd49c0 100644
--- a/biometric/biometric/src/main/res/values-hr/strings.xml
+++ b/biometric/biometric/src/main/res/values-hr/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Koristite zaporku"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nisu postavljeni PIN, uzorak ni zaporka."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ovaj uređaj ne podržava PIN, uzorak ili zaporku."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona otiska prsta"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hu/strings.xml b/biometric/biometric/src/main/res/values-hu/strings.xml
index 01a5b87..89ef351 100644
--- a/biometric/biometric/src/main/res/values-hu/strings.xml
+++ b/biometric/biometric/src/main/res/values-hu/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Jelszó használata"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nem állított be PIN-kódot, mintát vagy jelszót."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ez az eszköz nem támogatja PIN-kód, minta vagy jelszó használatát."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ujjlenyomat ikon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hy/strings.xml b/biometric/biometric/src/main/res/values-hy/strings.xml
index 3281ed8..fde0228 100644
--- a/biometric/biometric/src/main/res/values-hy/strings.xml
+++ b/biometric/biometric/src/main/res/values-hy/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Օգտագործել գաղտնաբառ"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ավելացրեք PIN կոդ, նախշ կամ գաղտնաբառ։"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Այս սարքը չի աջակցում PIN կոդ, նախշ կամ գաղտնաբառ։"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Մատնահետքի պատկերակ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-in/strings.xml b/biometric/biometric/src/main/res/values-in/strings.xml
index ac8030f..ef7272c 100644
--- a/biometric/biometric/src/main/res/values-in/strings.xml
+++ b/biometric/biometric/src/main/res/values-in/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Gunakan sandi"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Tidak ada PIN, pola, atau sandi yang disetel."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Perangkat ini tidak mendukung PIN, pola, atau sandi."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon sidik jari"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-is/strings.xml b/biometric/biometric/src/main/res/values-is/strings.xml
index 48e1c85..6354a23 100644
--- a/biometric/biometric/src/main/res/values-is/strings.xml
+++ b/biometric/biometric/src/main/res/values-is/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Nota aðgangsorð"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ekkert PIN-númer, mynstur eða aðgangsorð stillt."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Þetta tæki styður ekki PIN-númer, mynstur eða aðgangsorð."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingrafaratákn"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-it/strings.xml b/biometric/biometric/src/main/res/values-it/strings.xml
index 4cc878e..6465ef5 100644
--- a/biometric/biometric/src/main/res/values-it/strings.xml
+++ b/biometric/biometric/src/main/res/values-it/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Utilizza password"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Non hai impostato PIN, sequenza o password."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Questo dispositivo non supporta il PIN, la sequenza o la password."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icona dell\'impronta"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-iw/strings.xml b/biometric/biometric/src/main/res/values-iw/strings.xml
index 3fa7514..b8cc6ea 100644
--- a/biometric/biometric/src/main/res/values-iw/strings.xml
+++ b/biometric/biometric/src/main/res/values-iw/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"שימוש בסיסמה"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"עוד לא הוגדרו קוד אימות, קו ביטול נעילה או סיסמה."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"המכשיר הזה לא תומך בקוד אימות, בקו ביטול נעילה או בסיסמה."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"סמל טביעת אצבע"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ja/strings.xml b/biometric/biometric/src/main/res/values-ja/strings.xml
index 92f4b768..a7ff803 100644
--- a/biometric/biometric/src/main/res/values-ja/strings.xml
+++ b/biometric/biometric/src/main/res/values-ja/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"パスワードを使用"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN、パターン、パスワードが設定されていません。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"このデバイスは PIN、パターン、パスワードをサポートしていません。"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指紋アイコン"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ka/strings.xml b/biometric/biometric/src/main/res/values-ka/strings.xml
index 55ca6c5..aaa08e1 100644
--- a/biometric/biometric/src/main/res/values-ka/strings.xml
+++ b/biometric/biometric/src/main/res/values-ka/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"პაროლის გამოყენება"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-კოდი, განმბლოკავი ნიმუში ან პაროლი დაყენებული არ არის."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ამ მოწყობილობას არ აქვს PIN-კოდის, ნიმუშის ან პაროლის მხარდაჭერა."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"თითის ანაბეჭდის ხატულა"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-kk/strings.xml b/biometric/biometric/src/main/res/values-kk/strings.xml
index c896507..8e698cb8 100644
--- a/biometric/biometric/src/main/res/values-kk/strings.xml
+++ b/biometric/biometric/src/main/res/values-kk/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Құпия сөзді пайдалану"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ешқандай PIN коды, өрнек немесе құпия сөз орнатылмаған."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Бұл құрылғы PIN кодын, өрнекті не құпия сөзді қолдамайды."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Саусақ ізі белгішесі"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-km/strings.xml b/biometric/biometric/src/main/res/values-km/strings.xml
index 961172c..6445f20 100644
--- a/biometric/biometric/src/main/res/values-km/strings.xml
+++ b/biometric/biometric/src/main/res/values-km/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"ប្រើពាក្យសម្ងាត់"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"គ្មាន​ការកំណត់​កូដ PIN លំនាំ ឬពាក្យសម្ងាត់​ទេ។"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ឧបករណ៍នេះ​មិនអាចប្រើកូដ PIN លំនាំ ឬពាក្យ​សម្ងាត់បានទេ។"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"រូបស្នាមម្រាមដៃ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-kn/strings.xml b/biometric/biometric/src/main/res/values-kn/strings.xml
index ef99e60..76cfa56 100644
--- a/biometric/biometric/src/main/res/values-kn/strings.xml
+++ b/biometric/biometric/src/main/res/values-kn/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"ಪಾಸ್‌ವರ್ಡ್ ಬಳಸಿ"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ಯಾವುದೇ ಪಿನ್, ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಹೊಂದಿಸಿಲ್ಲ."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ಈ ಸಾಧನವು ಪಿನ್, ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ko/strings.xml b/biometric/biometric/src/main/res/values-ko/strings.xml
index 5d48124..a41b145 100644
--- a/biometric/biometric/src/main/res/values-ko/strings.xml
+++ b/biometric/biometric/src/main/res/values-ko/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"비밀번호 사용"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, 패턴, 비밀번호가 설정되지 않았습니다."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"PIN, 패턴, 비밀번호를 지원하지 않는 기기입니다."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"지문 아이콘"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ky/strings.xml b/biometric/biometric/src/main/res/values-ky/strings.xml
index 4e642ce..5cb22f0 100644
--- a/biometric/biometric/src/main/res/values-ky/strings.xml
+++ b/biometric/biometric/src/main/res/values-ky/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Сырсөз колдонуу"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN код, графикалык ачкыч же сырсөз коюлган жок."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Бул түзмөктө PIN кодду, графикалык ачкычты же сырсөздү колдонууга болбойт."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Манжа изинин сүрөтчөсү"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-lo/strings.xml b/biometric/biometric/src/main/res/values-lo/strings.xml
index a0ef97e..969f107 100644
--- a/biometric/biometric/src/main/res/values-lo/strings.xml
+++ b/biometric/biometric/src/main/res/values-lo/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"ໃຊ້ລະຫັດຜ່ານ"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ບໍ່ໄດ້ຕັ້ງ PIN, ຮູບແບບປົດລັອກ ຫຼື ລະຫັດຜ່ານ."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບ PIN, ຮູບແບບ ຫຼື ລະຫັດຜ່ານ."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ໄອຄອນລາຍນິ້ວມື"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-lt/strings.xml b/biometric/biometric/src/main/res/values-lt/strings.xml
index 362c7ff..bde9932 100644
--- a/biometric/biometric/src/main/res/values-lt/strings.xml
+++ b/biometric/biometric/src/main/res/values-lt/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Naudoti slaptažodį"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenustatytas PIN kodas, atrakinimo piešinys arba slaptažodis."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Šis įrenginys nepalaiko PIN kodo, šablono ar slaptažodžio."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Kontrolinio kodo piktograma"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-lv/strings.xml b/biometric/biometric/src/main/res/values-lv/strings.xml
index 2cf7900..659166e 100644
--- a/biometric/biometric/src/main/res/values-lv/strings.xml
+++ b/biometric/biometric/src/main/res/values-lv/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Izmantot paroli"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nav iestatīts PIN, kombinācija vai parole."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Šajā ierīcē netiek atbalstīta autentifikācija ar PIN, kombināciju vai paroli."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Pirksta nospieduma ikona"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-mk/strings.xml b/biometric/biometric/src/main/res/values-mk/strings.xml
index bdc85bd..ebdbf0b 100644
--- a/biometric/biometric/src/main/res/values-mk/strings.xml
+++ b/biometric/biometric/src/main/res/values-mk/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Употребете ја лозинката"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не е поставен PIN, шема или лозинка."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Уредов не поддржува PIN, шема или лозинка."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Икона за отпечаток"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ml/strings.xml b/biometric/biometric/src/main/res/values-ml/strings.xml
index 9c2e145..dbfd039 100644
--- a/biometric/biometric/src/main/res/values-ml/strings.xml
+++ b/biometric/biometric/src/main/res/values-ml/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"പാസ്‌വേഡ് ഉപയോഗിക്കുക"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"പിൻ, പാറ്റേൺ, അല്ലെങ്കിൽ പാസ്‍വേഡ് ഇവയൊന്നും സജ്ജീകരിച്ചിട്ടില്ല."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"പിൻ, പാറ്റേൺ, പാസ്‌വേഡ് എന്നിവ ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ഫിംഗർപ്രിന്റ് ഐക്കൺ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-mn/strings.xml b/biometric/biometric/src/main/res/values-mn/strings.xml
index 83f889c..4ad08b0 100644
--- a/biometric/biometric/src/main/res/values-mn/strings.xml
+++ b/biometric/biometric/src/main/res/values-mn/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Нууц үг ашиглах"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Тохируулсан ПИН, хээ эсвэл нууц үг алга."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Энэ төхөөрөмж ПИН, хээ эсвэл нууц үгийг дэмждэггүй."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Хурууны хээний дүрс тэмдэг"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-mr/strings.xml b/biometric/biometric/src/main/res/values-mr/strings.xml
index 8cef177..ec7acd6 100644
--- a/biometric/biometric/src/main/res/values-mr/strings.xml
+++ b/biometric/biometric/src/main/res/values-mr/strings.xml
@@ -29,4 +29,6 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"पासवर्ड वापरा"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"कोणताही पिन, पॅटर्न किंवा पासवर्ड सेट केलेला नाही."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"हे डिव्हाइस पिन, पॅटर्न किंवा पासवर्ड यांना सपोर्ट करत नाही."</string>
+    <!-- no translation found for fingerprint_dialog_icon_description (5462024216548165325) -->
+    <skip />
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ms/strings.xml b/biometric/biometric/src/main/res/values-ms/strings.xml
index 1c63926..da98421 100644
--- a/biometric/biometric/src/main/res/values-ms/strings.xml
+++ b/biometric/biometric/src/main/res/values-ms/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Guna kata laluan"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, corak atau kata laluan tidak ditetapkan."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Peranti ini tidak menyokong PIN, corak atau kata laluan."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon cap jari"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-my/strings.xml b/biometric/biometric/src/main/res/values-my/strings.xml
index c4b318e..6495635 100644
--- a/biometric/biometric/src/main/res/values-my/strings.xml
+++ b/biometric/biometric/src/main/res/values-my/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"စကားဝှက်သုံးရန်"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ပင်နံပါတ်၊ လော့ခ်ပုံစံ သို့မဟုတ် စကားဝှက် သတ်မှတ်မထားပါ။"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ဤစက်သည် ပင်နံပါတ်၊ ပုံစံ သို့မဟုတ် စကားဝှက်ကို မပံ့ပိုးပါ။"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"လက်ဗွေ သင်္ကေတ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-nb/strings.xml b/biometric/biometric/src/main/res/values-nb/strings.xml
index 5d286aeb..3b8a7bc 100644
--- a/biometric/biometric/src/main/res/values-nb/strings.xml
+++ b/biometric/biometric/src/main/res/values-nb/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Bruk passord"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-kode, mønster eller passord er ikke angitt."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Denne enheten støtter ikke PIN-kode, mønster eller passord."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon for fingeravtrykk"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ne/strings.xml b/biometric/biometric/src/main/res/values-ne/strings.xml
index 8674880..46c454c 100644
--- a/biometric/biometric/src/main/res/values-ne/strings.xml
+++ b/biometric/biometric/src/main/res/values-ne/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"पासवर्ड प्रयोग गर्नुहोस्"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"कुनै पनि PIN, ढाँचा वा पासवर्ड सेट गरिएको छैन।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"यस यन्त्रमा PIN, ढाँचा वा पासवर्ड प्रयोग गर्न मिल्दैन।"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"फिंगरप्रिन्ट जनाउने आइकन"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-nl/strings.xml b/biometric/biometric/src/main/res/values-nl/strings.xml
index 1efb5f0..7f39eef 100644
--- a/biometric/biometric/src/main/res/values-nl/strings.xml
+++ b/biometric/biometric/src/main/res/values-nl/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Wachtwoord gebruiken"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Geen pincode, patroon of wachtwoord ingesteld."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dit apparaat ondersteunt geen pincode, patroon of wachtwoord."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Vingerafdrukicoon"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-or/strings.xml b/biometric/biometric/src/main/res/values-or/strings.xml
index 494b1f5..a64e17f 100644
--- a/biometric/biometric/src/main/res/values-or/strings.xml
+++ b/biometric/biometric/src/main/res/values-or/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"ପାସ୍‌ୱାର୍ଡ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"କୌଣସି PIN, ପାଟର୍ନ ବା ପାସୱାର୍ଡ ସେଟ୍ ହୋଇନାହିଁ।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ଏହି ଡିଭାଇସ୍ PIN, ପାଟର୍ନ କିମ୍ବା ପାସୱାର୍ଡକୁ ସମର୍ଥନ କରେ ନାହିଁ।"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ଟିପଚିହ୍ନ ଆଇକନ୍"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pa/strings.xml b/biometric/biometric/src/main/res/values-pa/strings.xml
index 341a0f7..69afa20 100644
--- a/biometric/biometric/src/main/res/values-pa/strings.xml
+++ b/biometric/biometric/src/main/res/values-pa/strings.xml
@@ -29,4 +29,6 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"ਪਾਸਵਰਡ ਵਰਤੋ"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ਕੋਈ ਪਿੰਨ, ਪੈਟਰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ਇਹ ਡੀਵਾਈਸ ਪਿੰਨ, ਪੈਟਰਨ ਜਾਂ ਪਾਸਵਰਡ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ।"</string>
+    <!-- no translation found for fingerprint_dialog_icon_description (5462024216548165325) -->
+    <skip />
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pl/strings.xml b/biometric/biometric/src/main/res/values-pl/strings.xml
index dcb7a5a..531d5bd 100644
--- a/biometric/biometric/src/main/res/values-pl/strings.xml
+++ b/biometric/biometric/src/main/res/values-pl/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Użyj hasła"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nie ustawiono kodu PIN, wzoru ani hasła."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"To urządzenie nie obsługuje kodu PIN, wzoru ani hasła."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona odcisku palca"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pt-rBR/strings.xml b/biometric/biometric/src/main/res/values-pt-rBR/strings.xml
index 0cdda39..d280c96 100644
--- a/biometric/biometric/src/main/res/values-pt-rBR/strings.xml
+++ b/biometric/biometric/src/main/res/values-pt-rBR/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Usar senha"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenhum PIN, padrão ou senha configurado."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo não é compatível com PIN, padrão ou senha."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícone de impressão digital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pt-rPT/strings.xml b/biometric/biometric/src/main/res/values-pt-rPT/strings.xml
index bf8cbd4..2ffaa41 100644
--- a/biometric/biometric/src/main/res/values-pt-rPT/strings.xml
+++ b/biometric/biometric/src/main/res/values-pt-rPT/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Utilizar palavra-passe"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenhum PIN, padrão ou palavra-passe definidos."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo não suporta o PIN, o padrão ou a palavra-passe."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícone de impressão digital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pt/strings.xml b/biometric/biometric/src/main/res/values-pt/strings.xml
index 0cdda39..d280c96 100644
--- a/biometric/biometric/src/main/res/values-pt/strings.xml
+++ b/biometric/biometric/src/main/res/values-pt/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Usar senha"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenhum PIN, padrão ou senha configurado."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo não é compatível com PIN, padrão ou senha."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícone de impressão digital"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ro/strings.xml b/biometric/biometric/src/main/res/values-ro/strings.xml
index f3b08c0..291ea47 100644
--- a/biometric/biometric/src/main/res/values-ro/strings.xml
+++ b/biometric/biometric/src/main/res/values-ro/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Folosiți parola"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nu este setat niciun cod PIN, model sau parolă."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dispozitivul nu acceptă codul PIN, modelul sau parola."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Pictograma amprentă"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ru/strings.xml b/biometric/biometric/src/main/res/values-ru/strings.xml
index 40f05c7..c6aaf6d 100644
--- a/biometric/biometric/src/main/res/values-ru/strings.xml
+++ b/biometric/biometric/src/main/res/values-ru/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Ввести пароль"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не заданы PIN-код, пароль или графический ключ."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"На этом устройстве не поддерживаются PIN-код, графический ключ и пароль."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Значок отпечатка пальца"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-si/strings.xml b/biometric/biometric/src/main/res/values-si/strings.xml
index 5ca1784..6939205 100644
--- a/biometric/biometric/src/main/res/values-si/strings.xml
+++ b/biometric/biometric/src/main/res/values-si/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"මුරපදය භාවිත කරන්න"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, රටා, හෝ මුරපද කිසිවක් සකසා නැත"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"මෙම උපාංගය PIN, රටාව හෝ මුරපදය සඳහා සහාය නොදක්වයි."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ඇඟිලි සලකුණු නිරූපකය"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sk/strings.xml b/biometric/biometric/src/main/res/values-sk/strings.xml
index 2572849..9d7b73c 100644
--- a/biometric/biometric/src/main/res/values-sk/strings.xml
+++ b/biometric/biometric/src/main/res/values-sk/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Použiť heslo"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nie je nastavený kód PIN, vzor ani heslo."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Toto zariadenie nepodporuje PIN, vzor ani heslo."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona odtlačku prsta"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sl/strings.xml b/biometric/biometric/src/main/res/values-sl/strings.xml
index f73a34f..f8198b0 100644
--- a/biometric/biometric/src/main/res/values-sl/strings.xml
+++ b/biometric/biometric/src/main/res/values-sl/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Uporaba gesla"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nastavljena ni nobena koda PIN, vzorec ali geslo."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ta naprava ne podpira kode PIN, vzorca ali gesla."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona prstnih odtisov"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sq/strings.xml b/biometric/biometric/src/main/res/values-sq/strings.xml
index 2662507..1c5eb78 100644
--- a/biometric/biometric/src/main/res/values-sq/strings.xml
+++ b/biometric/biometric/src/main/res/values-sq/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Përdor fjalëkalimin"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nuk është vendosur kod PIN, motiv ose fjalëkalim."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Kjo pajisje nuk e mbështet kodin PIN, motivin ose fjalëkalimin."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona e gjurmës së gishtit"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sr/strings.xml b/biometric/biometric/src/main/res/values-sr/strings.xml
index 01542c1..4feeca8 100644
--- a/biometric/biometric/src/main/res/values-sr/strings.xml
+++ b/biometric/biometric/src/main/res/values-sr/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Користите лозинку"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Нисте подесили ни PIN, ни шаблон, ни лозинку."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Овај уређај не подржава PIN, шаблон или лозинку."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Икона отиска прста"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sv/strings.xml b/biometric/biometric/src/main/res/values-sv/strings.xml
index 7a10fda..8b3722b 100644
--- a/biometric/biometric/src/main/res/values-sv/strings.xml
+++ b/biometric/biometric/src/main/res/values-sv/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Använd lösenord"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Pinkod, grafiskt lösenord eller lösenord har inte angetts."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Enheten har inte stöd för pinkod, lösenord eller grafiskt lösenord."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon för fingeravtryck"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sw/strings.xml b/biometric/biometric/src/main/res/values-sw/strings.xml
index 4f7fdfd..9c7b24b 100644
--- a/biometric/biometric/src/main/res/values-sw/strings.xml
+++ b/biometric/biometric/src/main/res/values-sw/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Tumia nenosiri"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Hujaweka PIN, mchoro au nenosiri."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Kifaa hiki hakitumii PIN, mchoro au nenosiri."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Aikoni ya alama ya kidole"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ta/strings.xml b/biometric/biometric/src/main/res/values-ta/strings.xml
index c5da372..49dcd40 100644
--- a/biometric/biometric/src/main/res/values-ta/strings.xml
+++ b/biometric/biometric/src/main/res/values-ta/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"கடவுச்சொல்லைப் பயன்படுத்து"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"பின்னோ பேட்டர்னோ கடவுச்சொல்லோ அமைக்கப்படவில்லை."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"பின், பேட்டர்ன், கடவுச்சொல் ஆகியவற்றை இந்தச் சாதனம் ஆதரிக்கவில்லை."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"கைரேகை ஐகான்"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-te/strings.xml b/biometric/biometric/src/main/res/values-te/strings.xml
index 8e6692c..bf81e43 100644
--- a/biometric/biometric/src/main/res/values-te/strings.xml
+++ b/biometric/biometric/src/main/res/values-te/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"పాస్‌వర్డ్‌ను ఉపయోగించు"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"పిన్‌ను గానీ, ఆకృతిని గానీ, పాస్‌వర్డ్‌ను గానీ‌ సెట్ చేయలేదు."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ఈ పరికరం పిన్, ఆకృతి లేదా పాస్‌వర్డ్‌‌ను సపోర్ట్ చేయదు."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"వేలిముద్ర చిహ్నం"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-th/strings.xml b/biometric/biometric/src/main/res/values-th/strings.xml
index 8967656..2f64c59 100644
--- a/biometric/biometric/src/main/res/values-th/strings.xml
+++ b/biometric/biometric/src/main/res/values-th/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"ใช้รหัสผ่าน"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ไม่ได้ตั้ง PIN, รูปแบบ หรือรหัสผ่าน"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"อุปกรณ์นี้ไม่รองรับ PIN, รูปแบบ หรือรหัสผ่าน"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ไอคอนลายนิ้วมือ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-tl/strings.xml b/biometric/biometric/src/main/res/values-tl/strings.xml
index a45f8eb..f144bb6 100644
--- a/biometric/biometric/src/main/res/values-tl/strings.xml
+++ b/biometric/biometric/src/main/res/values-tl/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Gamitin ang password"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Walang itinakdang PIN, pattern, o password."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Hindi sinusuportahan ng device na ito ang PIN, pattern, o password."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icon ng fingerprint"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-tr/strings.xml b/biometric/biometric/src/main/res/values-tr/strings.xml
index 15de871..b2c4d32 100644
--- a/biometric/biometric/src/main/res/values-tr/strings.xml
+++ b/biometric/biometric/src/main/res/values-tr/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Şifre kullan"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, desen veya şifre seti yok"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Bu cihaz PIN, desen veya şifre kullanımını desteklemiyor"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Parmak izi simgesi"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-uk/strings.xml b/biometric/biometric/src/main/res/values-uk/strings.xml
index 9acf4b5..65aff16 100644
--- a/biometric/biometric/src/main/res/values-uk/strings.xml
+++ b/biometric/biometric/src/main/res/values-uk/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Ввести пароль"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не вказано PIN-код, ключ або пароль."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Пристрій не підтримує PIN-код, ключ або пароль."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Значок відбитка пальця"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ur/strings.xml b/biometric/biometric/src/main/res/values-ur/strings.xml
index c59baf3..aad5ef7 100644
--- a/biometric/biometric/src/main/res/values-ur/strings.xml
+++ b/biometric/biometric/src/main/res/values-ur/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"پاس ورڈ استعمال کریں"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"کوئی پن، پیٹرن، یا پاس ورڈ سیٹ نہیں ہے۔"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"‏یہ آلہ PIN، پیٹرن یا پاس ورڈ کو سپورٹ نہیں کرتا ہے۔"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"فنگر پرنٹ آئیکن"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-uz/strings.xml b/biometric/biometric/src/main/res/values-uz/strings.xml
index 5980852..051a933 100644
--- a/biometric/biometric/src/main/res/values-uz/strings.xml
+++ b/biometric/biometric/src/main/res/values-uz/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Paroldan foydalanish"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN kod, grafik kalit yoki parol sozlanmagan."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Bu qurilmada PIN kod, grafik kalit va parol ishlamaydi."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Barmoq izi belgisi"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-vi/strings.xml b/biometric/biometric/src/main/res/values-vi/strings.xml
index 0434709..8258a1a 100644
--- a/biometric/biometric/src/main/res/values-vi/strings.xml
+++ b/biometric/biometric/src/main/res/values-vi/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Dùng mật khẩu"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Chưa đặt mã PIN, hình mở khóa hoặc mật khẩu."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Thiết bị này không hỗ trợ mã PIN, hình mở khóa hoặc mật khẩu."</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Biểu tượng vân tay"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zh-rCN/strings.xml b/biometric/biometric/src/main/res/values-zh-rCN/strings.xml
index 0b42c9d..6cc769a 100644
--- a/biometric/biometric/src/main/res/values-zh-rCN/strings.xml
+++ b/biometric/biometric/src/main/res/values-zh-rCN/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"使用密码"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"未设置 PIN 码、解锁图案或密码。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"此设备不支持 PIN 码、解锁图案或密码。"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指纹图标"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zh-rHK/strings.xml b/biometric/biometric/src/main/res/values-zh-rHK/strings.xml
index 19ae78f..4fcf1b0 100644
--- a/biometric/biometric/src/main/res/values-zh-rHK/strings.xml
+++ b/biometric/biometric/src/main/res/values-zh-rHK/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"使用密碼"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"未設定 PIN、圖案或密碼。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"這部裝置不支援 PIN、圖案或密碼。"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指紋圖示"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zh-rTW/strings.xml b/biometric/biometric/src/main/res/values-zh-rTW/strings.xml
index ddec25f..eba1918 100644
--- a/biometric/biometric/src/main/res/values-zh-rTW/strings.xml
+++ b/biometric/biometric/src/main/res/values-zh-rTW/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"使用密碼"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"未設定 PIN 碼、解鎖圖案或密碼。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"這部裝置不支援 PIN 碼、解鎖圖案或密碼。"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指紋圖示"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zu/strings.xml b/biometric/biometric/src/main/res/values-zu/strings.xml
index 6a00bc7..c940f4ec 100644
--- a/biometric/biometric/src/main/res/values-zu/strings.xml
+++ b/biometric/biometric/src/main/res/values-zu/strings.xml
@@ -29,4 +29,5 @@
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"Sebenzisa iphasiwedi"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ayikho iphinikhodi, iphethini, noma iphasiwedi esethiwe."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Le divayisi ayisekeli Iphinikhodi, iphethini, noma iphasiwedi"</string>
+    <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Isithonjana sezigxivizo zeminwe"</string>
 </resources>
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
index 7cf7948..b97e4d7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
@@ -75,6 +75,7 @@
         project.extra.set(AndroidXRootPlugin.PROJECT_OR_ARTIFACT_EXT_NAME, projectOrArtifactClosure)
         project.configurations.all { configuration ->
             configuration.resolutionStrategy.dependencySubstitution.all { substitution ->
+                substitution.allowAndroidxSnapshotReplacement()
                 substitution.replaceIfSnapshot()
             }
         }
@@ -117,6 +118,15 @@
         }
     }
 
+    private fun DependencySubstitution.allowAndroidxSnapshotReplacement() {
+        val requested = this.requested
+        if (requested is ModuleComponentSelector && requested.group.startsWith("androidx") &&
+            requested.version.matches(Regex("^[0-9]+\\.[0-9]+\\.[0-9]+$"))
+        ) {
+            useTarget("${requested.group}:${requested.module}:${requested.version}+")
+        }
+    }
+
     private fun DependencySubstitution.replaceIfSnapshot() {
         val requested = this.requested
         if (requested is ModuleComponentSelector && requested.version == SNAPSHOT_MARKER) {
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index ff4b5f4..3f59f40 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -411,7 +411,12 @@
                     val target = dep.target
                     val version = target.version
                     // Enforce the ban on declaring dependencies with version ranges.
-                    if (version != null && Version.isDependencyRange(version)) {
+                    // Note: In playground, this ban is exempted to allow unresolvable prebuilts
+                    // to automatically get bumped to snapshot versions via version range
+                    // substitution.
+                    if (version != null && Version.isDependencyRange(version) &&
+                        project.rootProject.rootDir == project.getSupportRootFolder()
+                    ) {
                         throw IllegalArgumentException(
                             "Dependency ${dep.target} declares its version as " +
                                 "version range ${dep.target.version} however the use of " +
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
index 11cf0a0..8477cb4 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
@@ -146,6 +146,7 @@
                 error("ComposableNaming")
                 error("ComposableLambdaParameterNaming")
                 error("ComposableLambdaParameterPosition")
+                error("CompositionLocalNaming")
             }
 
             // TODO(148540713): remove this exclusion when Lint can support using multiple lint jars
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 930cf26..a8c1870 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -53,7 +53,7 @@
     val CORE_ROLE = Version("1.1.0-alpha02")
     val CURSORADAPTER = Version("1.1.0-alpha01")
     val CUSTOMVIEW = Version("1.2.0-alpha01")
-    val DATASTORE = Version("1.0.0-alpha06")
+    val DATASTORE = Version("1.0.0-alpha07")
     val DOCUMENTFILE = Version("1.1.0-alpha01")
     val DRAWERLAYOUT = Version("1.2.0-alpha01")
     val DYNAMICANIMATION = Version("1.1.0-alpha04")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
index 4bb4311..158065e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -163,13 +163,9 @@
                 lintConfig = project.rootProject.file("buildSrc/lint.xml")
             }
 
-            // Teams shouldn't be able to generate new baseline files or add new violations to
-            // existing files; they should only be able to burn down existing violations. That's
-            // hard to enforce, though, so we'll just prevent them from creating new ones.
-            //
-            // If you are working on enabling a new check -- and ONLY if you are working on a new
-            // check, then you may need to comment out this line  so that you can suppress all
-            // the new failures.
+            // Ideally, teams aren't able to add new violations to a baseline file; they should only
+            // be able to burn down existing violations. That's hard to enforce, though, so we'll
+            // generally allow teams to update their baseline files with a publicly-known flag.
             if (updateLintBaseline) {
                 // Continue generating baselines regardless of errors
                 isAbortOnError = false
@@ -187,9 +183,16 @@
                         lintBaseline.delete()
                     }
                 }
+                // Continue running after errors or after creating a new, blank baseline file.
                 System.setProperty(LINT_BASELINE_CONTINUE, "true")
             }
-            baseline(lintBaseline)
+
+            // Lint complains when it generates a new, blank baseline file so we'll just avoid
+            // telling it about the baseline if one doesn't already exist OR we're explicitly
+            // updating (and creating) baseline files.
+            if (updateLintBaseline or lintBaseline.exists()) {
+                baseline(lintBaseline)
+            }
         }
     }
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
index 49cbaab..2a3ee8a 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
@@ -108,7 +108,6 @@
             "ParcelableList", // This check is only relevant to android platform that has managers.
 
             // List of checks that have bugs, but should be enabled once fixed.
-            "GetterSetterNames", // b/135498039
             "StaticUtils", // b/135489083
             "StartWithLower", // b/135710527
 
@@ -123,6 +122,7 @@
         "--error",
         listOf(
             "AllUpper",
+            "GetterSetterNames",
             "MinMaxConstant",
             "TopLevelBuilder",
             "BuilderSetStyle",
@@ -322,8 +322,9 @@
                     """
     ${TERMINAL_RED}Your change has API lint issues. Fix the code according to the messages above.$TERMINAL_RESET
 
-    If a check is broken, suppress it in code with @Suppress("id")/@SuppressWarnings("id")
-    and file bug to https://issuetracker.google.com/issues/new?component=739152&template=1344623
+    If a check is broken, suppress it in code in Kotlin with @Suppress("id")/@get:Suppress("id")
+    and in Java with @SuppressWarnings("id") and file bug to
+    https://issuetracker.google.com/issues/new?component=739152&template=1344623
 
     If you are doing a refactoring or suppression above does not work, use ./gradlew updateApiLintBaseline
 """
diff --git a/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt b/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
index 2f07232..c903161 100644
--- a/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
@@ -93,7 +93,12 @@
             // We don't need to check hasBenchmarkPlugin because benchmarks shouldn't have test apps
             val appName = appApk.elements.single().outputFile.substringAfterLast("/")
                 .renameApkForTesting(appProjectPath.get(), hasBenchmarkPlugin = false)
-            configBuilder.appApkName(appName)
+            // TODO(b/178776319)
+            if (appProjectPath.get().contains("macrobenchmark-target")) {
+                configBuilder.appApkName(appName.replace("debug-androidTest", "release"))
+            } else {
+                configBuilder.appApkName(appName)
+            }
         }
         val isPostsubmit: Boolean = when (affectedModuleDetectorSubset.get()) {
             ProjectSubset.CHANGED_PROJECTS, ProjectSubset.ALL_AFFECTED_PROJECTS -> {
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraDisconnectTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraDisconnectTest.java
index 25ce33e..79b09b2 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraDisconnectTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraDisconnectTest.java
@@ -16,29 +16,28 @@
 
 package androidx.camera.camera2;
 
-
 import static androidx.camera.testing.CoreAppTestUtil.ForegroundOccupiedError;
 import static androidx.camera.testing.CoreAppTestUtil.assumeCanTestCameraDisconnect;
 import static androidx.camera.testing.CoreAppTestUtil.assumeCompatibleDevice;
 import static androidx.camera.testing.CoreAppTestUtil.prepareDeviceUI;
 
-import static org.junit.Assume.assumeNotNull;
+import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build;
 
 import androidx.camera.core.CameraX;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.activity.Camera2TestActivity;
 import androidx.camera.testing.activity.CameraXTestActivity;
+import androidx.test.core.app.ActivityScenario;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.IdlingRegistry;
 import androidx.test.espresso.IdlingResource;
+import androidx.test.espresso.idling.CountingIdlingResource;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.After;
@@ -51,6 +50,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicReference;
 
 @RunWith(AndroidJUnit4.class)
 @LargeTest
@@ -59,62 +59,61 @@
     @Rule
     public TestRule mCameraRule = CameraUtil.grantCameraPermissionAndPreTest();
 
-    @SuppressWarnings("deprecation")
-    @Rule
-    public androidx.test.rule.ActivityTestRule<CameraXTestActivity> mCameraXTestActivityRule =
-            new androidx.test.rule.ActivityTestRule<>(CameraXTestActivity.class, true, false);
-    @SuppressWarnings("deprecation")
-    @Rule
-    public androidx.test.rule.ActivityTestRule<Camera2TestActivity> mCamera2ActivityRule =
-            new androidx.test.rule.ActivityTestRule<>(Camera2TestActivity.class, true, false);
-
-    private CameraXTestActivity mCameraXTestActivity;
-
     @Before
     public void setUp() throws ForegroundOccupiedError {
         assumeCompatibleDevice();
+        assumeCanTestCameraDisconnect();
 
-        Context context = ApplicationProvider.getApplicationContext();
+        final Context context = ApplicationProvider.getApplicationContext();
         CameraX.initialize(context, Camera2Config.defaultConfig());
 
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         prepareDeviceUI(InstrumentationRegistry.getInstrumentation());
-
-        mCameraXTestActivityRule.launchActivity(new Intent());
-        mCameraXTestActivity = mCameraXTestActivityRule.getActivity();
     }
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        mCameraXTestActivityRule.finishActivity();
-        mCamera2ActivityRule.finishActivity();
-
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraX.shutdown().get(10_000, TimeUnit.MILLISECONDS);
     }
 
     @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M) // Known issue, checkout b/147393563.
     public void testDisconnect_launchCamera2App() {
-        // Specific compatibility check for the test.
-        assumeCanTestCameraDisconnect();
+        // Launch CameraX test activity
+        final ActivityScenario<CameraXTestActivity> cameraXActivity = ActivityScenario.launch(
+                CameraXTestActivity.class);
 
-        waitFor(mCameraXTestActivity.mPreviewReady);
-        String cameraId = mCameraXTestActivity.mCameraId;
-        assumeNotNull(cameraId);
+        // Wait for preview to become active
+        final AtomicReference<CountingIdlingResource> cameraXPreviewReady = new AtomicReference<>();
+        cameraXActivity.onActivity(activity -> cameraXPreviewReady.set(activity.getPreviewReady()));
+        waitFor(cameraXPreviewReady.get());
 
-        // Launch another activity and open the camera by camera2 API. It should cause the camera
-        // disconnect from CameraX.
-        mCamera2ActivityRule.launchActivity(
-                new Intent().putExtra(Camera2TestActivity.EXTRA_CAMERA_ID, cameraId));
-        waitFor(mCamera2ActivityRule.getActivity().mPreviewReady);
-        mCamera2ActivityRule.finishActivity();
+        // Get id of camera opened by CameraX test activity
+        final AtomicReference<String> cameraId = new AtomicReference<>();
+        cameraXActivity.onActivity(activity -> cameraId.set(activity.getCameraId()));
+        assertThat(cameraId.get()).isNotNull();
 
-        // Verify the CameraX Preview can resume successfully.
-        waitFor(mCameraXTestActivity.mPreviewReady);
+        // Launch Camera2 test activity. It should cause the camera to disconnect from CameraX.
+        final Intent intent = new Intent(ApplicationProvider.getApplicationContext(),
+                Camera2TestActivity.class);
+        intent.putExtra(Camera2TestActivity.EXTRA_CAMERA_ID, cameraId.get());
+        final ActivityScenario<Camera2TestActivity> camera2Activity = ActivityScenario.launch(
+                intent);
+
+        // Wait for preview to become active
+        final AtomicReference<CountingIdlingResource> camera2PreviewReady = new AtomicReference<>();
+        camera2Activity.onActivity(activity -> camera2PreviewReady.set(activity.mPreviewReady));
+        waitFor(camera2PreviewReady.get());
+
+        // Close Camera2 test activity, and verify the CameraX Preview resumes successfully.
+        camera2Activity.close();
+        waitFor(cameraXPreviewReady.get());
+
+        // Close CameraX test activity
+        cameraXActivity.close();
     }
 
-    public static void waitFor(IdlingResource idlingResource) {
+    private static void waitFor(IdlingResource idlingResource) {
         IdlingRegistry.getInstance().register(idlingResource);
         Espresso.onIdle();
         IdlingRegistry.getInstance().unregister(idlingResource);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
index 8b6a9bc..4abb61e 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
@@ -26,7 +26,9 @@
 import androidx.camera.core.impl.OptionsBundle;
 import androidx.camera.core.impl.SessionConfig;
 import androidx.camera.core.impl.UseCaseConfig;
+import androidx.core.util.Consumer;
 
+import java.util.Collection;
 import java.util.UUID;
 
 /** A fake configuration for {@link FakeOtherUseCase}. */
@@ -182,5 +184,16 @@
             getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, eventCallback);
             return this;
         }
+
+        /** @hide */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
     }
 }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
new file mode 100644
index 0000000..8e6a633
--- /dev/null
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.impl
+
+import androidx.camera.testing.asFlow
+import androidx.concurrent.futures.await
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+
+private const val MAGIC_VALUE = 42
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+public class ConstantObservableTest {
+
+    @Test
+    public fun fetchData_returnsValue(): Unit = runBlocking {
+        val constantObservable = ConstantObservable.withValue(MAGIC_VALUE)
+        val value = constantObservable.fetchData().await()
+        assertThat(value).isEqualTo(MAGIC_VALUE)
+    }
+
+    @Test
+    public fun fetchData_canReturnNull(): Unit = runBlocking {
+        val constantObservable: Observable<Any?> = ConstantObservable.withValue(null)
+        val value = constantObservable.fetchData().await()
+        assertThat(value).isNull()
+    }
+
+    @Test
+    public fun observer_receivesValue(): Unit = runBlocking {
+        val constantObservable = ConstantObservable.withValue(MAGIC_VALUE)
+        val value = constantObservable.asFlow().first()
+        assertThat(value).isEqualTo(MAGIC_VALUE)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
index 5ca712c..a4f3b38 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
@@ -16,143 +16,103 @@
 
 package androidx.camera.core.impl
 
-import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.testing.asFlow
 import androidx.concurrent.futures.await
+import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
 import org.junit.Test
-import kotlin.coroutines.resume
-import kotlin.coroutines.resumeWithException
-import kotlin.coroutines.suspendCoroutine
+import org.junit.runner.RunWith
 
 private const val MAGIC_VALUE = 42
 private val TEST_ERROR = TestError("TEST")
 
 @SmallTest
-class LiveDataObservableTest {
+@RunWith(AndroidJUnit4::class)
+public class LiveDataObservableTest {
 
     @Test
-    fun uninitializedFetch_throwsISE() {
+    public fun uninitializedFetch_throwsISE(): Unit = runBlocking {
         val uninitializedObservable = LiveDataObservable<Int>()
 
-        runBlocking {
-            assertThrows<IllegalStateException> {
-                uninitializedObservable.fetchData().await()
-            }
+        assertThrows<IllegalStateException> {
+            uninitializedObservable.fetchData().await()
         }
     }
 
     @Test
-    fun canSetAndFetchValue() {
+    public fun canSetAndFetchValue(): Unit = runBlocking {
         val observable = LiveDataObservable<Int>().apply {
             postValue(MAGIC_VALUE)
         }
 
-        runBlocking {
-            val fetched = observable.fetchData().await()
-            assertThat(fetched).isEqualTo(MAGIC_VALUE)
-        }
+        val fetched = observable.fetchData().await()
+        assertThat(fetched).isEqualTo(MAGIC_VALUE)
     }
 
     @Test
-    fun canSetAndFetchValue_onMainThread() {
-        var fetched: Int?
-        runBlocking(Dispatchers.Main) {
+    public fun canSetAndFetchValue_onMainThread(): Unit = runBlocking {
+        val fetched = withContext(Dispatchers.Main) {
             val observable = LiveDataObservable<Int>().apply {
                 postValue(MAGIC_VALUE)
             }
 
-            fetched = observable.fetchData().await()
+            observable.fetchData().await()
         }
 
         assertThat(fetched).isEqualTo(MAGIC_VALUE)
     }
 
     @Test
-    fun canSetAndReceiveError() {
+    public fun canSetAndReceiveError(): Unit = runBlocking {
         val observable = LiveDataObservable<Int>().apply {
             postError(TEST_ERROR)
         }
 
-        runBlocking {
-            assertThrows<TestError> { observable.fetchData().await() }
-        }
+        assertThrows<TestError> { observable.fetchData().await() }
     }
 
     @Test
-    fun canObserveToRetrieveValue() {
+    public fun canObserveToRetrieveValue(): Unit = runBlocking {
         val observable = LiveDataObservable<Int>()
         observable.postValue(MAGIC_VALUE)
 
-        runBlocking {
-            val fetched = observable.getValue()
-            assertThat(fetched).isEqualTo(MAGIC_VALUE)
-        }
-    }
-
-    @Test
-    fun canObserveToRetrieveError() {
-        val observable = LiveDataObservable<Int>()
-        observable.postError(TEST_ERROR)
-
-        runBlocking {
-            assertThrows<TestError> { observable.getValue() }
-        }
-    }
-
-    @Test
-    fun canObserveToRetrieveValue_whenSetAfterObserve() {
-        val observable = LiveDataObservable<Int>()
-
-        var fetched: Int? = null
-        runBlocking {
-            async {
-                fetched = observable.getValue()
-            }
-
-            observable.postValue(MAGIC_VALUE)
-        }
+        val fetched = observable.asFlow().first()
         assertThat(fetched).isEqualTo(MAGIC_VALUE)
     }
 
     @Test
-    fun canObserveToRetrieveError_whenSetAfterObserve() {
+    public fun canObserveToRetrieveError(): Unit = runBlocking {
+        val observable = LiveDataObservable<Int>()
+        observable.postError(TEST_ERROR)
+
+        assertThrows<TestError> { observable.asFlow().first() }
+    }
+
+    @Test
+    public fun canObserveToRetrieveValue_whenSetAfterObserve(): Unit = runBlocking {
         val observable = LiveDataObservable<Int>()
 
-        assertThrows<TestError> {
-            runBlocking {
-                async {
-                    observable.getValue()
-                }
+        val flow = observable.asFlow() // Sets observer
+        observable.postValue(MAGIC_VALUE)
+        assertThat(flow.first()).isEqualTo(MAGIC_VALUE)
+    }
 
-                observable.postError(TEST_ERROR)
-            }
+    @Test
+    public fun canObserveToRetrieveError_whenSetAfterObserve(): Unit = runBlocking {
+        val observable = LiveDataObservable<Int>()
+
+        val flow = observable.asFlow() // Sets observer
+        observable.postError(TEST_ERROR)
+        assertThrows<TestError> {
+            flow.first()
         }
     }
 }
 
-private class TestError(message: String) : Exception(message)
-
-// In general, it may not be safe to add an observer and remove it within its callback.
-// Since we know that the LiveData will always trampoline off the main thread, this is OK here.
-// However, this would probably be implemented better as a flow, but that is currently not
-// available.
-private suspend fun <T> Observable<T>.getValue(): T? =
-    suspendCoroutine { continuation ->
-        val observer = object : Observable.Observer<T> {
-            override fun onNewData(value: T?) {
-                removeObserver(this)
-                continuation.resume(value)
-            }
-
-            override fun onError(t: Throwable) {
-                removeObserver(this)
-                continuation.resumeWithException(t)
-            }
-        }
-        addObserver(CameraXExecutors.directExecutor(), observer)
-    }
\ No newline at end of file
+private class TestError(message: String) : Exception(message)
\ No newline at end of file
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
index 4ac5e41..8ea92ef 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
@@ -344,21 +344,21 @@
         }
 
         /**
-         * Sets a {@link CameraSelector} to determine the available cameras which defines
-         * which cameras can be used in the application.
+         * Sets a {@link CameraSelector} to determine the available cameras, thus defining which
+         * cameras can be used in the application.
          *
-         * <p>Only cameras selected by this CameraSelector can be used in the applications. If
-         * the application binds the use cases with a CameraSelector that selects a unavailable
-         * camera, a {@link IllegalArgumentException} will be thrown.
+         * <p>Only cameras selected by this CameraSelector can be used in the application. If the
+         * application binds use cases with a CameraSelector that selects an unavailable camera,
+         * an {@link IllegalArgumentException} will be thrown.
          *
          * <p>This configuration can help CameraX optimize the latency of CameraX initialization.
          * The tasks CameraX initialization performs include enumerating cameras, querying
-         * CameraCharacteristics and retrieving properties preparing for resolution determination.
-         * On some low end devices, these could take significant amount of time. Using the API
-         * can avoid the initialization of unnecessary cameras and speed up the time for camera
-         * start-up. For example, if the application uses only back cameras, it can set this
-         * configuration by CameraSelector.DEFAULT_BACK_CAMERA and then CameraX will avoid
-         * initializing front cameras to reduce the latency.
+         * camera characteristics and retrieving properties in preparation for resolution
+         * determination. On some low end devices, these tasks could take a significant amount of
+         * time. Using this method can avoid the initialization of unnecessary cameras and speed
+         * up the time for camera start-up. For example, if the application uses only back facing
+         * cameras, it can set this configuration with {@link CameraSelector#DEFAULT_BACK_CAMERA}
+         * and then CameraX will avoid initializing front facing cameras to reduce the latency.
          */
         @ExperimentalAvailableCamerasLimiter
         @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
index 97735cb..5dceeff 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
@@ -24,6 +24,7 @@
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_RESOLUTION;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
+import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -66,10 +67,12 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.TargetConfig;
 import androidx.camera.core.internal.ThreadConfig;
+import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.Executor;
@@ -1014,5 +1017,16 @@
                     imageReaderProxyProvider);
             return this;
         }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
     }
 }
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 a6c3b87..743aafb 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
@@ -39,6 +39,7 @@
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_USE_CASE_EVENT_CALLBACK;
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_USE_SOFTWARE_JPEG_ENCODER;
 import static androidx.camera.core.impl.ImageInputConfig.OPTION_INPUT_FORMAT;
+import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
 import static androidx.camera.core.internal.utils.ImageUtil.min;
 import static androidx.camera.core.internal.utils.ImageUtil.sizeToVertexes;
@@ -116,6 +117,7 @@
 import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability;
 import androidx.camera.core.internal.utils.ImageUtil;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -129,6 +131,7 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Deque;
 import java.util.HashSet;
 import java.util.List;
@@ -767,22 +770,6 @@
      * set, or {@link #setCropAspectRatio} is used, the image may be cropped before saving to
      * disk which causes an additional latency.
      *
-     * <p> Before triggering the image capture pipeline, if the save location is a {@link File} or
-     * {@link MediaStore}, it is first verified to ensure it's valid and writable. A {@link File}
-     * is verified by attempting to open a {@link java.io.FileOutputStream} to it, whereas a
-     * location in {@link MediaStore} is validated by
-     * {@linkplain ContentResolver#insert(Uri, ContentValues) creating a new row} in the user
-     * defined table, retrieving a {@link Uri} pointing to it, then attempting to open an
-     * {@link OutputStream} to it. The newly created row is
-     * {@linkplain ContentResolver#delete(Uri, String, String[]) deleted}
-     * at the end of the verification. On Huawei devices, this deletion results in the system
-     * displaying a notification informing the user that a photo has been deleted. In order to
-     * avoid this, validating the image capture save location in
-     * {@link android.provider.MediaStore} is skipped on Huawei devices.
-     *
-     * <p> If the validation of the save location fails, {@link OnImageSavedCallback}'s error
-     * callback is invoked with an {@link ImageCaptureException}.
-     *
      * @param outputFileOptions  Options to store the newly captured image.
      * @param executor           The executor in which the callback methods will be run.
      * @param imageSavedCallback Callback to be called for the newly captured image.
@@ -792,30 +779,11 @@
             final @NonNull OutputFileOptions outputFileOptions,
             final @NonNull Executor executor,
             final @NonNull OnImageSavedCallback imageSavedCallback) {
-        mSequentialIoExecutor.execute(() -> {
-            if (!ImageSaveLocationValidator.isValid(outputFileOptions)) {
-                // Check whether the captured image can be saved. If it cannot, fail fast and
-                // notify user.
-                executor.execute(() -> imageSavedCallback.onError(
-                        new ImageCaptureException(ERROR_FILE_IO,
-                                "Cannot save capture result to specified location", null)));
-            } else {
-                CameraXExecutors.mainThreadExecutor().execute(
-                        () -> takePictureAfterValidation(outputFileOptions, executor,
-                                imageSavedCallback));
-            }
-        });
-    }
-
-    /**
-     * Takes picture after the output file options is validated.
-     */
-    @UiThread
-    private void takePictureAfterValidation(
-            final @NonNull OutputFileOptions outputFileOptions,
-            final @NonNull Executor executor,
-            final @NonNull OnImageSavedCallback imageSavedCallback) {
-        Threads.checkMainThread();
+        if (Looper.getMainLooper() != Looper.myLooper()) {
+            CameraXExecutors.mainThreadExecutor().execute(
+                    () -> takePicture(outputFileOptions, executor, imageSavedCallback));
+            return;
+        }
         /*
          * We need to chain the following callbacks to save the image to disk:
          *
@@ -2931,5 +2899,16 @@
             getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
             return this;
         }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
     }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageSaveLocationValidator.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageSaveLocationValidator.java
deleted file mode 100644
index d99aea7..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageSaveLocationValidator.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.core;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.net.Uri;
-
-import androidx.annotation.NonNull;
-import androidx.camera.core.internal.compat.quirk.DeviceQuirks;
-import androidx.camera.core.internal.compat.quirk.HuaweiMediaStoreLocationValidationQuirk;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-class ImageSaveLocationValidator {
-
-    private static final String TAG = "SaveLocationValidator";
-
-    private ImageSaveLocationValidator() {
-    }
-
-    /**
-     * Verifies whether the result of an image capture operation can be saved to the specified
-     * location in {@link androidx.camera.core.ImageCapture.OutputFileOptions}.
-     * <p>
-     * This method checks whether an image capture to a {@link File} or to
-     * {@link android.provider.MediaStore} will work by checking whether the {@link File} exists
-     * and is writable, and if the {@link Uri} to {@link android.provider.MediaStore} is valid.
-     *
-     * @param outputFileOptions Options for saving the result of an image capture operation
-     * @return true if the image capture result can be saved to the specified storage option,
-     * false otherwise.
-     */
-    @SuppressWarnings("ConstantConditions")
-    static boolean isValid(final @NonNull ImageCapture.OutputFileOptions outputFileOptions) {
-        if (isSaveToFile(outputFileOptions)) {
-            return canSaveToFile(outputFileOptions.getFile());
-        }
-
-        if (isSaveToMediaStore(outputFileOptions)) {
-            // Skip verification on Huawei devices
-            final HuaweiMediaStoreLocationValidationQuirk huaweiQuirk =
-                    DeviceQuirks.get(HuaweiMediaStoreLocationValidationQuirk.class);
-            if (huaweiQuirk != null) {
-                return huaweiQuirk.canSaveToMediaStore();
-            }
-
-            return canSaveToMediaStore(outputFileOptions.getContentResolver(),
-                    outputFileOptions.getSaveCollection(), outputFileOptions.getContentValues());
-        }
-        return true;
-    }
-
-    private static boolean isSaveToFile(
-            final @NonNull ImageCapture.OutputFileOptions outputFileOptions) {
-        return outputFileOptions.getFile() != null;
-    }
-
-    private static boolean isSaveToMediaStore(
-            final @NonNull ImageCapture.OutputFileOptions outputFileOptions) {
-        return outputFileOptions.getSaveCollection() != null
-                && outputFileOptions.getContentResolver() != null
-                && outputFileOptions.getContentValues() != null;
-    }
-
-    private static boolean canSaveToFile(@NonNull final File file) {
-        // Try opening a write stream to the output file. If this succeeds, the image save
-        // destination is valid. Otherwise, it's invalid.
-        try (FileOutputStream ignored = new FileOutputStream(file)) {
-            return true;
-        } catch (IOException exception) {
-            Logger.e(TAG, "Failed to open a write stream to " + file.toString(), exception);
-            return false;
-        }
-    }
-
-    private static boolean canSaveToMediaStore(@NonNull final ContentResolver contentResolver,
-            @NonNull final Uri uri, @NonNull ContentValues values) {
-        final Uri outputUri;
-        try {
-            // Get the uri where the image will be saved
-            outputUri = contentResolver.insert(uri, values);
-        } catch (IllegalArgumentException exception) {
-            Logger.e(TAG, "Failed to insert into " + uri.toString(), exception);
-            return false;
-        }
-
-        // If the uri is null, saving the capture result to the given uri isn't possible
-        if (outputUri == null) {
-            return false;
-        }
-
-        // Try opening a write stream to the output uri. If this succeeds, the image save
-        // destination is valid. Otherwise, it's invalid.
-        try (OutputStream stream = contentResolver.openOutputStream(outputUri)) {
-            return stream != null;
-        } catch (IOException exception) {
-            Logger.e(TAG, "Failed to open a write stream to" + outputUri.toString(), exception);
-            return false;
-        } finally {
-            try {
-                // Delete inserted row
-                contentResolver.delete(outputUri, null, null);
-            } catch (IllegalArgumentException exception) {
-                Logger.e(TAG, "Failed to delete inserted row at " + outputUri.toString(),
-                        exception);
-            }
-        }
-    }
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index e5f4e41..b732939 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -34,6 +34,7 @@
 import static androidx.camera.core.impl.PreviewConfig.OPTION_TARGET_RESOLUTION;
 import static androidx.camera.core.impl.PreviewConfig.OPTION_TARGET_ROTATION;
 import static androidx.camera.core.impl.PreviewConfig.OPTION_USE_CASE_EVENT_CALLBACK;
+import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
 
 import android.graphics.ImageFormat;
@@ -85,6 +86,7 @@
 import androidx.camera.core.internal.ThreadConfig;
 import androidx.core.util.Consumer;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.Executor;
@@ -553,7 +555,7 @@
          * <p>A request is considered active until it is
          *
          * {@linkplain SurfaceRequest#provideSurface(Surface, Executor, androidx.core.util.Consumer)
-         * fulfilled}, {@linkplain SurfaceRequest#willNotProvideSurface()} marked as 'will not
+         * fulfilled}, {@linkplain SurfaceRequest#willNotProvideSurface() marked as 'will not
          * complete'}, or
          * {@linkplain SurfaceRequest#addRequestCancellationListener(Executor, Runnable) cancelled
          * by the camera}. After one of these conditions occurs, a request is considered completed.
@@ -1018,5 +1020,17 @@
             getMutableConfig().insertOption(OPTION_PREVIEW_CAPTURE_PROCESSOR, captureProcessor);
             return this;
         }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
+
     }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
index ba1a31e..e201546 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
@@ -22,6 +22,7 @@
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_RESOLUTION;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
+import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -94,6 +95,7 @@
 import androidx.camera.core.internal.utils.VideoUtil;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
+import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -104,6 +106,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.nio.ByteBuffer;
+import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.Executor;
@@ -1626,6 +1629,18 @@
             getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
             return this;
         }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
+
     }
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
new file mode 100644
index 0000000..17fddbb
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.impl;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.core.impl.utils.futures.Futures;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+
+/**
+ * An {@link Observable} whose value is set at construction time and never changes.
+ * @param <T> The observed type.
+ */
+public final class ConstantObservable<T> implements Observable<T> {
+    private static final ConstantObservable<Object> NULL_OBSERVABLE =
+            new ConstantObservable<>(null);
+    private static final String TAG = "ConstantObservable";
+
+    private final ListenableFuture<T> mValueFuture;
+
+    /**
+     * Creates an {@link Observable} with constant given value.
+     * @param value The value which will immediately be sent to observers and is always returned
+     *              by {@link #fetchData()}.
+     */
+    @NonNull
+    public static <U> Observable<U> withValue(@Nullable U value) {
+        if (value == null) {
+            @SuppressWarnings({"unchecked", "rawtypes"}) // Safe since null can be cast to any type
+            Observable<U> typedNull = (Observable) NULL_OBSERVABLE;
+            return typedNull;
+        }
+        return new ConstantObservable<>(value);
+    }
+
+    private ConstantObservable(@Nullable T value) {
+        mValueFuture = Futures.immediateFuture(value);
+    }
+
+    @NonNull
+    @Override
+    public ListenableFuture<T> fetchData() {
+        return mValueFuture;
+    }
+
+    @Override
+    public void addObserver(@NonNull Executor executor, @NonNull Observable.Observer<T> observer) {
+        // Since the Observable has a constant value, we only will have a one-shot call to the
+        // observer, so we don't need to store the observer.
+        // ImmediateFuture does not actually store listeners since it is already complete, so it
+        // is safe to call addListener() here without leaking.
+        mValueFuture.addListener(() -> {
+            try {
+                observer.onNewData(mValueFuture.get());
+            } catch (ExecutionException | InterruptedException e) {
+                // Note: this should not be possible as Futures.immediateFuture() should return a
+                // future that is already complete and has not failed with an exception.
+                observer.onError(e);
+            }
+        }, executor);
+    }
+
+    @Override
+    public void removeObserver(@NonNull Observable.Observer<T> observer) {
+        // no-op. addObserver() does not need to store observers.
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
index 680d3f8..f973bf1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
@@ -23,6 +23,9 @@
 import androidx.camera.core.UseCase;
 import androidx.camera.core.internal.TargetConfig;
 import androidx.camera.core.internal.UseCaseEventConfig;
+import androidx.core.util.Consumer;
+
+import java.util.Collection;
 
 /**
  * Configuration containing options for use cases.
@@ -72,6 +75,12 @@
      */
     Option<CameraSelector> OPTION_CAMERA_SELECTOR =
             Config.Option.create("camerax.core.useCase.cameraSelector", CameraSelector.class);
+    /**
+     * Option: camerax.core.useCase.attachedUseCasesUpdateListener
+     */
+    Option<Consumer<Collection<UseCase>>> OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER =
+            Config.Option.create("camerax.core.useCase.attachedUseCasesUpdateListener",
+                    Consumer.class);
 
     // *********************************************************************************************
 
@@ -248,6 +257,32 @@
     }
 
     /**
+     * Retrieves the attached use cases update listener that will be updated when one or more use
+     * cases are attached or detached.
+     *
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     */
+    @Nullable
+    default Consumer<Collection<UseCase>> getAttachedUseCasesUpdateListener(
+            @Nullable Consumer<Collection<UseCase>> valueIfMissing) {
+        return retrieveOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER, valueIfMissing);
+    }
+
+    /**
+     * Retrieves the attached use cases update listener that will be updated when the use case is
+     * attached.
+     *
+     * @return The stored value, if it exists in this configuration.
+     * @throws IllegalArgumentException if the option does not exist in this configuration.
+     */
+    @NonNull
+    default Consumer<Collection<UseCase>> getAttachedUseCasesUpdateListener() {
+        return retrieveOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER);
+    }
+
+    /**
      * Builder for a {@link UseCase}.
      *
      * @param <T> The type of the object which will be built by {@link #build()}.
@@ -325,6 +360,18 @@
         B setCameraSelector(@NonNull CameraSelector cameraSelector);
 
         /**
+         * Sets the attached use cases update listener that will be updated when the use case is
+         * attached.
+         *
+         * @param attachedUseCasesUpdateListener The attached use cases update listener appended
+         *                                       internally.
+         * @return The current Builder.
+         */
+        @NonNull
+        B setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener);
+
+        /**
          * Retrieves the configuration used by this builder.
          *
          * @return the configuration used by this builder.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index 2c16a41..4fa610e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -42,6 +42,8 @@
 import androidx.camera.core.impl.SurfaceConfig;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
@@ -211,6 +213,7 @@
 
             mUseCases.addAll(newUseCases);
             if (mAttached) {
+                notifyAttachedUseCasesChange(mUseCases);
                 mCameraInternal.attachUseCases(newUseCases);
             }
 
@@ -265,6 +268,7 @@
         synchronized (mLock) {
             if (!mAttached) {
                 mCameraInternal.attachUseCases(mUseCases);
+                notifyAttachedUseCasesChange(mUseCases);
                 restoreInteropConfig();
 
                 // Notify to update the use case's active state because it may be cleared if the
@@ -535,6 +539,7 @@
             }
 
             if (mAttached) {
+                notifyAttachedUseCasesChange(mUseCases);
                 cameraInternal.attachUseCases(mUseCases);
             }
 
@@ -547,4 +552,20 @@
             mCameraConfig = newCameraConfig;
         }
     }
+
+    /**
+     * Notify the attached use cases change to the listener
+     */
+    private void notifyAttachedUseCasesChange(@NonNull List<UseCase> useCases) {
+        CameraXExecutors.mainThreadExecutor().execute(() -> {
+            for (UseCase useCase : useCases) {
+                Consumer<Collection<UseCase>> attachedUseCasesUpdateListener =
+                        useCase.getCurrentConfig().getAttachedUseCasesUpdateListener(null);
+
+                if (attachedUseCasesUpdateListener != null) {
+                    attachedUseCasesUpdateListener.accept(Collections.unmodifiableList(useCases));
+                }
+            }
+        });
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
index 54b9270..0a15ab7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
@@ -39,10 +39,6 @@
         final List<Quirk> quirks = new ArrayList<>();
 
         // Load all device specific quirks
-        if (HuaweiMediaStoreLocationValidationQuirk.load()) {
-            quirks.add(new HuaweiMediaStoreLocationValidationQuirk());
-        }
-
         if (IncompleteCameraListQuirk.load()) {
             quirks.add(new IncompleteCameraListQuirk());
         }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/HuaweiMediaStoreLocationValidationQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/HuaweiMediaStoreLocationValidationQuirk.java
deleted file mode 100644
index 1a5d3ac..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/HuaweiMediaStoreLocationValidationQuirk.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.core.internal.compat.quirk;
-
-import android.os.Build;
-
-import androidx.camera.core.impl.Quirk;
-
-/**
- * Quirk that displays a notification when an image in {@link android.provider.MediaStore} has
- * been deleted.
- *
- * <p> When triggering an image capture, the {@link androidx.camera.core.ImageCapture}
- * use case validates the save location before starting the image capture pipeline. Validating a
- * save location that is a {@link android.net.Uri} in {@link android.provider.MediaStore} involves
- * creating a new row in the user defined table, retrieving an output {@link android.net.Uri}
- * pointing to it, then attempting to open an {@link java.io.OutputStream} to it. The newly
- * created row is deleted at the end of the verification. On Huawei devices, this last step
- * results in the system displaying a notification informing the user that a photo has been
- * deleted. In order to avoid this, validating the image capture save location to
- * {@link android.provider.MediaStore} is skipped on Huawei devices. See b/169497925.
- */
-public class HuaweiMediaStoreLocationValidationQuirk implements Quirk {
-
-    static boolean load() {
-        return "HUAWEI".equals(Build.BRAND.toUpperCase())
-                || "HONOR".equals(Build.BRAND.toUpperCase());
-    }
-
-    /**
-     * Always skip checking if the image capture save destination in
-     * {@link android.provider.MediaStore} is valid.
-     */
-    public boolean canSaveToMediaStore() {
-        return true;
-    }
-}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/ImageSaveLocationValidatorTest.java b/camera/camera-core/src/test/java/androidx/camera/core/ImageSaveLocationValidatorTest.java
deleted file mode 100644
index d2d095b..0000000
--- a/camera/camera-core/src/test/java/androidx/camera/core/ImageSaveLocationValidatorTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.core;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assume.assumeFalse;
-
-import android.content.ContentProvider;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Build;
-import android.provider.MediaStore;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.internal.DoNotInstrument;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.function.Function;
-
-@RunWith(RobolectricTestRunner.class)
-@DoNotInstrument
-@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-public class ImageSaveLocationValidatorTest {
-
-    private static final Uri ANY_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
-
-    @Test
-    public void canSaveToValidWritableFile() throws IOException {
-        final File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        final ImageCapture.OutputFileOptions outputOptions =
-                new ImageCapture.OutputFileOptions.Builder(saveLocation).build();
-
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isTrue();
-    }
-
-    @Test
-    public void canSaveToFileInCache() {
-        final File cacheDir = ApplicationProvider.getApplicationContext().getCacheDir();
-        final String fileName = System.currentTimeMillis() + ".jpg";
-        final File saveLocation = new File(cacheDir, fileName);
-        saveLocation.deleteOnExit();
-        final ImageCapture.OutputFileOptions outputOptions =
-                new ImageCapture.OutputFileOptions.Builder(saveLocation).build();
-
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isTrue();
-    }
-
-    @Test
-    public void cannotSaveToReadOnlyFile() throws IOException {
-        final File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.setReadOnly();
-        saveLocation.deleteOnExit();
-        final ImageCapture.OutputFileOptions outputOptions =
-                new ImageCapture.OutputFileOptions.Builder(saveLocation).build();
-
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isFalse();
-    }
-
-    @Test
-    public void canSaveToMediaStore() {
-        // Skip for Huawei devices
-        assumeFalse(isHuaweiDevice());
-
-        // Return a valid insertion Uri for the image
-        TestContentProvider.sOnInsertCallback = uri -> Uri.parse(uri.toString() + "/1");
-        Robolectric.buildContentProvider(TestContentProvider.class).create(ANY_URI.getAuthority());
-
-        final ImageCapture.OutputFileOptions outputOptions = buildOutputFileOptions();
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isTrue();
-    }
-
-    @Test
-    public void cannotSaveToMediaStore_providerFailsInsertion() {
-        // Skip for Huawei devices
-        assumeFalse(isHuaweiDevice());
-
-        // Make the provider fail to return a valid insertion Uri
-        TestContentProvider.sOnInsertCallback = uri -> null;
-        Robolectric.buildContentProvider(TestContentProvider.class).create(ANY_URI.getAuthority());
-
-        final ImageCapture.OutputFileOptions outputOptions = buildOutputFileOptions();
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isFalse();
-    }
-
-    @Test
-    public void cannotSaveToMediaStore_providerCrashesOnInsertion() {
-        // Skip for Huawei devices
-        assumeFalse(isHuaweiDevice());
-
-        // Make the provider crash when trying to return a valid insertion Uri
-        TestContentProvider.sOnInsertCallback = uri -> {
-            throw new IllegalArgumentException();
-        };
-        Robolectric.buildContentProvider(TestContentProvider.class).create(ANY_URI.getAuthority());
-
-        final ImageCapture.OutputFileOptions outputOptions = buildOutputFileOptions();
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isFalse();
-    }
-
-    @Test
-    public void canSaveToMediaStore_huaweiDevice() {
-        ReflectionHelpers.setStaticField(Build.class, "BRAND", "huawei");
-
-        // Validation should return `true` regardless of any errors that may result from storing
-        // the image capture result in MediaStore, like the one below.
-        TestContentProvider.sOnInsertCallback = uri -> null;
-        Robolectric.buildContentProvider(TestContentProvider.class).create(ANY_URI.getAuthority());
-
-        final ImageCapture.OutputFileOptions outputOptions = buildOutputFileOptions();
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isTrue();
-    }
-
-    @Test
-    public void canSaveToMediaStore_honorDevice() {
-        ReflectionHelpers.setStaticField(Build.class, "BRAND", "honor");
-
-        // Validation should return `true` regardless of any errors that may result from storing
-        // the image capture result in MediaStore, like the one below.
-        TestContentProvider.sOnInsertCallback = uri -> null;
-        Robolectric.buildContentProvider(TestContentProvider.class).create(ANY_URI.getAuthority());
-
-        final ImageCapture.OutputFileOptions outputOptions = buildOutputFileOptions();
-        assertThat(ImageSaveLocationValidator.isValid(outputOptions)).isTrue();
-    }
-
-    @NonNull
-    private ImageCapture.OutputFileOptions buildOutputFileOptions() {
-        final Context context = ApplicationProvider.getApplicationContext();
-        final ContentResolver resolver = context.getContentResolver();
-        final ContentValues contentValues = new ContentValues();
-        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "test");
-        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
-        return new ImageCapture.OutputFileOptions
-                .Builder(resolver, ANY_URI, contentValues)
-                .build();
-    }
-
-    private boolean isHuaweiDevice() {
-        return "HUAWEI".equals(Build.BRAND.toUpperCase())
-                || "HONOR".equals(Build.BRAND.toUpperCase());
-    }
-
-    static class TestContentProvider extends ContentProvider {
-
-        @NonNull
-        static Function<Uri, Uri> sOnInsertCallback = uri -> null;
-
-        @Override
-        public boolean onCreate() {
-            return false;
-        }
-
-        @Nullable
-        @Override
-        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
-                @Nullable String selection, @Nullable String[] selectionArgs,
-                @Nullable String sortOrder) {
-            return null;
-        }
-
-        @Nullable
-        @Override
-        public String getType(@NonNull Uri uri) {
-            return null;
-        }
-
-        @Nullable
-        @Override
-        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
-            return sOnInsertCallback.apply(uri);
-        }
-
-        @Override
-        public int delete(@NonNull Uri uri, @Nullable String selection,
-                @Nullable String[] selectionArgs) {
-            return 0;
-        }
-
-        @Override
-        public int update(@NonNull Uri uri, @Nullable ContentValues values,
-                @Nullable String selection, @Nullable String[] selectionArgs) {
-            return 0;
-        }
-    }
-}
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
index b267548..14d1807 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
@@ -16,12 +16,15 @@
 
 package androidx.camera.extensions;
 
+import static androidx.camera.extensions.util.ExtensionsTestUtil.effectModeToExtensionMode;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assume.assumeTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verifyZeroInteractions;
 
+import android.app.Instrumentation;
 import android.content.Context;
 import android.os.Build;
 
@@ -33,6 +36,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Preview;
 import androidx.camera.core.UseCase;
+import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.extensions.ExtensionsErrorListener.ExtensionsErrorCode;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
@@ -40,7 +44,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SdkSuppress;
-import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.After;
 import org.junit.Before;
@@ -59,7 +63,7 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
 
-@SmallTest
+@MediumTest
 @RunWith(Parameterized.class)
 /**
  * Unit tests for {@link androidx.camera.extensions.ExtensionsErrorListener}.
@@ -71,15 +75,22 @@
 
     private final Context mContext = ApplicationProvider.getApplicationContext();
 
+    Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
+
     @Parameterized.Parameters
     public static Collection<Object[]> getParameters() {
         return ExtensionsTestUtil.getAllEffectLensFacingCombinations();
     }
 
+    private Extensions mExtensions;
+    private CameraSelector mCameraSelector;
     private EffectMode mEffectMode;
+    @Extensions.ExtensionMode
+    private int mExtensionMode;
     @CameraSelector.LensFacing
     private int mLensFacing;
     private CountDownLatch mLatch;
+    private CameraUseCaseAdapter mCamera;
 
     final AtomicReference<ExtensionsErrorCode> mErrorCode = new AtomicReference<>();
     ExtensionsErrorListener mExtensionsErrorListener = new ExtensionsErrorListener() {
@@ -93,7 +104,11 @@
     public ExtensionsErrorListenerTest(EffectMode effectMode,
             @CameraSelector.LensFacing int lensFacing) {
         mEffectMode = effectMode;
+        mExtensionMode = effectModeToExtensionMode(effectMode);
         mLensFacing = lensFacing;
+        mCameraSelector =
+                mLensFacing == CameraSelector.LENS_FACING_BACK ? CameraSelector.DEFAULT_BACK_CAMERA
+                        : CameraSelector.DEFAULT_FRONT_CAMERA;
     }
 
     @Before
@@ -107,28 +122,37 @@
         assumeTrue(ExtensionsTestUtil.initExtensions(mContext));
         assumeTrue(ExtensionsManager.isExtensionAvailable(mEffectMode, mLensFacing));
 
+        mExtensions = ExtensionsManager.getExtensions(mContext);
         mLatch = new CountDownLatch(1);
     }
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
+        if (mCamera != null) {
+            mInstrumentation.runOnMainSync(() ->
+                    //TODO: The removeUseCases() call might be removed after clarifying the
+                    // abortCaptures() issue in b/162314023.
+                    mCamera.removeUseCases(mCamera.getUseCases())
+            );
+        }
+
         CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
         ExtensionsManager.deinit().get();
     }
 
     @Test
-    public void receiveErrorCode_whenOnlyEnableImageCaptureExtender() throws InterruptedException {
+    public void receiveErrorCode_whenOnlyEnableImageCapture_ByExtenderAPI()
+            throws InterruptedException {
         ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
 
         ImageCapture imageCapture = ExtensionsTestUtil.createImageCaptureWithEffect(mEffectMode,
                 mLensFacing);
         Preview noEffectPreview = ExtensionsTestUtil.createPreviewWithEffect(EffectMode.NORMAL,
                 mLensFacing);
-
-        List<UseCase> useCaseList = Arrays.asList(imageCapture, noEffectPreview);
         mErrorCode.set(null);
-        ImageCaptureExtender.checkPreviewEnabled(mEffectMode, useCaseList);
-        PreviewExtender.checkImageCaptureEnabled(mEffectMode, useCaseList);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture,
+                noEffectPreview);
 
         // Waits for one second to get error code.
         mLatch.await(1, TimeUnit.SECONDS);
@@ -136,17 +160,32 @@
     }
 
     @Test
-    public void receiveErrorCode_whenOnlyEnablePreviewExtender() throws InterruptedException {
+    public void receiveErrorCode_whenOnlyBindImageCapture_ByExtenderAPI()
+            throws InterruptedException {
+        ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
+
+        ImageCapture imageCapture = ExtensionsTestUtil.createImageCaptureWithEffect(mEffectMode,
+                mLensFacing);
+        mErrorCode.set(null);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture);
+
+        // Waits for one second to get error code.
+        mLatch.await(1, TimeUnit.SECONDS);
+        assertThat(mErrorCode.get()).isEqualTo(ExtensionsErrorCode.PREVIEW_EXTENSION_REQUIRED);
+    }
+
+    @Test
+    public void receiveErrorCode_whenOnlyEnablePreview_ByExtenderAPI() throws InterruptedException {
         ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
 
         ImageCapture noEffectImageCapture =
                 ExtensionsTestUtil.createImageCaptureWithEffect(EffectMode.NORMAL, mLensFacing);
         Preview preview = ExtensionsTestUtil.createPreviewWithEffect(mEffectMode, mLensFacing);
-
-        List<UseCase> useCaseList = Arrays.asList(noEffectImageCapture, preview);
         mErrorCode.set(null);
-        ImageCaptureExtender.checkPreviewEnabled(mEffectMode, useCaseList);
-        PreviewExtender.checkImageCaptureEnabled(mEffectMode, useCaseList);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector,
+                noEffectImageCapture, preview);
 
         // Waits for one second to get error code.
         mLatch.await(1, TimeUnit.SECONDS);
@@ -155,8 +194,22 @@
     }
 
     @Test
-    @MediumTest
-    public void notReceiveErrorCode_whenEnableBothImageCapturePreviewExtenders()
+    public void receiveErrorCode_whenOnlyBindPreview_ByExtenderAPI() throws InterruptedException {
+        ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
+
+        Preview preview = ExtensionsTestUtil.createPreviewWithEffect(mEffectMode, mLensFacing);
+        mErrorCode.set(null);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, preview);
+
+        // Waits for one second to get error code.
+        mLatch.await(1, TimeUnit.SECONDS);
+        assertThat(mErrorCode.get()).isEqualTo(
+                ExtensionsErrorCode.IMAGE_CAPTURE_EXTENSION_REQUIRED);
+    }
+
+    @Test
+    public void notReceiveErrorCode_whenEnableBothImageCapturePreview_ByExtenderAPI()
             throws InterruptedException {
         ExtensionsErrorListener mockExtensionsErrorListener = mock(ExtensionsErrorListener.class);
         ExtensionsManager.setExtensionsErrorListener(mockExtensionsErrorListener);
@@ -165,17 +218,16 @@
                 mLensFacing);
         Preview preview = ExtensionsTestUtil.createPreviewWithEffect(mEffectMode, mLensFacing);
 
-        List<UseCase> useCaseList = Arrays.asList(imageCapture, preview);
-        ImageCaptureExtender.checkPreviewEnabled(mEffectMode, useCaseList);
-        PreviewExtender.checkImageCaptureEnabled(mEffectMode, useCaseList);
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture,
+                preview);
 
         // Waits for one second to get error code.
-        mLatch.await(1, TimeUnit.SECONDS);
+        Thread.sleep(1000);
         verifyZeroInteractions(mockExtensionsErrorListener);
     }
 
     @Test
-    public void receiveErrorCode_whenEnableMismatchedImageCapturePreviewExtenders()
+    public void receiveErrorCode_whenEnableMismatchedImageCapturePreview_ByExtenderAPI()
             throws InterruptedException {
         ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
 
@@ -202,16 +254,68 @@
         List<UseCase> useCaseList = Arrays.asList(imageCapture, preview);
 
         mErrorCode.set(null);
-        // ImageCaptureExtender will find mismatched PreviewExtender is enabled.
-        ImageCaptureExtender.checkPreviewEnabled(mEffectMode, useCaseList);
-        mLatch.await(1, TimeUnit.SECONDS);
-        assertThat(mErrorCode.get()).isEqualTo(ExtensionsErrorCode.MISMATCHED_EXTENSIONS_ENABLED);
-
+        // Will receive error code twice
         mLatch = new CountDownLatch(1);
-        mErrorCode.set(null);
-        // PreviewExtender will find mismatched ImageCaptureExtender is enabled.
-        PreviewExtender.checkImageCaptureEnabled(mismatchedEffectMode, useCaseList);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture,
+                preview);
+
+        // Waits for one second to get error code.
         mLatch.await(1, TimeUnit.SECONDS);
         assertThat(mErrorCode.get()).isEqualTo(ExtensionsErrorCode.MISMATCHED_EXTENSIONS_ENABLED);
     }
+
+    @Test
+    public void receiveErrorCode_whenOnlyBindImageCapture() throws InterruptedException {
+        ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
+
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
+
+        mErrorCode.set(null);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector,
+                imageCapture);
+
+        mInstrumentation.runOnMainSync(() -> mExtensions.setExtension(mCamera, mExtensionMode));
+
+        // Waits for one second to get error code.
+        mLatch.await(1, TimeUnit.SECONDS);
+        assertThat(mErrorCode.get()).isEqualTo(ExtensionsErrorCode.PREVIEW_EXTENSION_REQUIRED);
+    }
+
+    @Test
+    public void receiveErrorCode_whenOnlyBindPreview() throws InterruptedException {
+        ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
+
+        Preview preview = new Preview.Builder().build();
+
+        mErrorCode.set(null);
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, preview);
+
+        mInstrumentation.runOnMainSync(() -> mExtensions.setExtension(mCamera, mExtensionMode));
+
+        // Waits for one second to get error code.
+        mLatch.await(1, TimeUnit.SECONDS);
+        assertThat(mErrorCode.get()).isEqualTo(
+                ExtensionsErrorCode.IMAGE_CAPTURE_EXTENSION_REQUIRED);
+    }
+
+    @Test
+    public void notReceiveErrorCode_whenBindBothImageCapturePreview() throws InterruptedException {
+        ExtensionsErrorListener mockExtensionsErrorListener = mock(ExtensionsErrorListener.class);
+        ExtensionsManager.setExtensionsErrorListener(mockExtensionsErrorListener);
+
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
+        Preview preview = new Preview.Builder().build();
+
+        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture,
+                preview);
+
+        mInstrumentation.runOnMainSync(() -> mExtensions.setExtension(mCamera, mExtensionMode));
+
+        // Waits for one second to get error code.
+        Thread.sleep(1000);
+        verifyZeroInteractions(mockExtensionsErrorListener);
+    }
 }
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
index 2aff62d..2f0c395 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
@@ -49,7 +49,6 @@
 import androidx.camera.core.impl.CameraRepository;
 import androidx.camera.core.impl.CaptureProcessor;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
@@ -330,7 +329,7 @@
     final class FakeImageCaptureExtender extends ImageCaptureExtender {
         FakeImageCaptureExtender(ImageCapture.Builder builder,
                 ImageCaptureExtenderImpl impl) {
-            init(builder, impl, EffectMode.NORMAL);
+            init(builder, impl, Extensions.EXTENSION_MODE_NONE);
         }
     }
 
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
index f848d32..82eb1ba 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
@@ -52,7 +52,6 @@
 import androidx.camera.core.Preview;
 import androidx.camera.core.impl.CameraRepository;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
@@ -402,7 +401,7 @@
 
     private class FakePreviewExtender extends PreviewExtender {
         FakePreviewExtender(Preview.Builder builder, PreviewExtenderImpl impl) {
-            init(builder, impl, EffectMode.NORMAL);
+            init(builder, impl, Extensions.EXTENSION_MODE_NONE);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
index b0d69ac..4228868 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorAutoImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new AutoImageCaptureExtenderImpl();
-            init(builder, mImpl, EffectMode.AUTO);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_AUTO);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
index 03ce540..3a08a07 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.AutoPreviewExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorAutoPreviewExtender(Preview.Builder builder) {
             mImpl = new AutoPreviewExtenderImpl();
-            init(builder, mImpl, EffectMode.AUTO);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_AUTO);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
index 116fef1..054ee90 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorBeautyImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new BeautyImageCaptureExtenderImpl();
-            init(builder, mImpl, EffectMode.BEAUTY);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_BEAUTY);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
index 2a0032d..3379a7d 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.BeautyPreviewExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorBeautyPreviewExtender(Preview.Builder builder) {
             mImpl = new BeautyPreviewExtenderImpl();
-            init(builder, mImpl, EffectMode.BEAUTY);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_BEAUTY);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
index 87a2f3f..dd16c0a 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorBokehImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new BokehImageCaptureExtenderImpl();
-            init(builder, mImpl, EffectMode.BOKEH);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_BOKEH);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
index 4ebdea0..27d9106 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.BokehPreviewExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorBokehPreviewExtender(Preview.Builder builder) {
             mImpl = new BokehPreviewExtenderImpl();
-            init(builder, mImpl, EffectMode.BOKEH);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_BOKEH);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
index e97442b..8e4d05a 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl;
 /**
  * Load the OEM extension implementation for HDR effect type.
@@ -68,7 +67,7 @@
 
         VendorHdrImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new HdrImageCaptureExtenderImpl();
-            init(builder, mImpl, EffectMode.HDR);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_HDR);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
index 16f19e9..2fa535e 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.HdrPreviewExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorHdrPreviewExtender(Preview.Builder builder) {
             mImpl = new HdrPreviewExtenderImpl();
-            init(builder, mImpl, EffectMode.HDR);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_HDR);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
index 7b17e0c..6605fce 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
@@ -43,12 +43,12 @@
 import androidx.camera.core.impl.CaptureStage;
 import androidx.camera.core.impl.Config;
 import androidx.camera.extensions.ExtensionsErrorListener.ExtensionsErrorCode;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.CaptureProcessorImpl;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.internal.AdaptingCaptureProcessor;
 import androidx.camera.extensions.internal.AdaptingCaptureStage;
+import androidx.core.util.Consumer;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -60,17 +60,18 @@
  */
 public abstract class ImageCaptureExtender {
     private static final String TAG = "ImageCaptureExtender";
-    static final Config.Option<EffectMode> OPTION_IMAGE_CAPTURE_EXTENDER_MODE =
-            Config.Option.create("camerax.extensions.imageCaptureExtender.mode", EffectMode.class);
+    static final Config.Option<Integer> OPTION_IMAGE_CAPTURE_EXTENDER_MODE =
+            Config.Option.create("camerax.extensions.imageCaptureExtender.mode", Integer.class);
 
     private ImageCapture.Builder mBuilder;
     private ImageCaptureExtenderImpl mImpl;
-    private EffectMode mEffectMode;
+    @Extensions.ExtensionMode
+    private int mEffectMode;
     private ExtensionCameraFilter mExtensionCameraFilter;
 
     @UseExperimental(markerClass = ExperimentalCameraFilter.class)
     void init(ImageCapture.Builder builder, ImageCaptureExtenderImpl implementation,
-            EffectMode effectMode) {
+            @Extensions.ExtensionMode int effectMode) {
         mBuilder = builder;
         mImpl = implementation;
         mEffectMode = effectMode;
@@ -140,28 +141,52 @@
         CameraCharacteristics cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraId);
         mImpl.init(cameraId, cameraCharacteristics);
 
-        CaptureProcessorImpl captureProcessor = mImpl.getCaptureProcessor();
-        if (captureProcessor != null) {
-            mBuilder.setCaptureProcessor(new AdaptingCaptureProcessor(captureProcessor));
-        }
-
-        if (mImpl.getMaxCaptureStage() > 0) {
-            mBuilder.setMaxCaptureStages(mImpl.getMaxCaptureStage());
-        }
-
         // TODO(b/161302102): Remove usage of deprecated CameraX.getContext()
         @SuppressWarnings("deprecation")
-        ImageCaptureAdapter imageCaptureAdapter = new ImageCaptureAdapter(mImpl,
-                CameraX.getContext());
-        new Camera2ImplConfig.Extender<>(mBuilder).setCameraEventCallback(
-                new CameraEventCallbacks(imageCaptureAdapter));
-        mBuilder.setUseCaseEventCallback(imageCaptureAdapter);
-        mBuilder.setCaptureBundle(imageCaptureAdapter);
-        mBuilder.getMutableConfig().insertOption(OPTION_IMAGE_CAPTURE_EXTENDER_MODE, mEffectMode);
+        Context context = CameraX.getContext();
+        updateBuilderConfig(mBuilder, mEffectMode, mImpl, context);
+    }
 
-        List<Pair<Integer, Size[]>> supportedResolutions = getSupportedResolutions(mImpl);
+    /**
+     * Update extension related configs to the builder.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static void updateBuilderConfig(@NonNull ImageCapture.Builder builder,
+            @Extensions.ExtensionMode int effectMode, @NonNull ImageCaptureExtenderImpl impl,
+            @NonNull Context context) {
+        CaptureProcessorImpl captureProcessor = impl.getCaptureProcessor();
+        if (captureProcessor != null) {
+            builder.setCaptureProcessor(new AdaptingCaptureProcessor(captureProcessor));
+        }
+
+        if (impl.getMaxCaptureStage() > 0) {
+            builder.setMaxCaptureStages(impl.getMaxCaptureStage());
+        }
+
+        ImageCaptureAdapter imageCaptureAdapter = new ImageCaptureAdapter(impl, context);
+        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
+                new CameraEventCallbacks(imageCaptureAdapter));
+        builder.setUseCaseEventCallback(imageCaptureAdapter);
+
+        try {
+            Consumer<Collection<UseCase>> attachedUseCasesUpdateListener =
+                    useCases -> checkPreviewEnabled(effectMode, useCases);
+            builder.setAttachedUseCasesUpdateListener(attachedUseCasesUpdateListener);
+        } catch (NoSuchMethodError e) {
+            // setAttachedUseCasesUpdateListener function may not exist in the used core library.
+            // Catches the NoSuchMethodError and make the extensions be able to be enabled but
+            // only the ExtensionsErrorListener does not work.
+            Logger.e(TAG, "Can't set attached use cases update listener.");
+        }
+
+        builder.setCaptureBundle(imageCaptureAdapter);
+        builder.getMutableConfig().insertOption(OPTION_IMAGE_CAPTURE_EXTENDER_MODE, effectMode);
+
+        List<Pair<Integer, Size[]>> supportedResolutions = getSupportedResolutions(impl);
         if (supportedResolutions != null) {
-            mBuilder.setSupportedResolutions(supportedResolutions);
+            builder.setSupportedResolutions(supportedResolutions);
         }
     }
 
@@ -186,7 +211,8 @@
         }
     }
 
-    static void checkPreviewEnabled(EffectMode effectMode, Collection<UseCase> activeUseCases) {
+    static void checkPreviewEnabled(@Extensions.ExtensionMode int effectMode,
+            Collection<UseCase> activeUseCases) {
         boolean isPreviewExtenderEnabled = false;
         boolean isMismatched = false;
 
@@ -196,12 +222,12 @@
         }
 
         for (UseCase useCase : activeUseCases) {
-            EffectMode previewExtenderMode = useCase.getCurrentConfig().retrieveOption(
-                    PreviewExtender.OPTION_PREVIEW_EXTENDER_MODE, null);
+            int previewExtenderMode = useCase.getCurrentConfig().retrieveOption(
+                    PreviewExtender.OPTION_PREVIEW_EXTENDER_MODE, Extensions.EXTENSION_MODE_NONE);
 
             if (effectMode == previewExtenderMode) {
                 isPreviewExtenderEnabled = true;
-            } else if (previewExtenderMode != null) {
+            } else if (previewExtenderMode != Extensions.EXTENSION_MODE_NONE) {
                 isMismatched = true;
             }
         }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
index c9a7e22..bff9374 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorNightImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new NightImageCaptureExtenderImpl();
-            init(builder, mImpl, EffectMode.NIGHT);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_NIGHT);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
index 5f1a095..dd9fae9 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
@@ -20,7 +20,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.NightPreviewExtenderImpl;
 
 /**
@@ -69,7 +68,7 @@
 
         VendorNightPreviewExtender(Preview.Builder builder) {
             mImpl = new NightPreviewExtenderImpl();
-            init(builder, mImpl, EffectMode.NIGHT);
+            init(builder, mImpl, Extensions.EXTENSION_MODE_NIGHT);
         }
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
index 17730a0..4a40b8a 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
@@ -41,13 +41,13 @@
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.Config;
 import androidx.camera.extensions.ExtensionsErrorListener.ExtensionsErrorCode;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
 import androidx.camera.extensions.internal.AdaptingCaptureStage;
 import androidx.camera.extensions.internal.AdaptingPreviewProcessor;
 import androidx.camera.extensions.internal.AdaptingRequestUpdateProcessor;
+import androidx.core.util.Consumer;
 
 import java.util.Collection;
 import java.util.List;
@@ -57,17 +57,18 @@
  */
 public abstract class PreviewExtender {
     private static final String TAG = "PreviewExtender";
-    static final Config.Option<EffectMode> OPTION_PREVIEW_EXTENDER_MODE = Config.Option.create(
-            "camerax.extensions.previewExtender.mode", EffectMode.class);
+    static final Config.Option<Integer> OPTION_PREVIEW_EXTENDER_MODE = Config.Option.create(
+            "camerax.extensions.previewExtender.mode", Integer.class);
 
     private Preview.Builder mBuilder;
     private PreviewExtenderImpl mImpl;
-    private EffectMode mEffectMode;
+    @Extensions.ExtensionMode
+    private int mEffectMode;
     private ExtensionCameraFilter mExtensionCameraFilter;
 
     @UseExperimental(markerClass = ExperimentalCameraFilter.class)
     void init(Preview.Builder builder, PreviewExtenderImpl implementation,
-            EffectMode effectMode) {
+            @Extensions.ExtensionMode int effectMode) {
         mBuilder = builder;
         mImpl = implementation;
         mEffectMode = effectMode;
@@ -137,36 +138,61 @@
         CameraCharacteristics cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraId);
         mImpl.init(cameraId, cameraCharacteristics);
 
-        PreviewExtenderAdapter previewExtenderAdapter;
         // TODO(b/161302102): Remove usage of deprecated CameraX.getContext()
         @SuppressWarnings("deprecation")
         Context context = CameraX.getContext();
-        switch (mImpl.getProcessorType()) {
+        updateBuilderConfig(mBuilder, mEffectMode, mImpl, context);
+    }
+
+    /**
+     * Update extension related configs to the builder.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static void updateBuilderConfig(@NonNull Preview.Builder builder,
+            @Extensions.ExtensionMode int effectMode, @NonNull PreviewExtenderImpl impl,
+            @NonNull Context context) {
+        PreviewExtenderAdapter previewExtenderAdapter;
+
+        switch (impl.getProcessorType()) {
             case PROCESSOR_TYPE_REQUEST_UPDATE_ONLY:
                 AdaptingRequestUpdateProcessor adaptingRequestUpdateProcessor =
-                        new AdaptingRequestUpdateProcessor(mImpl);
-                mBuilder.setImageInfoProcessor(adaptingRequestUpdateProcessor);
-                previewExtenderAdapter = new PreviewExtenderAdapter(mImpl,
-                        context, adaptingRequestUpdateProcessor);
+                        new AdaptingRequestUpdateProcessor(impl);
+                builder.setImageInfoProcessor(adaptingRequestUpdateProcessor);
+                previewExtenderAdapter = new PreviewExtenderAdapter(impl, context,
+                        adaptingRequestUpdateProcessor);
                 break;
             case PROCESSOR_TYPE_IMAGE_PROCESSOR:
                 AdaptingPreviewProcessor adaptingPreviewProcessor = new
-                        AdaptingPreviewProcessor((PreviewImageProcessorImpl) mImpl.getProcessor());
-                mBuilder.setCaptureProcessor(adaptingPreviewProcessor);
-                previewExtenderAdapter = new PreviewExtenderAdapter(mImpl,
-                        context, adaptingPreviewProcessor);
+                        AdaptingPreviewProcessor((PreviewImageProcessorImpl) impl.getProcessor());
+                builder.setCaptureProcessor(adaptingPreviewProcessor);
+                previewExtenderAdapter = new PreviewExtenderAdapter(impl, context,
+                        adaptingPreviewProcessor);
                 break;
             default:
-                previewExtenderAdapter = new PreviewExtenderAdapter(mImpl, context, null);
+                previewExtenderAdapter = new PreviewExtenderAdapter(impl, context, null);
         }
 
-        new Camera2ImplConfig.Extender<>(mBuilder).setCameraEventCallback(
+        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
                 new CameraEventCallbacks(previewExtenderAdapter));
-        mBuilder.setUseCaseEventCallback(previewExtenderAdapter);
-        mBuilder.getMutableConfig().insertOption(OPTION_PREVIEW_EXTENDER_MODE, mEffectMode);
-        List<Pair<Integer, Size[]>> supportedResolutions = getSupportedResolutions(mImpl);
+        builder.setUseCaseEventCallback(previewExtenderAdapter);
+
+        try {
+            Consumer<Collection<UseCase>> attachedUseCasesUpdateListener =
+                    useCases -> checkImageCaptureEnabled(effectMode, useCases);
+            builder.setAttachedUseCasesUpdateListener(attachedUseCasesUpdateListener);
+        } catch (NoSuchMethodError e) {
+            // setAttachedUseCasesUpdateListener function may not exist in the used core library.
+            // Catches the NoSuchMethodError and make the extensions be able to be enabled but
+            // only the ExtensionsErrorListener does not work.
+            Logger.e(TAG, "Can't set attached use cases update listener.");
+        }
+
+        builder.getMutableConfig().insertOption(OPTION_PREVIEW_EXTENDER_MODE, effectMode);
+        List<Pair<Integer, Size[]>> supportedResolutions = getSupportedResolutions(impl);
         if (supportedResolutions != null) {
-            mBuilder.setSupportedResolutions(supportedResolutions);
+            builder.setSupportedResolutions(supportedResolutions);
         }
     }
 
@@ -191,7 +217,7 @@
         }
     }
 
-    static void checkImageCaptureEnabled(EffectMode effectMode,
+    static void checkImageCaptureEnabled(@Extensions.ExtensionMode int effectMode,
             Collection<UseCase> activeUseCases) {
         boolean isImageCaptureExtenderEnabled = false;
         boolean isMismatched = false;
@@ -202,12 +228,13 @@
         }
 
         for (UseCase useCase : activeUseCases) {
-            EffectMode imageCaptureExtenderMode = useCase.getCurrentConfig().retrieveOption(
-                    ImageCaptureExtender.OPTION_IMAGE_CAPTURE_EXTENDER_MODE, null);
+            int imageCaptureExtenderMode = useCase.getCurrentConfig().retrieveOption(
+                    ImageCaptureExtender.OPTION_IMAGE_CAPTURE_EXTENDER_MODE,
+                    Extensions.EXTENSION_MODE_NONE);
 
             if (effectMode == imageCaptureExtenderMode) {
                 isImageCaptureExtenderEnabled = true;
-            } else if (imageCaptureExtenderMode != null) {
+            } else if (imageCaptureExtenderMode != Extensions.EXTENSION_MODE_NONE) {
                 isMismatched = true;
             }
         }
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 5c400ef..2e0c377 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
@@ -18,13 +18,9 @@
 
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
-import android.util.Pair;
-import android.util.Size;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.experimental.UseExperimental;
-import androidx.camera.camera2.impl.Camera2ImplConfig;
-import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraInfo;
@@ -37,19 +33,18 @@
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl;
-import androidx.camera.extensions.impl.CaptureProcessorImpl;
 import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl;
 
-import java.util.List;
-
 /**
  * Provides extensions related configs for image capture
  */
 public class ImageCaptureConfigProvider implements ConfigProvider<ImageCaptureConfig> {
     private ImageCaptureExtenderImpl mImpl;
     private Context mContext;
+    @Extensions.ExtensionMode
+    private int mEffectMode;
 
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public ImageCaptureConfigProvider(@Extensions.ExtensionMode int mode,
@@ -78,6 +73,7 @@
         } catch (NoClassDefFoundError e) {
             throw new IllegalArgumentException("Extension mode does not exist: " + mode);
         }
+        mEffectMode = mode;
         mContext = context;
 
         String cameraId = Camera2CameraInfo.from(cameraInfo).getCameraId();
@@ -94,26 +90,7 @@
 
         ImageCapture.Builder builder = new ImageCapture.Builder();
 
-        CaptureProcessorImpl captureProcessor = mImpl.getCaptureProcessor();
-        if (captureProcessor != null) {
-            builder.setCaptureProcessor(new AdaptingCaptureProcessor(captureProcessor));
-        }
-
-        if (mImpl.getMaxCaptureStage() > 0) {
-            builder.setMaxCaptureStages(mImpl.getMaxCaptureStage());
-        }
-
-        ImageCaptureExtender.ImageCaptureAdapter
-                imageCaptureAdapter = new ImageCaptureExtender.ImageCaptureAdapter(mImpl, mContext);
-        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
-                new CameraEventCallbacks(imageCaptureAdapter));
-        builder.setUseCaseEventCallback(imageCaptureAdapter);
-        builder.setCaptureBundle(imageCaptureAdapter);
-        List<Pair<Integer, Size[]>> supportedResolutions =
-                ImageCaptureExtender.getSupportedResolutions(mImpl);
-        if (supportedResolutions != null) {
-            builder.setSupportedResolutions(supportedResolutions);
-        }
+        ImageCaptureExtender.updateBuilderConfig(builder, mEffectMode, mImpl, mContext);
 
         return builder.getUseCaseConfig();
     }
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 76cd238..e70da40 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
@@ -18,13 +18,9 @@
 
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
-import android.util.Pair;
-import android.util.Size;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.experimental.UseExperimental;
-import androidx.camera.camera2.impl.Camera2ImplConfig;
-import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraInfo;
@@ -40,9 +36,6 @@
 import androidx.camera.extensions.impl.HdrPreviewExtenderImpl;
 import androidx.camera.extensions.impl.NightPreviewExtenderImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
-import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
-
-import java.util.List;
 
 /**
  * For providing extensions config for preview.
@@ -50,6 +43,8 @@
 public class PreviewConfigProvider implements ConfigProvider<PreviewConfig> {
     private PreviewExtenderImpl mImpl;
     private Context mContext;
+    @Extensions.ExtensionMode
+    private int mEffectMode;
 
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public PreviewConfigProvider(@Extensions.ExtensionMode int mode,
@@ -78,6 +73,7 @@
         } catch (NoClassDefFoundError e) {
             throw new IllegalArgumentException("Extension mode does not exist: " + mode);
         }
+        mEffectMode = mode;
         mContext = context;
 
         String cameraId = Camera2CameraInfo.from(cameraInfo).getCameraId();
@@ -94,35 +90,7 @@
         }
         Preview.Builder builder = new Preview.Builder();
 
-        PreviewExtender.PreviewExtenderAdapter previewExtenderAdapter;
-        switch (mImpl.getProcessorType()) {
-            case PROCESSOR_TYPE_REQUEST_UPDATE_ONLY:
-                AdaptingRequestUpdateProcessor adaptingRequestUpdateProcessor =
-                        new AdaptingRequestUpdateProcessor(mImpl);
-                builder.setImageInfoProcessor(adaptingRequestUpdateProcessor);
-                previewExtenderAdapter = new PreviewExtender.PreviewExtenderAdapter(mImpl,
-                        mContext, adaptingRequestUpdateProcessor);
-                break;
-            case PROCESSOR_TYPE_IMAGE_PROCESSOR:
-                AdaptingPreviewProcessor adaptingPreviewProcessor = new
-                        AdaptingPreviewProcessor((PreviewImageProcessorImpl) mImpl.getProcessor());
-                builder.setCaptureProcessor(adaptingPreviewProcessor);
-                previewExtenderAdapter = new PreviewExtender.PreviewExtenderAdapter(mImpl,
-                        mContext, adaptingPreviewProcessor);
-                break;
-            default:
-                previewExtenderAdapter = new PreviewExtender.PreviewExtenderAdapter(mImpl,
-                        mContext, null);
-        }
-
-        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
-                new CameraEventCallbacks(previewExtenderAdapter));
-        builder.setUseCaseEventCallback(previewExtenderAdapter);
-        List<Pair<Integer, Size[]>> supportedResolutions =
-                PreviewExtender.getSupportedResolutions(mImpl);
-        if (supportedResolutions != null) {
-            builder.setSupportedResolutions(supportedResolutions);
-        }
+        PreviewExtender.updateBuilderConfig(builder, mEffectMode, mImpl, mContext);
 
         return builder.getUseCaseConfig();
     }
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 06430d6..de1935a 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -14,14 +14,17 @@
  * limitations under the License.
  */
 
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryVersions
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
+    id("kotlin-android")
 }
 
 dependencies {
@@ -37,6 +40,8 @@
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.test.espresso:espresso-idling-resource:3.1.0")
     implementation(JUNIT)
+    implementation(KOTLIN_STDLIB)
+    implementation(KOTLIN_COROUTINES_ANDROID)
 
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(ANDROIDX_TEST_RUNNER)
@@ -69,6 +74,13 @@
     }
 }
 
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
+
 androidx {
     name = "Jetpack Camera Testing Library"
     publish = Publish.NONE
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt b/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt
new file mode 100644
index 0000000..5c5d80b
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+
+package androidx.camera.testing
+
+import androidx.camera.core.impl.Observable
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.asExecutor
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.launch
+import kotlin.coroutines.ContinuationInterceptor
+
+public fun <T> Observable<T>.asFlow(): Flow<T> = callbackFlow {
+    val observer = object : Observable.Observer<T> {
+        override fun onNewData(value: T?) {
+            launch(start = CoroutineStart.UNDISPATCHED) {
+                send(value)
+            }
+        }
+
+        override fun onError(t: Throwable) {
+            // Close the channel with the error
+            close(t)
+        }
+    }
+
+    val producerDispatcher = coroutineContext[ContinuationInterceptor] as CoroutineDispatcher
+    addObserver(producerDispatcher.asExecutor(), observer)
+
+    awaitClose { removeObserver(observer) }
+}
\ No newline at end of file
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java
index 0edd780..9d40e6f 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java
@@ -30,6 +30,7 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.text.TextUtils;
+import android.util.Size;
 import android.view.Surface;
 import android.view.TextureView;
 
@@ -39,9 +40,10 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.Logger;
 import androidx.camera.testing.R;
+import androidx.core.util.Preconditions;
 import androidx.test.espresso.idling.CountingIdlingResource;
 
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -50,6 +52,7 @@
 
     private static final String TAG = "Camera2TestActivity";
     private static final int FRAMES_UNTIL_VIEW_IS_READY = 5;
+    private static final Size GUARANTEED_RESOLUTION = new Size(640, 480);
     public static final String EXTRA_CAMERA_ID = "androidx.camera.cameraId";
 
     /**
@@ -232,11 +235,14 @@
      */
     @SuppressWarnings("deprecation") /* createCaptureSession */
     void createCameraPreviewSession() {
+        Preconditions.checkNotNull(mCameraDevice);
         try {
             SurfaceTexture texture = mTextureView.getSurfaceTexture();
 
-            // We configure the size of default buffer to be the size of camera preview we want.
-            texture.setDefaultBufferSize(mTextureView.getWidth(), mTextureView.getHeight());
+            // We configure the size of default buffer to be the size of the guaranteed supported
+            // resolution, which is 640x480.
+            texture.setDefaultBufferSize(GUARANTEED_RESOLUTION.getWidth(),
+                    GUARANTEED_RESOLUTION.getHeight());
 
             // This is the output Surface we need to start preview.
             Surface surface = new Surface(texture);
@@ -247,7 +253,7 @@
             mPreviewRequestBuilder.addTarget(surface);
 
             // Here, we create a CameraCaptureSession for camera preview.
-            mCameraDevice.createCaptureSession(Arrays.asList(surface),
+            mCameraDevice.createCaptureSession(Collections.singletonList(surface),
                     new CameraCaptureSession.StateCallback() {
 
                         @Override
@@ -300,7 +306,9 @@
      * Stops the background thread and its {@link Handler}.
      */
     private void stopBackgroundThread() {
-        mBackgroundThread.quitSafely();
+        if (mBackgroundThread != null) {
+            mBackgroundThread.quitSafely();
+        }
         try {
             mBackgroundThread.join();
             mBackgroundThread = null;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
index c01fb74..0952135 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
@@ -17,13 +17,11 @@
 package androidx.camera.testing.activity;
 
 
-import static androidx.camera.testing.SurfaceTextureProvider.createSurfaceTextureProvider;
-
 import android.graphics.SurfaceTexture;
 import android.os.Bundle;
 import android.util.Size;
+import android.view.Surface;
 import android.view.TextureView;
-import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -34,10 +32,10 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.core.impl.CameraInternal;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.R;
-import androidx.camera.testing.SurfaceTextureProvider;
 import androidx.test.espresso.idling.CountingIdlingResource;
 
 import java.util.Collections;
@@ -49,17 +47,15 @@
 
     private static final String TAG = "CameraXTestActivity";
     private static final int FRAMES_UNTIL_VIEW_IS_READY = 5;
+
     @Nullable
     private Preview mPreview;
     @Nullable
-    public String mCameraId = null;
-    @CameraSelector.LensFacing
-    public int mLensFacing = CameraSelector.LENS_FACING_BACK;
-
-    CameraUseCaseAdapter mCameraUseCaseAdapter = null;
-
-    @VisibleForTesting
-    public final CountingIdlingResource mPreviewReady = new CountingIdlingResource("PreviewReady");
+    private String mCameraId = null;
+    @Nullable
+    private CameraUseCaseAdapter mCameraUseCaseAdapter = null;
+    @NonNull
+    final CountingIdlingResource mPreviewReady = new CountingIdlingResource("PreviewReady");
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -85,7 +81,7 @@
         }
     }
 
-    void enablePreview() {
+    private void enablePreview() {
         for (int i = 0; i < FRAMES_UNTIL_VIEW_IS_READY; i++) {
             mPreviewReady.increment();
         }
@@ -95,42 +91,56 @@
             return;
         }
 
+        int lensFacing;
         if (CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)) {
-            mLensFacing = CameraSelector.LENS_FACING_BACK;
+            lensFacing = CameraSelector.LENS_FACING_BACK;
         } else if (CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_FRONT)) {
-            mLensFacing = CameraSelector.LENS_FACING_FRONT;
+            lensFacing = CameraSelector.LENS_FACING_FRONT;
         } else {
             throw new IllegalArgumentException("Cannot find camera to use");
         }
+        final CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(
+                lensFacing).build();
 
         mPreview = new Preview.Builder()
                 .setTargetName("Preview")
                 .build();
-        TextureView textureView = findViewById(R.id.textureView);
-        mPreview.setSurfaceProvider(createSurfaceTextureProvider(
-                new SurfaceTextureProvider.SurfaceTextureCallback() {
+
+        final TextureView textureView = findViewById(R.id.textureView);
+        textureView.setSurfaceTextureListener(
+                new TextureView.SurfaceTextureListener() {
                     @Override
-                    public void onSurfaceTextureReady(@NonNull SurfaceTexture surfaceTexture,
-                            @NonNull Size resolution) {
-                        ViewGroup viewGroup = (ViewGroup) textureView.getParent();
-                        viewGroup.removeView(textureView);
-                        viewGroup.addView(textureView);
-                        textureView.setSurfaceTexture(surfaceTexture);
+                    public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture,
+                            int width, int height) {
+                        Logger.d(TAG, "SurfaceTexture available");
+                        setSurfaceProvider(surfaceTexture);
                     }
 
                     @Override
-                    public void onSafeToRelease(@NonNull SurfaceTexture surfaceTexture) {
-                        surfaceTexture.release();
+                    public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture,
+                            int width, int height) {
+                        Logger.d(TAG, "SurfaceTexture size changed " + width + "x" + height);
                     }
-                }));
 
+                    @Override
+                    public boolean onSurfaceTextureDestroyed(
+                            @NonNull SurfaceTexture surfaceTexture) {
+                        Logger.d(TAG, "SurfaceTexture destroyed");
+                        return true;
+                    }
 
-        CameraSelector cameraSelector =
-                new CameraSelector.Builder().requireLensFacing(mLensFacing).build();
+                    @Override
+                    public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {
+                        // Wait until surface texture receives enough updates.
+                        if (!mPreviewReady.isIdleNow()) {
+                            mPreviewReady.decrement();
+                        }
+                    }
+                });
 
         try {
-            CameraX cameraX = CameraX.getOrCreateInstance(this).get();
-            LinkedHashSet<CameraInternal> cameras =
+            final CameraX cameraX = CameraX.getOrCreateInstance(this).get();
+            final LinkedHashSet<CameraInternal> cameras =
                     cameraSelector.filter(cameraX.getCameraRepository().getCameras());
             mCameraUseCaseAdapter = new CameraUseCaseAdapter(cameras,
                     cameraX.getCameraDeviceSurfaceManager(), cameraX.getDefaultConfigFactory());
@@ -146,33 +156,35 @@
 
         mCameraId = CameraX.getCameraWithCameraSelector(
                 cameraSelector).getCameraInfoInternal().getCameraId();
-
-        textureView.setSurfaceTextureListener(
-                new TextureView.SurfaceTextureListener() {
-                    @Override
-                    public void onSurfaceTextureAvailable(
-                            @NonNull SurfaceTexture surfaceTexture, int i, int i1) {
-                    }
-
-                    @Override
-                    public void onSurfaceTextureSizeChanged(
-                            @NonNull SurfaceTexture surfaceTexture, int i, int i1) {
-                    }
-
-                    @Override
-                    public boolean onSurfaceTextureDestroyed(
-                            @NonNull SurfaceTexture surfaceTexture) {
-                        return true;
-                    }
-
-                    @Override
-                    public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {
-                        // Wait until surface texture receives enough updates.
-                        if (!mPreviewReady.isIdleNow()) {
-                            mPreviewReady.decrement();
-                        }
-                    }
-                });
     }
 
+    void setSurfaceProvider(@NonNull SurfaceTexture surfaceTexture) {
+        if (mPreview == null) {
+            return;
+        }
+        mPreview.setSurfaceProvider((surfaceRequest) -> {
+            final Size resolution = surfaceRequest.getResolution();
+            surfaceTexture.setDefaultBufferSize(resolution.getWidth(), resolution.getHeight());
+
+            final Surface surface = new Surface(surfaceTexture);
+            surfaceRequest.provideSurface(
+                    surface,
+                    CameraXExecutors.directExecutor(),
+                    (surfaceResponse) -> {
+                        surface.release();
+                        surfaceTexture.release();
+                    });
+        });
+    }
+
+    @Nullable
+    public String getCameraId() {
+        return mCameraId;
+    }
+
+    @VisibleForTesting
+    @NonNull
+    public CountingIdlingResource getPreviewReady() {
+        return mPreviewReady;
+    }
 }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
index 9dd7dec..2f31568 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
@@ -17,9 +17,12 @@
 package androidx.camera.testing.fakes;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.annotation.experimental.UseExperimental;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraXConfig;
+import androidx.camera.core.ExperimentalAvailableCamerasLimiter;
 import androidx.camera.core.impl.CameraDeviceSurfaceManager;
 import androidx.camera.core.impl.CameraFactory;
 
@@ -36,10 +39,21 @@
     private static final String CAMERA_ID_1 = "1";
 
     /** Generates a fake {@link CameraXConfig}. */
+    @UseExperimental(markerClass = ExperimentalAvailableCamerasLimiter.class)
     @NonNull
     public static CameraXConfig create() {
-        CameraFactory.Provider cameraFactoryProvider = (ignored1, ignored2, ignored3) -> {
-            FakeCameraFactory cameraFactory = new FakeCameraFactory();
+        return create(null);
+    }
+
+    /**
+     * Generates a fake {@link CameraXConfig} with the provided {@linkplain CameraSelector
+     * available cameras limiter}.
+     */
+    @ExperimentalAvailableCamerasLimiter
+    @NonNull
+    public static CameraXConfig create(@Nullable CameraSelector availableCamerasSelector) {
+        final CameraFactory.Provider cameraFactoryProvider = (ignored1, ignored2, ignored3) -> {
+            final FakeCameraFactory cameraFactory = new FakeCameraFactory(availableCamerasSelector);
             cameraFactory.insertCamera(CameraSelector.LENS_FACING_BACK, CAMERA_ID_0,
                     () -> new FakeCamera(CAMERA_ID_0, null,
                             new FakeCameraInfoInternal(CAMERA_ID_0, 0,
@@ -51,14 +65,17 @@
             return cameraFactory;
         };
 
-        CameraDeviceSurfaceManager.Provider surfaceManagerProvider =
+        final CameraDeviceSurfaceManager.Provider surfaceManagerProvider =
                 (ignored1, ignored2, ignored3) -> new FakeCameraDeviceSurfaceManager();
 
-        CameraXConfig.Builder appConfigBuilder =
-                new CameraXConfig.Builder()
-                        .setCameraFactoryProvider(cameraFactoryProvider)
-                        .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
-                        .setUseCaseConfigFactoryProvider(ignored -> new FakeUseCaseConfigFactory());
+        final CameraXConfig.Builder appConfigBuilder = new CameraXConfig.Builder()
+                .setCameraFactoryProvider(cameraFactoryProvider)
+                .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
+                .setUseCaseConfigFactoryProvider(ignored -> new FakeUseCaseConfigFactory());
+
+        if (availableCamerasSelector != null) {
+            appConfigBuilder.setAvailableCamerasLimiter(availableCamerasSelector);
+        }
 
         return appConfigBuilder.build();
     }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
index 57ef5a5..ab7ce10 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
@@ -21,14 +21,18 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.CameraSelector;
+import androidx.camera.core.Logger;
 import androidx.camera.core.impl.CameraFactory;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.core.util.Pair;
 import androidx.core.util.Preconditions;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
@@ -40,12 +44,26 @@
  */
 @RestrictTo(Scope.LIBRARY_GROUP)
 public final class FakeCameraFactory implements CameraFactory {
+
+    private static final String TAG = "FakeCameraFactory";
+
     @Nullable
     private Set<String> mCachedCameraIds;
 
+    @Nullable
+    private final CameraSelector mAvailableCamerasSelector;
+
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     final Map<String, Pair<Integer, Callable<CameraInternal>>> mCameraMap = new HashMap<>();
 
+    public FakeCameraFactory() {
+        mAvailableCamerasSelector = null;
+    }
+
+    public FakeCameraFactory(@Nullable CameraSelector availableCamerasSelector) {
+        mAvailableCamerasSelector = availableCamerasSelector;
+    }
+
     @Override
     @NonNull
     public CameraInternal getCamera(@NonNull String cameraId) {
@@ -112,12 +130,45 @@
         // Lazily cache the set of all camera ids. This cache will be invalidated anytime a new
         // camera is added.
         if (mCachedCameraIds == null) {
-            mCachedCameraIds = Collections.unmodifiableSet(new HashSet<>(mCameraMap.keySet()));
+            if (mAvailableCamerasSelector == null) {
+                mCachedCameraIds = Collections.unmodifiableSet(new HashSet<>(mCameraMap.keySet()));
+            } else {
+                mCachedCameraIds = Collections.unmodifiableSet(new HashSet<>(filteredCameraIds()));
+            }
         }
-
         return mCachedCameraIds;
     }
 
+    /** Returns a list of camera ids filtered with {@link #mAvailableCamerasSelector}. */
+    @NonNull
+    private List<String> filteredCameraIds() {
+        Preconditions.checkNotNull(mAvailableCamerasSelector);
+        final List<String> filteredCameraIds = new ArrayList<>();
+        for (Map.Entry<String, Pair<Integer, Callable<CameraInternal>>> entry :
+                mCameraMap.entrySet()) {
+            final Callable<CameraInternal> callable = entry.getValue().second;
+            if (callable == null) {
+                continue;
+            }
+            try {
+                final CameraInternal camera = callable.call();
+                try {
+                    // CameraSelector.filter() throws an exception if all the cameras it takes
+                    // are filtered out. In the scenario below, only one camera is processed, so
+                    // if an exception isn't thrown, it's safe to add the camera id.
+                    mAvailableCamerasSelector.filter(
+                            new LinkedHashSet<>(Collections.singleton(camera)));
+                    filteredCameraIds.add(entry.getKey());
+                } catch (IllegalArgumentException exception) {
+                    // No op. The camera was not selected by the selector
+                }
+            } catch (Exception exception) {
+                Logger.e(TAG, "Failed to get access to the camera instance.", exception);
+            }
+        }
+        return filteredCameraIds;
+    }
+
     @Nullable
     @Override
     public Object getCameraManager() {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java
index 7759f10..3c0c172 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java
@@ -31,7 +31,9 @@
 import androidx.camera.core.impl.OptionsBundle;
 import androidx.camera.core.impl.SessionConfig;
 import androidx.camera.core.impl.UseCaseConfig;
+import androidx.core.util.Consumer;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 
@@ -218,5 +220,14 @@
             getMutableConfig().insertOption(OPTION_INPUT_FORMAT, imageFormat);
             return this;
         }
+
+        @NonNull
+        @Override
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
     }
 }
diff --git a/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraFactoryTest.java b/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraFactoryTest.java
new file mode 100644
index 0000000..cecde46
--- /dev/null
+++ b/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraFactoryTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.testing.fakes;
+
+import static androidx.camera.core.CameraSelector.DEFAULT_BACK_CAMERA;
+import static androidx.camera.core.CameraSelector.DEFAULT_FRONT_CAMERA;
+import static androidx.camera.core.CameraSelector.LENS_FACING_BACK;
+import static androidx.camera.core.CameraSelector.LENS_FACING_FRONT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Build;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+import java.util.Set;
+
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class FakeCameraFactoryTest {
+
+    private static final String CAMERA_ID_0 = "0";
+    private static final String CAMERA_ID_1 = "1";
+
+    @Test
+    public void availableCameraSelectorNotProvided_getAllCameraIds() {
+        // Arrange
+        final FakeCameraFactory factory = new FakeCameraFactory();
+        insertCamera(factory, LENS_FACING_BACK, CAMERA_ID_0);
+        insertCamera(factory, LENS_FACING_FRONT, CAMERA_ID_1);
+
+        // Act
+        final Set<String> cameraIds = factory.getAvailableCameraIds();
+
+        // Assert
+        assertThat(cameraIds).containsExactly(CAMERA_ID_0, CAMERA_ID_1);
+    }
+
+    @Test
+    public void availableCameraSelectorMatchesAllCameras_getAllCameraIds() {
+        // Arrange
+        final FakeCameraFactory factory = new FakeCameraFactory(DEFAULT_BACK_CAMERA);
+        insertCamera(factory, LENS_FACING_BACK, CAMERA_ID_0);
+        insertCamera(factory, LENS_FACING_BACK, CAMERA_ID_1);
+
+        // Act
+        final Set<String> cameraIds = factory.getAvailableCameraIds();
+
+        // Assert
+        assertThat(cameraIds).containsExactly(CAMERA_ID_0, CAMERA_ID_1);
+    }
+
+    @Test
+    public void availableCameraSelectorMatchesSubsetOfCameras_getFilteredCameraIds() {
+        // Arrange
+        final FakeCameraFactory factory = new FakeCameraFactory(DEFAULT_BACK_CAMERA);
+        insertCamera(factory, LENS_FACING_BACK, CAMERA_ID_0);
+        insertCamera(factory, LENS_FACING_FRONT, CAMERA_ID_1);
+
+        // Act
+        final Set<String> cameraIds = factory.getAvailableCameraIds();
+
+        // Assert
+        assertThat(cameraIds).containsExactly(CAMERA_ID_0);
+    }
+
+    @Test
+    public void availableCameraSelectorMatchesNoCameras_getNoCameraIds() {
+        // Arrange
+        final FakeCameraFactory factory = new FakeCameraFactory(DEFAULT_FRONT_CAMERA);
+        insertCamera(factory, LENS_FACING_BACK, CAMERA_ID_0);
+        insertCamera(factory, LENS_FACING_BACK, CAMERA_ID_1);
+
+        // Act
+        final Set<String> cameraIds = factory.getAvailableCameraIds();
+
+        // Assert
+        assertThat(cameraIds).isEmpty();
+    }
+
+    private void insertCamera(FakeCameraFactory factory, int lensFacing, String cameraId) {
+        factory.insertCamera(lensFacing, cameraId, () -> new FakeCamera(cameraId, null,
+                new FakeCameraInfoInternal(cameraId, 0, lensFacing)));
+    }
+}
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt
new file mode 100644
index 0000000..947036e
--- /dev/null
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video
+
+import androidx.camera.testing.asFlow
+import androidx.camera.video.internal.VideoOutput
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class VideoOutputTest {
+
+    @Test
+    fun getStreamState_defaultsToActive(): Unit = runBlocking {
+        // Create an anonymous subclass of VideoOutput. Don't override
+        // VideoOutput#getStreamState() so the default implementation is used.
+        val videoOutput = VideoOutput { request -> request.willNotProvideSurface() }
+
+        val streamState = videoOutput.streamState.asFlow().first()
+        assertThat(streamState).isEqualTo(VideoOutput.StreamState.ACTIVE)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
index 3b16b89..05ec5aa 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
@@ -22,6 +22,7 @@
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_RESOLUTION;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
+import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
 import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -99,6 +100,7 @@
 import androidx.camera.video.impl.VideoCaptureLegacyConfig;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
+import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -109,6 +111,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.nio.ByteBuffer;
+import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.Executor;
@@ -1631,6 +1634,18 @@
             getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
             return this;
         }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setAttachedUseCasesUpdateListener(
+                @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
+            getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
+                    attachedUseCasesUpdateListener);
+            return this;
+        }
+
     }
 
     /**
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/VideoOutput.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/VideoOutput.java
new file mode 100644
index 0000000..4c37022
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/VideoOutput.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal;
+
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.camera.core.SurfaceRequest;
+import androidx.camera.core.impl.ConstantObservable;
+import androidx.camera.core.impl.Observable;
+import androidx.core.util.Consumer;
+
+import java.util.concurrent.Executor;
+
+/**
+ * A class that will produce video data from a {@link Surface}.
+ *
+ * <p>Implementations will provide a {@link Surface} to a video frame producer via the
+ * {@link SurfaceRequest} sent to {@link #onSurfaceRequested(SurfaceRequest)}.
+ *
+ * <p>The type of video data produced by a video output and API for saving or communicating that
+ * data is left to the implementation.
+ */
+public interface VideoOutput {
+    /**
+     * A state which represents whether the video output is ready for frame streaming.
+     *
+     * <p>This is used in the observable returned by {@link #getStreamState()} to inform producers
+     * that they can start or stop producing frames.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    enum StreamState {
+        /** The video output is active and ready to receive frames. */
+        ACTIVE,
+        /** The video output is inactive and any frames sent will be discarded. */
+        INACTIVE;
+
+        static final Observable<StreamState> ALWAYS_ACTIVE_OBSERVABLE =
+                ConstantObservable.withValue(StreamState.ACTIVE);
+    }
+
+    /**
+     * Called when a new {@link Surface} has been requested by a video frame producer.
+     *
+     * <p>This is called when a video frame producer is ready to receive a surface that it can
+     * use to send video frames to the video output.
+     * The video frame producer may repeatedly request a surface more than once, but only the
+     * latest {@link SurfaceRequest} should be considered active. All previous surface requests
+     * will complete by sending a {@link androidx.camera.core.SurfaceRequest.Result} to the
+     * consumer passed to {@link SurfaceRequest#provideSurface(Surface, Executor, Consumer)}.
+     *
+     * <p>A request is considered active until it is
+     * {@linkplain SurfaceRequest#provideSurface(Surface, Executor, androidx.core.util.Consumer)
+     * fulfilled}, {@linkplain SurfaceRequest#willNotProvideSurface() marked as 'will not
+     * complete'}, or
+     * {@linkplain SurfaceRequest#addRequestCancellationListener(Executor, Runnable) cancelled
+     * by the video frame producer}. After one of these conditions occurs, a request is considered
+     * completed.
+     *
+     * <p>Once a request is successfully completed, it is guaranteed that if a new request is
+     * made, the {@link Surface} used to fulfill the previous request will be detached from the
+     * video frame producer and {@link SurfaceRequest#provideSurface(Surface, Executor, Consumer)}
+     * will be invoked with a {@link androidx.camera.core.SurfaceRequest.Result} containing
+     * {@link androidx.camera.core.SurfaceRequest.Result#RESULT_SURFACE_USED_SUCCESSFULLY}.
+     *
+     * @param request the request for a surface which contains the requirements of the
+     *                surface and methods for completing the request.
+     */
+    void onSurfaceRequested(@NonNull SurfaceRequest request);
+
+    /**
+     * Observable state which can be used to determine if the video output is ready for streaming.
+     *
+     * <p>When the StreamState is ACTIVE, the {@link Surface} provided to
+     * {@link #onSurfaceRequested} should be ready to consume frames.
+     *
+     * <p>When the StreamState is INACTIVE, any frames drawn to the {@link Surface} may be
+     * discarded.
+     *
+     * <p>This can be used by video producers to determine when frames should be drawn to the
+     * {@link Surface} to ensure they are not doing excess work.
+     *
+     * <p>Implementers of the VideoOutput interface should consider overriding this method
+     * as a performance improvement. The default implementation returns an {@link Observable}
+     * which is always {@link StreamState#ACTIVE}.
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(Scope.LIBRARY)
+    default Observable<StreamState> getStreamState() {
+        return StreamState.ALWAYS_ACTIVE_OBSERVABLE;
+    }
+}
diff --git a/camera/camera-view/api/api_lint.ignore b/camera/camera-view/api/api_lint.ignore
index 72057f1..8e9fbcf 100644
--- a/camera/camera-view/api/api_lint.ignore
+++ b/camera/camera-view/api/api_lint.ignore
@@ -1,8 +1,5 @@
 // Baseline format: 1.0
-AutoBoxing: androidx.camera.view.CameraView#setCameraLensFacing(Integer) parameter #0:
-    Must avoid boxed primitives (`java.lang.Integer`)
 AutoBoxing: androidx.camera.view.CameraView#getCameraLensFacing():
     Must avoid boxed primitives (`java.lang.Integer`)
-
-StreamFiles: androidx.camera.view.CameraView#startRecording(java.io.File, java.util.concurrent.Executor, androidx.camera.core.VideoCapture.OnVideoSavedCallback):
-    Methods accepting `File` should also accept `FileDescriptor` or streams: method androidx.camera.view.CameraView.startRecording(java.io.File,java.util.concurrent.Executor,androidx.camera.core.VideoCapture.OnVideoSavedCallback)
\ No newline at end of file
+AutoBoxing: androidx.camera.view.CameraView#setCameraLensFacing(Integer) parameter #0:
+    Must avoid boxed primitives (`java.lang.Integer`)
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 920ad96..8501e95 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
@@ -66,9 +66,7 @@
     private static final String TAG = "CameraExtensionActivity";
     private static final int PERMISSIONS_REQUEST_CODE = 42;
 
-    private static final CameraSelector CAMERA_SELECTOR =
-            new CameraSelector.Builder().requireLensFacing(
-                    CameraSelector.LENS_FACING_BACK).build();
+    private CameraSelector mCurrentCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
 
     boolean mPermissionsGranted = false;
     private CallbackToFutureAdapter.Completer<Boolean> mPermissionCompleter;
@@ -117,11 +115,9 @@
     /**
      * Sets up the appropriate UseCases.
      */
-    private void setupUseCases() {
-        Button button = findViewById(R.id.PhotoToggle);
+    private void bindUseCases() {
         ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder().setTargetName(
                 "ImageCapture");
-
         mImageCapture = imageCaptureBuilder.build();
 
         Preview.Builder previewBuilder = new Preview.Builder().setTargetName("Preview");
@@ -129,10 +125,23 @@
         mPreview = previewBuilder.build();
         mPreview.setSurfaceProvider(mPreviewView.getSurfaceProvider());
 
-        mCameraProvider.bindToLifecycle(this, CAMERA_SELECTOR, mImageCapture, mPreview);
+        mCamera = mCameraProvider.bindToLifecycle(this, mCurrentCameraSelector,
+                mImageCapture, mPreview);
+    }
 
-        enableNextExtension();
-        button.setOnClickListener((view) -> enableNextExtension());
+    void setupButtons() {
+        Button btnToggleMode = findViewById(R.id.PhotoToggle);
+        Button btnSwitchCamera = findViewById(R.id.Switch);
+        btnToggleMode.setOnClickListener(view -> enableNextExtension());
+        btnSwitchCamera.setOnClickListener(view -> switchCameras());
+    }
+
+    void switchCameras() {
+        mCameraProvider.unbindAll();
+        mCurrentCameraSelector = (mCurrentCameraSelector == CameraSelector.DEFAULT_BACK_CAMERA)
+                ? CameraSelector.DEFAULT_FRONT_CAMERA : CameraSelector.DEFAULT_BACK_CAMERA;
+        bindUseCases();
+        enableExtension(mCurrentImageCaptureType);
     }
 
     @Extensions.ExtensionMode
@@ -253,7 +262,7 @@
     void createUseCases() {
         ExtensionsManager.setExtensionsErrorListener((errorCode) ->
                 Log.d(TAG, "Extensions error in error code: " + errorCode));
-        setupUseCases();
+        bindUseCases();
     }
 
     @SuppressWarnings("UnstableApiUsage")
@@ -303,7 +312,7 @@
             return;
         }
 
-        mCamera = mCameraProvider.bindToLifecycle(this, CAMERA_SELECTOR);
+        mCamera = mCameraProvider.bindToLifecycle(this, mCurrentCameraSelector);
         ListenableFuture<ExtensionsManager.ExtensionsAvailability> availability =
                 ExtensionsManager.init(getApplicationContext());
 
@@ -319,6 +328,8 @@
                                 mExtensions = ExtensionsManager.getExtensions(
                                         getApplicationContext());
                                 createUseCases();
+                                enableNextExtension();
+                                setupButtons();
                                 break;
                             case LIBRARY_UNAVAILABLE_ERROR_LOADING:
                             case LIBRARY_UNAVAILABLE_MISSING_IMPLEMENTATION:
diff --git a/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml b/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml
index 4b31149..dc3c91f 100644
--- a/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml
+++ b/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml
@@ -73,4 +73,12 @@
         app:layout_constraintStart_toStartOf="@+id/constraintLayout"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintVertical_bias="0.0"/>
+
+    <Button
+        android:id="@+id/Switch"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Switch"
+        app:layout_constraintEnd_toStartOf="@+id/Picture"
+        app:layout_constraintTop_toTopOf="@+id/Picture" />
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index 7aab12a..93b5090 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -931,7 +931,6 @@
     method public int getImportance();
     method public android.graphics.Bitmap? getLargeIcon();
     method @DrawableRes public int getSmallIcon();
-    method public boolean isExtended();
     method public static boolean isExtended(android.app.Notification);
   }
 
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index 7aab12a..93b5090 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -931,7 +931,6 @@
     method public int getImportance();
     method public android.graphics.Bitmap? getLargeIcon();
     method @DrawableRes public int getSmallIcon();
-    method public boolean isExtended();
     method public static boolean isExtended(android.app.Notification);
   }
 
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index 7aab12a..93b5090 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -931,7 +931,6 @@
     method public int getImportance();
     method public android.graphics.Bitmap? getLargeIcon();
     method @DrawableRes public int getSmallIcon();
-    method public boolean isExtended();
     method public static boolean isExtended(android.app.Notification);
   }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java b/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java
index 1d60b854..7bfbfc9 100644
--- a/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java
+++ b/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java
@@ -130,8 +130,7 @@
 public final class CarAppExtender implements NotificationCompat.Extender {
     private static final String TAG = "CarAppExtender";
 
-    private static final String EXTRA_CAR_EXTENDER = "android.car.app.EXTENSIONS";
-    private static final String EXTRA_IS_EXTENDED = "android.car.app.EXTENDED";
+    private static final String EXTRA_CAR_EXTENDER = "androidx.car.app.EXTENSIONS";
     private static final String EXTRA_CONTENT_TITLE = "content_title";
     private static final String EXTRA_CONTENT_TEXT = "content_text";
     private static final String EXTRA_SMALL_RES_ID = "small_res_id";
@@ -142,7 +141,6 @@
     private static final String EXTRA_IMPORTANCE = "importance";
     private static final String EXTRA_COLOR = "color";
 
-    private boolean mIsExtended;
     @Nullable
     private CharSequence mContentTitle;
     @Nullable
@@ -173,7 +171,6 @@
             return;
         }
 
-        mIsExtended = carBundle.getBoolean(EXTRA_IS_EXTENDED);
         mContentTitle = carBundle.getCharSequence(EXTRA_CONTENT_TITLE);
         mContentText = carBundle.getCharSequence(EXTRA_CONTENT_TEXT);
         mSmallIconResId = carBundle.getInt(EXTRA_SMALL_RES_ID);
@@ -222,8 +219,6 @@
         requireNonNull(builder);
         Bundle carExtensions = new Bundle();
 
-        carExtensions.putBoolean(EXTRA_IS_EXTENDED, true);
-
         if (mContentTitle != null) {
             carExtensions.putCharSequence(EXTRA_CONTENT_TITLE, mContentTitle);
         }
@@ -268,13 +263,6 @@
     }
 
     /**
-     * Returns whether the notification was extended with {@link CarAppExtender}.
-     */
-    public boolean isExtended() {
-        return mIsExtended;
-    }
-
-    /**
      * Returns whether the given notification was extended with {@link CarAppExtender}.
      *
      * @throws NullPointerException if {@code notification} is {@code null}
@@ -285,8 +273,7 @@
             return false;
         }
 
-        extras = extras.getBundle(EXTRA_CAR_EXTENDER);
-        return extras != null && extras.getBoolean(EXTRA_IS_EXTENDED);
+        return extras.getBundle(EXTRA_CAR_EXTENDER) != null;
     }
 
     /**
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
index 538f6d7..d2745ca 100644
--- a/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
@@ -66,14 +66,13 @@
                                             @NonNull NotificationCompat.Builder builder) {
                                         Bundle carExtensions = new Bundle();
 
-                                        builder.getExtras().putBundle("android.car.app.EXTENSIONS",
+                                        builder.getExtras().putBundle("androidx.car.app.EXTENSIONS",
                                                 carExtensions);
                                         return builder;
                                     }
                                 });
 
         CarAppExtender carAppExtender = new CarAppExtender(builder.build());
-        assertThat(carAppExtender.isExtended()).isFalse();
         assertThat(carAppExtender.getContentTitle()).isNull();
         assertThat(carAppExtender.getContentText()).isNull();
         assertThat(carAppExtender.getSmallIcon()).isEqualTo(0);
diff --git a/cardview/cardview/api/api_lint.ignore b/cardview/cardview/api/api_lint.ignore
new file mode 100644
index 0000000..504b240
--- /dev/null
+++ b/cardview/cardview/api/api_lint.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+GetterSetterNames: androidx.cardview.widget.CardView#getPreventCornerOverlap():
+    Symmetric method for `setPreventCornerOverlap` must be named `isPreventCornerOverlap`; was `getPreventCornerOverlap`
+GetterSetterNames: androidx.cardview.widget.CardView#getUseCompatPadding():
+    Symmetric method for `setUseCompatPadding` must be named `isUseCompatPadding`; was `getUseCompatPadding`
diff --git a/collection/collection/api/api_lint.ignore b/collection/collection/api/api_lint.ignore
index 60ae519..283c5cb 100644
--- a/collection/collection/api/api_lint.ignore
+++ b/collection/collection/api/api_lint.ignore
@@ -1,12 +1,12 @@
 // Baseline format: 1.0
+ArrayReturn: androidx.collection.ArraySet#ArraySet(E[]) parameter #0:
+    Method parameter should be Collection<E> (or subclass) instead of raw array; was `E[]`
 ArrayReturn: androidx.collection.ArraySet#toArray():
     Method should return Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
 ArrayReturn: androidx.collection.ArraySet#toArray(T[]):
     Method should return Collection<T> (or subclass) instead of raw array; was `T[]`
 ArrayReturn: androidx.collection.ArraySet#toArray(T[]) parameter #0:
     Method parameter should be Collection<T> (or subclass) instead of raw array; was `T[]`
-ArrayReturn: androidx.collection.ArraySet#ArraySet(E[]) parameter #0:
-    Method parameter should be Collection<E> (or subclass) instead of raw array; was `E[]`
 
 
 KotlinOperator: androidx.collection.CircularArray#get(int):
diff --git a/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/ComplexInteractions.kt b/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/ComplexInteractions.kt
index 5a44235..e596cbe44 100644
--- a/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/ComplexInteractions.kt
+++ b/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/ComplexInteractions.kt
@@ -38,8 +38,8 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientContext
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 
@@ -56,7 +56,7 @@
 
 @Composable
 fun ComposeInAndroidInComposeEtcTargetingDemo() {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     Column {
         Text(
             "In this demo, from the inside out, we have a Compose Button, wrapped in 2 Android " +
diff --git a/compose/animation/animation-core/api/api_lint.ignore b/compose/animation/animation-core/api/api_lint.ignore
index 7d65c55..8684a3f 100644
--- a/compose/animation/animation-core/api/api_lint.ignore
+++ b/compose/animation/animation-core/api/api_lint.ignore
@@ -1,7 +1,3 @@
 // Baseline format: 1.0
 CallbackName: androidx.compose.animation.core.AnimationClockObserver:
     Class should be named AnimationClockCallback
-
-
-NotCloseable: androidx.compose.animation.core.BaseAnimatedValue:
-    Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class androidx.compose.animation.core.BaseAnimatedValue
diff --git a/compose/animation/animation-core/src/androidMain/kotlin/androidx/compose/animation/core/AndroidAnimationClock.kt b/compose/animation/animation-core/src/androidMain/kotlin/androidx/compose/animation/core/AndroidAnimationClock.kt
index 918f9c5..f961f35 100644
--- a/compose/animation/animation-core/src/androidMain/kotlin/androidx/compose/animation/core/AndroidAnimationClock.kt
+++ b/compose/animation/animation-core/src/androidMain/kotlin/androidx/compose/animation/core/AndroidAnimationClock.kt
@@ -34,7 +34,7 @@
 /**
  * Default Choreographer based clock that pushes a new frame to all subscribers on each
  * Choreographer tick, until all subscribers have unsubscribed. An instance of this clock will be
- * provided through [AnimationClockAmbient][androidx.compose.ui.platform.AnimationClockAmbient] at
+ * provided through [LocalAnimationClock][androidx.compose.ui.platform.LocalAnimationClock] at
  * the root of the composition tree.
  *
  * If initialized from any other thread but the main thread, part of the initialization is done
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
index d7b4510..fd4e60c 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
@@ -424,11 +424,12 @@
         }
 
         @PublishedApi
+        @Suppress("ControlFlowWithEmptyBody")
         // This gets called *during* composition
         internal fun updateInitialAndTargetValue(initialValue: T, targetValue: T) {
             this.targetValue = targetValue
             if (animation.initialValue == initialValue && animation.targetValue == targetValue) {
-                return
+                // TODO(b/178811102): we should be able to return early here.
             }
             updateAnimation(initialValue)
         }
@@ -458,8 +459,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -533,8 +534,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -568,8 +569,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -599,8 +600,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -630,8 +631,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -661,8 +662,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -692,8 +693,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -723,8 +724,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
@@ -753,9 +754,10 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
- * [Transition] will start running again to ensure this animation reaches its new target smoothly.
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState),
+ * the [Transition] will start running again to ensure this animation reaches its new target
+ * smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
  * each pair of initialState and targetState. [FiniteAnimationSpec] includes any non-infinite
@@ -784,8 +786,8 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
  * [Transition] will start running again to ensure this animation reaches its new target smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateContentSizeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateContentSizeDemo.kt
index 1a92a86..fb933a0 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateContentSizeDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateContentSizeDemo.kt
@@ -31,8 +31,8 @@
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.AmbientTextStyle
 import androidx.compose.material.Button
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
@@ -82,7 +82,7 @@
             } else {
                 longText
             },
-            style = AmbientTextStyle.current.copy(color = Color.White)
+            style = LocalTextStyle.current.copy(color = Color.White)
         )
     }
 }
@@ -101,7 +101,7 @@
             } else {
                 longText
             },
-            style = AmbientTextStyle.current.copy(color = Color.White),
+            style = LocalTextStyle.current.copy(color = Color.White),
             modifier = Modifier.animateContentSize()
         )
     }
@@ -123,7 +123,7 @@
             } else {
                 "16 : 9"
             },
-            style = AmbientTextStyle.current.copy(color = Color.Black)
+            style = LocalTextStyle.current.copy(color = Color.Black)
         )
     }
 }
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt
index 78b8aee..ba7059e 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimationModifierSample.kt
@@ -24,7 +24,7 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.AmbientTextStyle
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
@@ -58,7 +58,7 @@
             } else {
                 longText
             },
-            style = AmbientTextStyle.current.copy(color = Color.White)
+            style = LocalTextStyle.current.copy(color = Color.White)
         )
     }
 }
diff --git a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
index 8c48ac2..a069b0e 100644
--- a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
+++ b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.IntOffset
@@ -89,7 +89,7 @@
                     }
                 }
             }
-            density = AmbientDensity.current.density
+            density = LocalDensity.current.density
         }
 
         rule.runOnIdle {
@@ -199,7 +199,7 @@
                     }
                 }
             }
-            density = AmbientDensity.current.density
+            density = LocalDensity.current.density
         }
 
         rule.runOnIdle {
diff --git a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt
index 49ef8bd..997558f 100644
--- a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt
+++ b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimationModifierTest.kt
@@ -28,8 +28,8 @@
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -100,7 +100,7 @@
                     }
                     .size(width.dp, height.dp)
             )
-            density = AmbientDensity.current.density
+            density = LocalDensity.current.density
         }
 
         rule.runOnUiThread {
diff --git a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
index a73246b..cb3bb00 100644
--- a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
+++ b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
@@ -22,12 +22,15 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.saveable.rememberSaveableStateHolder
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import org.junit.Assert.assertEquals
 import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
@@ -151,6 +154,56 @@
         rule.onNodeWithText(Second).assertExists()
     }
 
+    @Test
+    fun crossfadeTest_rememberSaveableIsNotRecreatedForScreens() {
+        rule.mainClock.autoAdvance = false
+
+        val duration = 100
+        var showFirst by mutableStateOf(true)
+        var counter = 1
+        var counter1 = 0
+        var counter2 = 0
+        rule.setContent {
+            val saveableStateHolder = rememberSaveableStateHolder()
+            Crossfade(
+                showFirst,
+                animationSpec = TweenSpec(durationMillis = duration)
+            ) {
+                saveableStateHolder.SaveableStateProvider(it) {
+                    if (it) {
+                        counter1 = rememberSaveable { counter++ }
+                    } else {
+                        counter2 = rememberSaveable { counter++ }
+                    }
+                }
+            }
+        }
+
+        rule.mainClock.advanceTimeByFrame() // Kick off the animation
+        rule.mainClock.advanceTimeBy(duration.toLong())
+
+        rule.runOnUiThread {
+            showFirst = false
+        }
+
+        rule.mainClock.advanceTimeBy(duration.toLong())
+        rule.mainClock.advanceTimeByFrame()
+        rule.mainClock.advanceTimeByFrame() // Wait for changes to propagate
+
+        // and go back to the second screen
+
+        rule.runOnUiThread {
+            showFirst = true
+        }
+
+        rule.mainClock.advanceTimeBy(duration.toLong())
+        rule.mainClock.advanceTimeByFrame()
+        rule.mainClock.advanceTimeByFrame() // Wait for changes to propagate
+
+        assertEquals(1, counter1)
+        assertEquals(2, counter2)
+    }
+
     companion object {
         private const val First = "first"
         private const val Second = "second"
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedValueEffects.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedValueEffects.kt
index 4c34544..3ca2772 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedValueEffects.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedValueEffects.kt
@@ -33,7 +33,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
 
 /**
  * The animatedValue effect creates an [AnimatedValue] and positionally memoizes it. When the
@@ -59,7 +59,7 @@
     initVal: T,
     converter: TwoWayConverter<T, V>,
     visibilityThreshold: T? = null,
-    clock: AnimationClockObservable = AmbientAnimationClock.current
+    clock: AnimationClockObservable = LocalAnimationClock.current
 ): AnimatedValue<T, V> = clock.asDisposableClock().let { disposableClock ->
     remember(disposableClock) {
         AnimatedValueModel(initVal, converter, disposableClock, visibilityThreshold)
@@ -85,7 +85,7 @@
 fun animatedFloat(
     initVal: Float,
     visibilityThreshold: Float = Spring.DefaultDisplacementThreshold,
-    clock: AnimationClockObservable = AmbientAnimationClock.current
+    clock: AnimationClockObservable = LocalAnimationClock.current
 ): AnimatedFloat = clock.asDisposableClock().let { disposableClock ->
     remember(disposableClock) { AnimatedFloatModel(initVal, disposableClock, visibilityThreshold) }
 }
@@ -108,7 +108,7 @@
 )
 fun animatedColor(
     initVal: Color,
-    clock: AnimationClockObservable = AmbientAnimationClock.current
+    clock: AnimationClockObservable = LocalAnimationClock.current
 ): AnimatedValue<Color, AnimationVector4D> = clock.asDisposableClock().let { disposableClock ->
     remember(disposableClock) {
         AnimatedValueModel(
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
index 7772778..26a203d 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
@@ -255,7 +255,7 @@
         }
     }
 
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     val animations = remember(clock, enter, exit) {
         // TODO: Should we delay changing enter/exit after on-going animations are finished?
         TransitionAnimations(enter, exit, clock) {
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt
index 298142e..6a8aec4 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Crossfade.kt
@@ -67,13 +67,11 @@
         items.clear()
         keys.mapTo(items) { key ->
             CrossfadeAnimationItem(key) {
-                key(key) {
-                    val alpha by transition.animateFloat(
-                        transitionSpec = { animationSpec }
-                    ) { if (it == key) 1f else 0f }
-                    Box(Modifier.alpha(alpha = alpha)) {
-                        content(key)
-                    }
+                val alpha by transition.animateFloat(
+                    transitionSpec = { animationSpec }
+                ) { if (it == key) 1f else 0f }
+                Box(Modifier.alpha(alpha = alpha)) {
+                    content(key)
                 }
             }
         }
@@ -83,7 +81,11 @@
     }
 
     Box(modifier) {
-        items.fastForEach { it.content() }
+        items.fastForEach {
+            key(it.key) {
+                it.content()
+            }
+        }
     }
 }
 
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt
index ac40171..b13884b 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SingleValueAnimation.kt
@@ -47,7 +47,7 @@
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
 import androidx.compose.ui.unit.Bounds
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -453,7 +453,7 @@
     visibilityThreshold: T? = null,
     endListener: ((T) -> Unit)? = null
 ): T {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     val anim = remember(clock, converter) {
         AnimatedValueModel(target, converter, clock, visibilityThreshold)
     }
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt
index 509501e..c58614d 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/Transition.kt
@@ -39,9 +39,10 @@
  * [targetValueByState] is used as a mapping from a target state to the target value of this
  * animation. [Transition] will be using this mapping to determine what value to target this
  * animation towards. __Note__ that [targetValueByState] is a composable function. This means the
- * mapping function could access states, ambient, themes, etc. If the targetValue changes outside
- * of a [Transition] run (i.e. when the [Transition] already reached its targetState), the
- * [Transition] will start running again to ensure this animation reaches its new target smoothly.
+ * mapping function could access states, CompositionLocals, themes, etc. If the targetValue changes
+ * outside of a [Transition] run (i.e. when the [Transition] already reached its targetState),
+ * the [Transition] will start running again to ensure this animation reaches its new target
+ * smoothly.
  *
  * An optional [transitionSpec] can be provided to specify (potentially different) animation for
  * each pair of initialState and targetState. [FiniteAnimationSpec] includes any non-infinite
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
index 7b78d24..eeb47e5 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
@@ -179,7 +179,7 @@
                     override fun recordUsed(scope: RecomposeScope) { }
                     override fun recordSideEffect(effect: () -> Unit) { }
                     @Suppress("UNCHECKED_CAST")
-                    override fun <T> consume(key: Ambient<T>): T = null as T
+                    override fun <T> consume(key: CompositionLocal<T>): T = null as T
                     override fun startProviders(values: Array<out ProvidedValue<*>>) { }
                     override fun endProviders() { }
                     override fun recordReadOf(value: Any) { }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
index e5356cc..3662862 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
@@ -325,7 +325,7 @@
             """
                 import androidx.compose.runtime.*
 
-                val x = ambientOf<Int> { 123 }
+                val x = compositionLocalOf<Int> { 123 }
 
                 @Composable
                 fun test() {
@@ -358,14 +358,14 @@
 
                 class Density
 
-                val DensityAmbient = ambientOf<Density>()
+                val LocalDensity = compositionLocalOf<Density>()
 
                 @Composable
-                fun ambientDensity() = DensityAmbient.current
+                fun compositionLocalDensity() = LocalDensity.current
 
                 @Composable
                 fun WithDensity(block: @Composable DensityScope.() -> Unit) {
-                    DensityScope(ambientDensity()).block()
+                    DensityScope(compositionLocalDensity()).block()
                 }
             """
         )
@@ -1403,21 +1403,21 @@
     }
 
     @Test
-    fun testAmbientConsumedFromDefaultParameter(): Unit = ensureSetup {
+    fun testCompositionLocalConsumedFromDefaultParameter(): Unit = ensureSetup {
         val initialText = "no text"
         val helloWorld = "Hello World!"
         compose(
             """
-            val TextAmbient = ambientOf { "$initialText" }
+            val LocalText = compositionLocalOf { "$initialText" }
 
             @Composable
             fun Main() {
                 var text = remember { mutableStateOf("$initialText") }
-                Providers(TextAmbient provides text.value) {
+                Providers(LocalText provides text.value) {
                     LinearLayout {
-                        ConsumesAmbientFromDefaultParameter()
+                        ConsumesCompositionLocalFromDefaultParameter()
                         Button(
-                            text = "Change ambient value",
+                            text = "Change CompositionLocal value",
                             onClick={ text.value = "$helloWorld" },
                             id=101
                         )
@@ -1426,7 +1426,7 @@
             }
 
             @Composable
-            fun ConsumesAmbientFromDefaultParameter(text: String = TextAmbient.current) {
+            fun ConsumesCompositionLocalFromDefaultParameter(text: String = LocalText.current) {
                 TextView(text = text, id = 42)
             }
         """,
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt
index ba815cf..3c42503 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallResolverTests.kt
@@ -144,7 +144,7 @@
         """
             import androidx.compose.runtime.*
 
-            val x = Ambient.of<Int> { 123 }
+            val x = CompositionLocal.of<Int> { 123 }
 
             @Composable
             fun test() {
@@ -180,14 +180,14 @@
 
             class Density
 
-            val DensityAmbient = Ambient.of<Density>()
+            val DensityCompositionLocal = CompositionLocal.of<Density>()
 
             @Composable
-            fun ambientDensity() = ambient(DensityAmbient)
+            fun compositionLocalDensity() = compositionLocal(LocalDensity)
 
             @Composable
             fun WithDensity(block: @Composable DensityScope.() -> Unit) {
-                DensityScope(ambientDensity()).<call>block()
+                DensityScope(compositionLocalDensity()).<call>block()
             }
         """
     )
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
index 4591ad7..27c031c 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
@@ -295,9 +295,9 @@
     )
 
     @Test
-    fun testAmbientCurrent(): Unit = checkApi(
+    fun testCompositionLocalCurrent(): Unit = checkApi(
         """
-            val a = ambientOf { 123 }
+            val a = compositionLocalOf { 123 }
             @Composable fun Foo() {
                 val b = a.current
                 print(b)
@@ -305,8 +305,8 @@
         """,
         """
             public final class TestKt {
-              private final static Landroidx/compose/runtime/ProvidableAmbient; a
-              public final static getA()Landroidx/compose/runtime/ProvidableAmbient;
+              private final static Landroidx/compose/runtime/ProvidableCompositionLocal; a
+              public final static getA()Landroidx/compose/runtime/ProvidableCompositionLocal;
               final static INNERCLASS TestKt%Foo%1 null null
               public final static Foo(Landroidx/compose/runtime/Composer;I)V
               final static INNERCLASS TestKt%a%1 null null
@@ -825,47 +825,47 @@
     @Test
     fun testSealedClassEtc(): Unit = checkApi(
         """
-            sealed class Ambient2<T> {
+            sealed class CompositionLocal2<T> {
                 @Composable
                 inline val current: T get() = error("")
                 @Composable fun foo() {}
             }
 
-            abstract class ProvidableAmbient2<T> : Ambient2<T>() {}
-            class DynamicProvidableAmbient2<T> : ProvidableAmbient2<T>() {}
-            class StaticProvidableAmbient2<T> : ProvidableAmbient2<T>() {}
+            abstract class ProvidableCompositionLocal2<T> : CompositionLocal2<T>() {}
+            class DynamicProvidableCompositionLocal2<T> : ProvidableCompositionLocal2<T>() {}
+            class StaticProvidableCompositionLocal2<T> : ProvidableCompositionLocal2<T>() {}
         """,
         """
-            public abstract class Ambient2 {
+            public abstract class CompositionLocal2 {
               private <init>()V
               public final getCurrent(Landroidx/compose/runtime/Composer;I)Ljava/lang/Object;
               public static synthetic getCurrent%annotations()V
-              final static INNERCLASS Ambient2%foo%1 null null
+              final static INNERCLASS CompositionLocal2%foo%1 null null
               public final foo(Landroidx/compose/runtime/Composer;I)V
               public final static I %stable
               public synthetic <init>(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
               static <clinit>()V
             }
-            final class Ambient2%foo%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
-              <init>(LAmbient2;I)V
+            final class CompositionLocal2%foo%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
+              <init>(LCompositionLocal2;I)V
               public final invoke(Landroidx/compose/runtime/Composer;I)V
-              final synthetic LAmbient2; %tmp0_rcvr
+              final synthetic LCompositionLocal2; %tmp0_rcvr
               final synthetic I %%changed
               public synthetic bridge invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-              final static INNERCLASS Ambient2%foo%1 null null
-              OUTERCLASS Ambient2 foo (Landroidx/compose/runtime/Composer;I)V
+              final static INNERCLASS CompositionLocal2%foo%1 null null
+              OUTERCLASS CompositionLocal2 foo (Landroidx/compose/runtime/Composer;I)V
             }
-            public abstract class ProvidableAmbient2 extends Ambient2 {
+            public abstract class ProvidableCompositionLocal2 extends CompositionLocal2 {
               public <init>()V
               public final static I %stable
               static <clinit>()V
             }
-            public final class DynamicProvidableAmbient2 extends ProvidableAmbient2 {
+            public final class DynamicProvidableCompositionLocal2 extends ProvidableCompositionLocal2 {
               public <init>()V
               public final static I %stable
               static <clinit>()V
             }
-            public final class StaticProvidableAmbient2 extends ProvidableAmbient2 {
+            public final class StaticProvidableCompositionLocal2 extends ProvidableCompositionLocal2 {
               public <init>()V
               public final static I %stable
               static <clinit>()V
@@ -1390,9 +1390,8 @@
             }
             final class TestKt%Example%1 implements A {
               <init>()V
-              public final compute-etMKIPo-etMKIPo(I)I
+              public final compute-etMKIPo(I)I
               public final static LTestKt%Example%1; INSTANCE
-              public synthetic bridge compute-etMKIPo(I)I
               static <clinit>()V
               final static INNERCLASS TestKt%Example%1 null null
               OUTERCLASS TestKt Example (LA;)V
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
index 8dcd32f0..9ef2714 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
@@ -2567,16 +2567,16 @@
     @Test
     fun testStaticAndNonStaticDefaultValueSkipping(): Unit = comparisonPropagation(
         """
-            import androidx.compose.runtime.ambientOf
+            import androidx.compose.runtime.compositionLocalOf
 
-            val AmbientColor = ambientOf { 123 }
+            val LocalColor = compositionLocalOf { 123 }
             @Composable fun A(a: Int) {}
         """,
         """
             @Composable
             fun Example(
                 wontChange: Int = 123,
-                mightChange: Int = AmbientColor.current
+                mightChange: Int = LocalColor.current
             ) {
                 A(wontChange)
                 A(mightChange)
@@ -2604,7 +2604,7 @@
                     wontChange = 123
                   }
                   if (%default and 0b0010 !== 0) {
-                    mightChange = AmbientColor.current
+                    mightChange = LocalColor.current
                     %dirty = %dirty and 0b01110000.inv()
                   }
                   %composer.endDefaults()
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt
index 7e5b31d..d413c1d 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt
@@ -241,6 +241,37 @@
     }
 
     @Test
+    fun testFunInterfaceWithInlineClass(): Unit = ensureSetup {
+        compile(
+            mapOf(
+                "library module" to mapOf(
+                    "x/A.kt" to """
+                        package x
+
+                        inline class A(val value: Int)
+                        fun interface B {
+                          fun method(a: A)
+                        }
+                    """.trimIndent()
+                ),
+                "Main" to mapOf(
+                    "y/B.kt" to """
+                        package y
+
+                        import x.*
+
+                        val b = B { }
+                    """
+                )
+            )
+        ) {
+            assert(it.contains("public abstract method-C8LvVsQ(I)V"))
+            assert(it.contains("public final method-C8LvVsQ(I)V"))
+            assert(!it.contains("public final method(I)V"))
+        }
+    }
+
+    @Test
     fun testParentNotInitializedBug(): Unit = ensureSetup {
         compile(
             mapOf(
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index 28b45ca..10e69da 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -381,18 +381,18 @@
     )
 
     @Test
-    fun testAmbientCallBeforeRemember(): Unit = comparisonPropagation(
+    fun testCompositionLocalCallBeforeRemember(): Unit = comparisonPropagation(
         """
-            import androidx.compose.runtime.ambientOf
+            import androidx.compose.runtime.compositionLocalOf
 
             class Foo
             class Bar
-            val ambientBar = ambientOf<Bar> { Bar() }
+            val compositionLocalBar = compositionLocalOf<Bar> { Bar() }
         """,
         """
             @Composable
             fun Test() {
-                val bar = ambientBar.current
+                val bar = compositionLocalBar.current
                 val foo = remember(bar) { Foo() }
             }
         """,
@@ -401,7 +401,7 @@
             fun Test(%composer: Composer?, %changed: Int) {
               %composer.startRestartGroup(<>, "C(Test)<curren...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
-                val bar = ambientBar.current
+                val bar = compositionLocalBar.current
                 val foo = %composer.cache(%composer.changed(bar)) {
                   val tmp0_return = Foo()
                   tmp0_return
@@ -417,18 +417,18 @@
     )
 
     @Test
-    fun testAmbientCallAsInput(): Unit = comparisonPropagation(
+    fun testCompositionLocalCallAsInput(): Unit = comparisonPropagation(
         """
-            import androidx.compose.runtime.ambientOf
+            import androidx.compose.runtime.compositionLocalOf
 
             class Foo
             class Bar
-            val ambientBar = ambientOf<Bar> { Bar() }
+            val compositionLocalBar = compositionLocalOf<Bar> { Bar() }
         """,
         """
             @Composable
             fun Test() { 
-                val foo = remember(ambientBar.current) { Foo() }
+                val foo = remember(compositionLocalBar.current) { Foo() }
             }
         """,
         """
@@ -436,7 +436,7 @@
             fun Test(%composer: Composer?, %changed: Int) {
               %composer.startRestartGroup(<>, "C(Test)<curren...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
-                val foo = %composer.cache(%composer.changed(ambientBar.current)) {
+                val foo = %composer.cache(%composer.changed(compositionLocalBar.current)) {
                   val tmp0_return = Foo()
                   tmp0_return
                 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RobolectricComposeTester.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RobolectricComposeTester.kt
index 9fe9099..8b74ce0 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RobolectricComposeTester.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RobolectricComposeTester.kt
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.Recomposer
 import androidx.compose.ui.node.UiApplier
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.Dispatchers
@@ -99,7 +99,7 @@
         val realComposable: (Composer, Int) -> Unit = { composer, _ ->
             startProviders.invoke(
                 composer,
-                listOf(AmbientContext provides root.context).toTypedArray()
+                listOf(LocalContext provides root.context).toTypedArray()
             )
             composable(composer, 0)
             endProviders.invoke(composer)
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
index bc1a8ea..65fe6c1 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
@@ -1075,4 +1075,20 @@
         """
         )
     }
+
+    fun testDisallowComposableCallPropagation() = check(
+        """
+        import androidx.compose.runtime.*
+        class Foo
+        @Composable inline fun a(block1: @DisallowComposableCalls () -> Foo): Foo {
+            return block1()
+        }
+        @Composable inline fun b(<!MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION!>block2: () -> Foo<!>): Foo {
+          return a { block2() }
+        }
+        @Composable inline fun c(block2: @DisallowComposableCalls () -> Foo): Foo {
+          return a { block2() }
+        }
+    """
+    )
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposableCallChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposableCallChecker.kt
index 6bd17a8..14360b3 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposableCallChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposableCallChecker.kt
@@ -83,12 +83,60 @@
         container.useInstance(this)
     }
 
+    fun checkInlineLambdaCall(
+        resolvedCall: ResolvedCall<*>,
+        reportOn: PsiElement,
+        context: CallCheckerContext
+    ) {
+        if (resolvedCall !is VariableAsFunctionResolvedCall) return
+        val descriptor = resolvedCall.variableCall.resultingDescriptor
+        if (descriptor !is ValueParameterDescriptor) return
+        if (descriptor.type.composablePreventCaptureContract() == true) return
+        val function = descriptor.containingDeclaration
+        if (
+            function is FunctionDescriptor &&
+            function.isInline &&
+            function.isMarkedAsComposable()
+        ) {
+            val bindingContext = context.trace.bindingContext
+            var node: PsiElement? = reportOn
+            loop@while (node != null) {
+                when (node) {
+                    is KtLambdaExpression -> {
+                        val arg = getArgumentDescriptor(node.functionLiteral, bindingContext)
+                        if (arg?.type?.composablePreventCaptureContract() == true) {
+                            val parameterSrc = descriptor.findPsi()
+                            if (parameterSrc != null) {
+                                missingDisallowedComposableCallPropagation(
+                                    context,
+                                    parameterSrc,
+                                    descriptor,
+                                    arg
+                                )
+                            }
+                        }
+                    }
+                    is KtFunction -> {
+                        val fn = bindingContext[BindingContext.FUNCTION, node]
+                        if (fn == function) {
+                            return
+                        }
+                    }
+                }
+                node = node.parent as? KtElement
+            }
+        }
+    }
+
     override fun check(
         resolvedCall: ResolvedCall<*>,
         reportOn: PsiElement,
         context: CallCheckerContext
     ) {
-        if (!resolvedCall.isComposableInvocation()) return
+        if (!resolvedCall.isComposableInvocation()) {
+            checkInlineLambdaCall(resolvedCall, reportOn, context)
+            return
+        }
         val bindingContext = context.trace.bindingContext
         var node: PsiElement? = reportOn
         loop@while (node != null) {
@@ -217,6 +265,22 @@
         }
     }
 
+    private fun missingDisallowedComposableCallPropagation(
+        context: CallCheckerContext,
+        unmarkedParamEl: PsiElement,
+        unmarkedParamDescriptor: ValueParameterDescriptor,
+        markedParamDescriptor: ValueParameterDescriptor
+    ) {
+        context.trace.report(
+            ComposeErrors.MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION.on(
+                unmarkedParamEl,
+                unmarkedParamDescriptor,
+                markedParamDescriptor,
+                markedParamDescriptor.containingDeclaration
+            )
+        )
+    }
+
     private fun illegalCall(
         context: CallCheckerContext,
         callEl: PsiElement,
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrorMessages.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrorMessages.kt
index e0e887a..fee8a4b7 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrorMessages.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrorMessages.kt
@@ -53,6 +53,15 @@
         )
 
         MAP.put(
+            ComposeErrors.MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION,
+            "Parameter {0} cannot be inlined inside of lambda argument {1} of {2} " +
+                "without also being annotated with @DisallowComposableCalls",
+            Renderers.NAME,
+            Renderers.NAME,
+            Renderers.NAME
+        )
+
+        MAP.put(
             ComposeErrors.COMPOSABLE_PROPERTY_BACKING_FIELD,
             "Composable properties are not able to have backing fields"
         )
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrors.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrors.kt
index 8ef2b83..0b76433 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrors.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeErrors.kt
@@ -17,10 +17,13 @@
 package androidx.compose.compiler.plugins.kotlin
 
 import com.intellij.psi.PsiElement
+import org.jetbrains.kotlin.descriptors.CallableDescriptor
 import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
 import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2
+import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
 import org.jetbrains.kotlin.diagnostics.Errors
 import org.jetbrains.kotlin.diagnostics.PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT
 import org.jetbrains.kotlin.diagnostics.Severity
@@ -74,6 +77,17 @@
             Severity.ERROR
         )
 
+    @JvmField
+    val MISSING_DISALLOW_COMPOSABLE_CALLS_ANNOTATION =
+        DiagnosticFactory3.create<
+            PsiElement,
+            ValueParameterDescriptor, // unmarked
+            ValueParameterDescriptor, // marked
+            CallableDescriptor
+            >(
+            Severity.ERROR
+        )
+
     // This error matches Kotlin's CONFLICTING_OVERLOADS error, except that it renders the
     // annotations with the descriptor. This is important to use for errors where the
     // only difference is whether or not it is annotated with @Composable or not.
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt
index f05abdc..1292ab5 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunInterfaceLowering.kt
@@ -16,18 +16,14 @@
 
 package androidx.compose.compiler.plugins.kotlin.lower
 
-import androidx.compose.compiler.plugins.kotlin.ComposeFqNames
 import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
 import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
-import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
 import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
 import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
 import org.jetbrains.kotlin.ir.types.classOrNull
-import org.jetbrains.kotlin.ir.util.functions
-import org.jetbrains.kotlin.ir.util.hasAnnotation
 import org.jetbrains.kotlin.ir.util.isLambda
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
 
@@ -38,7 +34,7 @@
 
     override fun lower(module: IrModuleFragment) = module.transformChildrenVoid(this)
 
-    private fun isComposableFunInterfaceConversion(expression: IrTypeOperatorCall): Boolean {
+    private fun isFunInterfaceConversion(expression: IrTypeOperatorCall): Boolean {
         val argument = expression.argument
         val operator = expression.operator
         val type = expression.typeOperand
@@ -47,13 +43,22 @@
             argument is IrFunctionExpression &&
             argument.origin.isLambda &&
             functionClass != null &&
-            functionClass.functions.single {
-                it.owner.modality == Modality.ABSTRACT
-            }.owner.annotations.hasAnnotation(ComposeFqNames.Composable)
+            functionClass.owner.isFun
+        // IMPORTANT(b/178663739):
+        // We are transforming not just SAM conversions for composable fun interfaces, but ALL
+        // fun interfaces temporarily until KT-44622 gets fixed in the version of kotlin we
+        // are using, which should be in 1.4.30.
+        // Once it does, we should either add the below additional condition to this predicate,
+        // or, if possible, remove this lowering all together if kotlin's lowering works for
+        // composable fun interfaces as well.
+        //
+        // functionClass.functions.single {
+        //    it.owner.modality == Modality.ABSTRACT
+        // }.owner.annotations.hasAnnotation(ComposeFqNames.Composable)
     }
 
     override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression {
-        if (isComposableFunInterfaceConversion(expression)) {
+        if (isFunInterfaceConversion(expression)) {
             val argument = expression.argument.transform(this, null) as IrFunctionExpression
             val superType = expression.typeOperand
             val superClass = superType.classOrNull ?: error("Expected non-null class")
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.kt
index edfe371..e79b2a0 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.kt
@@ -403,15 +403,13 @@
         color = Color(255, 255, 255, 40),
         shape = RoundedCornerShape(4.dp)
     ) {
+        TextBox(
+            text = "Selected: ${items[selectedIndex.value]}",
+            modifier = Modifier
+                .height(35.dp)
+                .padding(start = 4.dp, end = 4.dp)
+        )
         DropdownMenu(
-            toggle = {
-                TextBox(
-                    text = "Selected: ${items[selectedIndex.value]}",
-                    modifier = Modifier
-                        .height(35.dp)
-                        .padding(start = 4.dp, end = 4.dp)
-                )
-            },
             expanded = showMenu.value,
             onDismissRequest = { showMenu.value = false }
         ) {
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.kt
index 9f29f4b..deaeeec 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.kt
@@ -16,6 +16,6 @@
 
 package androidx.compose.desktop.examples.popupexample
 
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 
-val AmbientTest = staticAmbientOf<Int>()
\ No newline at end of file
+val AmbientTest = staticCompositionLocalOf<Int>()
\ No newline at end of file
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.kt
index 59b3714..1195848 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.IntSize
 
 private val frameLogCount = 1000
@@ -76,7 +76,7 @@
 
     Window(size = IntSize(800, 200)) {
         val window = AppWindowAmbient.current!!
-        val width = (AmbientDensity.current.density * window.window.width).toInt()
+        val width = (LocalDensity.current.density * window.window.width).toInt()
         val singleFrameMillis = remember {
             1000 / window.window.graphicsConfiguration.device.displayMode.refreshRate
         }
diff --git a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.kt b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.kt
index a058795..a9c7245 100644
--- a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.kt
+++ b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.kt
@@ -13,6 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.window
 
 import androidx.compose.desktop.AppFrame
diff --git a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
index b3b2da8..5ac328d 100644
--- a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
+++ b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/RtlDemo.kt
@@ -34,7 +34,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
@@ -61,11 +61,11 @@
         )
         CustomLayout(false)
         Text("WITH CONSTRAINTS", Modifier.align(Alignment.CenterHorizontally))
-        Providers(AmbientLayoutDirection provides LayoutDirection.Ltr) {
-            LayoutWithConstraints("LD: set LTR via ambient")
+        Providers(LocalLayoutDirection provides LayoutDirection.Ltr) {
+            LayoutWithConstraints("LD: set LTR via CompositionLocal")
         }
-        Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
-            LayoutWithConstraints("LD: set RTL via ambient")
+        Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
+            LayoutWithConstraints("LD: set RTL via CompositionLocal")
         }
         LayoutWithConstraints(text = "LD: locale")
         Text("STACK EXAMPLE", Modifier.align(Alignment.CenterHorizontally))
@@ -109,7 +109,7 @@
     Row {
         Box(boxSize.background(Color.Red)) {}
         Box(boxSize.background(Color.Green)) {}
-        Providers(AmbientLayoutDirection provides LayoutDirection.Ltr) {
+        Providers(LocalLayoutDirection provides LayoutDirection.Ltr) {
             Row {
                 Box(boxSize.background(Color.Magenta)) {}
                 Box(boxSize.background(Color.Yellow)) {}
@@ -179,7 +179,7 @@
 private fun LayoutWithConstraints(text: String) {
     BoxWithConstraints {
         val w = maxWidth / 3
-        val color = if (AmbientLayoutDirection.current == LayoutDirection.Ltr) {
+        val color = if (LocalLayoutDirection.current == LayoutDirection.Ltr) {
             Color.Red
         } else {
             Color.Magenta
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt
index 78dc663..ec4ede2 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/ColumnSample.kt
@@ -128,8 +128,8 @@
             content = { },
             modifier = modifier.background(color = color)
         ) { _, constraints ->
-            val widthPx = max(width.toIntPx(), constraints.minWidth)
-            val heightPx = max(height.toIntPx(), constraints.minHeight)
+            val widthPx = max(width.roundToPx(), constraints.minWidth)
+            val heightPx = max(height.roundToPx(), constraints.minHeight)
             layout(widthPx, heightPx, mapOf(start to 0, end to widthPx)) {}
         }
     }
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RelativePaddingFromSamples.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RelativePaddingFromSamples.kt
index 5709620..9a97218 100644
--- a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RelativePaddingFromSamples.kt
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/RelativePaddingFromSamples.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.FirstBaseline
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
@@ -34,7 +34,7 @@
     // first line of text.
     val distanceToBaseline = 30.sp
     // We convert the 30.sp value to dps, which is required for the paddingFrom API.
-    val distanceToBaselineDp = with(AmbientDensity.current) { distanceToBaseline.toDp() }
+    val distanceToBaselineDp = with(LocalDensity.current) { distanceToBaseline.toDp() }
     // The result will be a layout with 30.sp distance from the top of the layout box to the
     // baseline of the first line of text.
     Text(
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt
index 98d3bcc..d4883b2 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AlignmentLineTest.kt
@@ -95,14 +95,14 @@
 
         Assert.assertNotNull(parentSize.value)
         Assert.assertEquals(
-            beforeDp.toIntPx() + afterDp.toIntPx(),
+            beforeDp.roundToPx() + afterDp.roundToPx(),
             parentSize.value!!.width
         )
         Assert.assertNotNull(childSize.value)
         Assert.assertEquals(childSize.value!!.height, parentSize.value!!.height)
         Assert.assertNotNull(childPosition.value)
         Assert.assertEquals(
-            (beforeDp.toIntPx() - lineDp.toIntPx()).toFloat(),
+            (beforeDp.roundToPx() - lineDp.roundToPx()).toFloat(),
             childPosition.value!!.x
         )
         Assert.assertEquals(0f, childPosition.value!!.y)
@@ -142,11 +142,11 @@
         Assert.assertNotNull(childSize.value)
         Assert.assertEquals(childSize.value!!.width, parentSize.value!!.width)
         Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(beforeDp.toIntPx() + afterDp.toIntPx(), parentSize.value!!.height)
+        Assert.assertEquals(beforeDp.roundToPx() + afterDp.roundToPx(), parentSize.value!!.height)
         Assert.assertNotNull(childPosition.value)
         Assert.assertEquals(0f, childPosition.value!!.x)
         Assert.assertEquals(
-            (beforeDp.toIntPx() - lineDp.toIntPx()).toFloat(),
+            (beforeDp.roundToPx() - lineDp.roundToPx()).toFloat(),
             childPosition.value!!.y
         )
     }
@@ -239,7 +239,7 @@
         Assert.assertTrue(layoutLatch.await(1, TimeUnit.SECONDS))
 
         Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(maxWidth.toIntPx(), parentSize.value!!.width)
+        Assert.assertEquals(maxWidth.roundToPx(), parentSize.value!!.width)
         Assert.assertNotNull(childSize.value)
         Assert.assertEquals(childSize.value!!.height, parentSize.value!!.height)
         Assert.assertNotNull(childPosition.value)
@@ -275,7 +275,7 @@
         Assert.assertNotNull(childSize.value)
         Assert.assertEquals(childSize.value!!.width, parentSize.value!!.width)
         Assert.assertNotNull(parentSize.value)
-        Assert.assertEquals(maxHeight.toIntPx(), parentSize.value!!.height)
+        Assert.assertEquals(maxHeight.roundToPx(), parentSize.value!!.height)
         Assert.assertNotNull(childPosition.value)
         Assert.assertEquals(0f, childPosition.value!!.x)
         Assert.assertEquals(5f, childPosition.value!!.y)
@@ -293,7 +293,7 @@
                         .preferredSizeIn(minHeight = minHeight)
                         .paddingFrom(testLine, 0.dp)
                 ) {
-                    Assert.assertEquals(minHeight.toIntPx(), constraints.minHeight)
+                    Assert.assertEquals(minHeight.roundToPx(), constraints.minHeight)
                     latch.countDown()
                 }
             }
@@ -313,7 +313,7 @@
                         .preferredSizeIn(minWidth = minWidth)
                         .paddingFrom(testLine, 0.dp)
                 ) {
-                    Assert.assertEquals(minWidth.toIntPx(), constraints.minWidth)
+                    Assert.assertEquals(minWidth.roundToPx(), constraints.minWidth)
                     latch.countDown()
                 }
             }
@@ -421,7 +421,7 @@
             Box(
                 Modifier.onSizeChanged { boxSize ->
                     Assert.assertEquals(
-                        sizeDp.toIntPx() + (paddingPx - baselineOffsetPx) * 2,
+                        sizeDp.roundToPx() + (paddingPx - baselineOffsetPx) * 2,
                         boxSize.height
                     )
                     latch.countDown()
@@ -457,7 +457,7 @@
             Box(
                 Modifier.onSizeChanged { boxSize ->
                     Assert.assertEquals(
-                        sizeDp.toIntPx() + paddingPx - baselineOffsetPx,
+                        sizeDp.roundToPx() + paddingPx - baselineOffsetPx,
                         boxSize.height
                     )
                     latch.countDown()
@@ -531,7 +531,11 @@
         modifier: Modifier
     ) {
         Layout({}, modifier) { _, _ ->
-            layout(width.toIntPx(), height.toIntPx(), mapOf(line to linePosition.toIntPx())) {}
+            layout(
+                width.roundToPx(),
+                height.roundToPx(),
+                mapOf(line to linePosition.roundToPx())
+            ) {}
         }
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt
index 0ecfd38..71c17f1 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/AspectRatioTest.kt
@@ -64,10 +64,10 @@
             assertEquals(20, minIntrinsicHeight(40))
             assertEquals(20, maxIntrinsicHeight(40))
 
-            assertEquals(30.dp.toIntPx(), minIntrinsicWidth(Constraints.Infinity))
-            assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
-            assertEquals(40.dp.toIntPx(), minIntrinsicHeight(Constraints.Infinity))
-            assertEquals(40.dp.toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(30.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt
index d77ad2f..05033d5 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxTest.kt
@@ -28,8 +28,8 @@
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
@@ -63,7 +63,7 @@
     @Test
     fun testBox() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(3)
         val stackSize = Ref<IntSize>()
@@ -113,7 +113,7 @@
         val size = 200
         val sizeDp = size.toDp()
         val doubleSizeDp = sizeDp * 2
-        val doubleSize = (sizeDp * 2).toIntPx()
+        val doubleSize = (sizeDp * 2).roundToPx()
 
         val positionedLatch = CountDownLatch(3)
         val stackSize = Ref<IntSize>()
@@ -248,9 +248,9 @@
     @Test
     fun testBox_Rtl() = with(density) {
         val sizeDp = 48.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val tripleSizeDp = sizeDp * 3
-        val tripleSize = (sizeDp * 3).toIntPx()
+        val tripleSize = (sizeDp * 3).roundToPx()
 
         val positionedLatch = CountDownLatch(10)
         val stackSize = Ref<IntSize>()
@@ -258,7 +258,7 @@
         val childPosition = Array(9) { Ref<Offset>() }
         show {
             Box(Modifier.wrapContentSize(Alignment.TopStart)) {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Box(
                         Modifier
                             .preferredSize(tripleSizeDp)
@@ -506,7 +506,7 @@
             ) {
                 Box(
                     Modifier.preferredWidth(10.dp).onSizeChanged {
-                        assertEquals(20.dp.toIntPx(), it.width)
+                        assertEquals(20.dp.roundToPx(), it.width)
                         measuredLatch.countDown()
                     }
                 )
@@ -543,21 +543,21 @@
             }
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
-            assertEquals(testWidth.toIntPx(), minIntrinsicWidth(0.dp.toIntPx()))
+            assertEquals(testWidth.roundToPx(), minIntrinsicWidth(0.dp.roundToPx()))
             assertEquals(expectedWidth, minIntrinsicWidth(testDimension))
-            assertEquals(testWidth.toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(testWidth.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
             // Min height.
-            assertEquals(testHeight.toIntPx(), minIntrinsicHeight(0.dp.toIntPx()))
+            assertEquals(testHeight.roundToPx(), minIntrinsicHeight(0.dp.roundToPx()))
             assertEquals(expectedHeight, minIntrinsicHeight(testDimension))
-            assertEquals(testHeight.toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(testHeight.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
             // Max width.
-            assertEquals(testWidth.toIntPx(), maxIntrinsicWidth(0.dp.toIntPx()))
+            assertEquals(testWidth.roundToPx(), maxIntrinsicWidth(0.dp.roundToPx()))
             assertEquals(expectedWidth, maxIntrinsicWidth(testDimension))
-            assertEquals(testWidth.toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(testWidth.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
             // Max height.
-            assertEquals(testHeight.toIntPx(), maxIntrinsicHeight(0.dp.toIntPx()))
+            assertEquals(testHeight.roundToPx(), maxIntrinsicHeight(0.dp.roundToPx()))
             assertEquals(expectedHeight, maxIntrinsicHeight(testDimension))
-            assertEquals(testHeight.toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(testHeight.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
@@ -574,17 +574,17 @@
             }
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
-            assertEquals(0.dp.toIntPx(), minIntrinsicWidth(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(50.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
             // Min height.
-            assertEquals(0.dp.toIntPx(), minIntrinsicHeight(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(50.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
             // Max width.
-            assertEquals(0.dp.toIntPx(), maxIntrinsicWidth(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(50.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
             // Max height.
-            assertEquals(0.dp.toIntPx(), maxIntrinsicHeight(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(50.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt
index c540dd0..1cfd08f 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/BoxWithConstraintsTest.kt
@@ -48,7 +48,7 @@
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
@@ -643,11 +643,11 @@
             Layout(
                 content = @Composable {
                     BoxWithConstraints {
-                        with(AmbientDensity.current) {
-                            assertEquals(minWidthConstraint.toIntPx(), minWidth.toIntPx())
-                            assertEquals(maxWidthConstraint.toIntPx(), maxWidth.toIntPx())
-                            assertEquals(minHeightConstraint.toIntPx(), minHeight.toIntPx())
-                            assertEquals(maxHeightConstraint.toIntPx(), maxHeight.toIntPx())
+                        with(LocalDensity.current) {
+                            assertEquals(minWidthConstraint.roundToPx(), minWidth.roundToPx())
+                            assertEquals(maxWidthConstraint.roundToPx(), maxWidth.roundToPx())
+                            assertEquals(minHeightConstraint.roundToPx(), minHeight.roundToPx())
+                            assertEquals(maxHeightConstraint.roundToPx(), maxHeight.roundToPx())
                         }
                         latch.countDown()
                     }
@@ -656,10 +656,10 @@
                 layout(0, 0) {
                     m.first().measure(
                         Constraints(
-                            minWidth = minWidthConstraint.toIntPx(),
-                            maxWidth = maxWidthConstraint.toIntPx(),
-                            minHeight = minHeightConstraint.toIntPx(),
-                            maxHeight = maxHeightConstraint.toIntPx()
+                            minWidth = minWidthConstraint.roundToPx(),
+                            maxWidth = maxWidthConstraint.roundToPx(),
+                            minHeight = minHeightConstraint.roundToPx(),
+                            maxHeight = maxHeightConstraint.roundToPx()
                         )
                     ).place(IntOffset.Zero)
                 }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/ConstraintLayoutTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/ConstraintLayoutTest.kt
index ae7cf66..7d9a610 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/ConstraintLayoutTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/ConstraintLayoutTest.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -126,7 +126,7 @@
                 aspectRatioBoxSize.value!!.height
             )
             // Divider has fixed width 1.dp in constraint set.
-            assertEquals(1.dp.toIntPx(), dividerSize.value!!.width)
+            assertEquals(1.dp.roundToPx(), dividerSize.value!!.width)
             // Divider has spread height so it should spread to fill the height of the CL,
             // which in turns is given by the size of the aspect ratio box.
             assertEquals(aspectRatioBoxSize.value!!.height, dividerSize.value!!.height)
@@ -186,7 +186,7 @@
                 aspectRatioBoxSize.value!!.height
             )
             // Divider has fixed width 1.dp in constraint set.
-            assertEquals(1.dp.toIntPx(), dividerSize.value!!.width)
+            assertEquals(1.dp.roundToPx(), dividerSize.value!!.width)
             // Divider has spread height so it should spread to fill the height of the CL,
             // which in turns is given by the size of the aspect ratio box.
             assertEquals(aspectRatioBoxSize.value!!.height, dividerSize.value!!.height)
@@ -247,7 +247,7 @@
                 aspectRatioBoxSize.value!!.height
             )
             // Divider has fixed width 1.dp in constraint set.
-            assertEquals(1.dp.toIntPx(), dividerSize.value!!.width)
+            assertEquals(1.dp.roundToPx(), dividerSize.value!!.width)
             // Divider has percent height so it should spread to fill 0.8 of the height of the CL,
             // which in turns is given by the size of the aspect ratio box.
             assertEquals(
@@ -309,7 +309,7 @@
                 aspectRatioBoxSize.value!!.height
             )
             // Divider has fixed width 1.dp in constraint set.
-            assertEquals(1.dp.toIntPx(), dividerSize.value!!.width)
+            assertEquals(1.dp.roundToPx(), dividerSize.value!!.width)
             // Divider has percent height so it should spread to fill 0.8 of the height of the CL,
             // which in turns is given by the size of the aspect ratio box.
             // TODO(popam; b/150277566): uncomment
@@ -368,15 +368,15 @@
 
         rule.runOnIdle {
             // The width of the ConstraintLayout should be twice the width of the aspect ratio box.
-            assertEquals(size.toIntPx() * 2, constraintLayoutSize.value!!.width)
+            assertEquals(size.roundToPx() * 2, constraintLayoutSize.value!!.width)
             // The height of the ConstraintLayout should be the height of the aspect ratio box.
-            assertEquals(size.toIntPx() / 2, constraintLayoutSize.value!!.height)
+            assertEquals(size.roundToPx() / 2, constraintLayoutSize.value!!.height)
             // The aspect ratio gets the requested size.
-            assertEquals(size.toIntPx(), aspectRatioBoxSize.value!!.width)
+            assertEquals(size.roundToPx(), aspectRatioBoxSize.value!!.width)
             // Aspect ratio is preserved.
-            assertEquals(size.toIntPx() / 2, aspectRatioBoxSize.value!!.height)
+            assertEquals(size.roundToPx() / 2, aspectRatioBoxSize.value!!.height)
             // Divider has fixed width 1.dp in constraint set.
-            assertEquals(1.dp.toIntPx(), dividerSize.value!!.width)
+            assertEquals(1.dp.roundToPx(), dividerSize.value!!.width)
             // Divider should have the height of the aspect ratio box.
             assertEquals(aspectRatioBoxSize.value!!.height, dividerSize.value!!.height)
         }
@@ -538,7 +538,7 @@
         val position = Array(3) { Ref<Offset>() }
 
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 ConstraintLayout(Modifier.fillMaxSize()) {
                     val (box0, box1, box2) = createRefs()
                     Box(
@@ -658,7 +658,7 @@
 
         val position = Array(8) { 0f }
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 ConstraintLayout(Modifier.size(size)) {
                     val guidelines = arrayOf(
                         createGuidelineFromStart(offset),
@@ -758,7 +758,7 @@
 
         val position = Array(4) { 0f }
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 ConstraintLayout(Modifier.size(size)) {
                     val (box1, box2) = createRefs()
                     val guideline1 = createGuidelineFromAbsoluteLeft(offset)
@@ -887,7 +887,7 @@
 
         val position = Array(16) { 0f }
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 ConstraintLayout(Modifier.size(size)) {
                     val box = createRef()
                     val guideline = createGuidelineFromAbsoluteLeft(offset)
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt
index 0584869..a4171e8 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/IntrinsicTest.kt
@@ -65,8 +65,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(10.dp.toIntPx(), 50.dp.toIntPx()), minIntrinsicWidthSize.value)
-        assertEquals(IntSize(10.dp.toIntPx(), 50.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
+        assertEquals(IntSize(10.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -93,8 +93,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.toIntPx(), 40.dp.toIntPx()), minIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.toIntPx(), 40.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), minIntrinsicHeightSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 40.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -121,8 +121,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(30.dp.toIntPx(), 50.dp.toIntPx()), maxIntrinsicWidthSize.value)
-        assertEquals(IntSize(30.dp.toIntPx(), 50.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
+        assertEquals(IntSize(30.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -149,8 +149,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.toIntPx(), 60.dp.toIntPx()), maxIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.toIntPx(), 60.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), maxIntrinsicHeightSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 60.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -179,8 +179,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(5.dp.toIntPx(), 50.dp.toIntPx()), minIntrinsicWidthSize.value)
-        assertEquals(IntSize(5.dp.toIntPx(), 50.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(5.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
+        assertEquals(IntSize(5.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -209,8 +209,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(15.dp.toIntPx(), 50.dp.toIntPx()), minIntrinsicWidthSize.value)
-        assertEquals(IntSize(15.dp.toIntPx(), 50.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(15.dp.roundToPx(), 50.dp.roundToPx()), minIntrinsicWidthSize.value)
+        assertEquals(IntSize(15.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -242,8 +242,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.toIntPx(), 35.dp.toIntPx()), minIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.toIntPx(), 35.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 35.dp.roundToPx()), minIntrinsicHeightSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 35.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -275,8 +275,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.toIntPx(), 45.dp.toIntPx()), minIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.toIntPx(), 45.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 45.dp.roundToPx()), minIntrinsicHeightSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 45.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -308,8 +308,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(25.dp.toIntPx(), 50.dp.toIntPx()), maxIntrinsicWidthSize.value)
-        assertEquals(IntSize(25.dp.toIntPx(), 50.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(25.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
+        assertEquals(IntSize(25.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -341,8 +341,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(35.dp.toIntPx(), 50.dp.toIntPx()), maxIntrinsicWidthSize.value)
-        assertEquals(IntSize(35.dp.toIntPx(), 50.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(35.dp.roundToPx(), 50.dp.roundToPx()), maxIntrinsicWidthSize.value)
+        assertEquals(IntSize(35.dp.roundToPx(), 50.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -374,8 +374,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.toIntPx(), 55.dp.toIntPx()), maxIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.toIntPx(), 55.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 55.dp.roundToPx()), maxIntrinsicHeightSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 55.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -407,8 +407,8 @@
         }
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
 
-        assertEquals(IntSize(20.dp.toIntPx(), 65.dp.toIntPx()), maxIntrinsicHeightSize.value)
-        assertEquals(IntSize(20.dp.toIntPx(), 65.dp.toIntPx()), childSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 65.dp.roundToPx()), maxIntrinsicHeightSize.value)
+        assertEquals(IntSize(20.dp.roundToPx(), 65.dp.roundToPx()), childSize.value)
         assertEquals(Offset(0f, 0f), childPosition.value)
     }
 
@@ -419,10 +419,10 @@
                 Modifier.preferredWidth(IntrinsicSize.Min), 10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
             )
         }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(10.dp.toIntPx(), minIntrinsicWidth(0))
-            assertEquals(40.dp.toIntPx(), minIntrinsicHeight(0))
-            assertEquals(10.dp.toIntPx(), maxIntrinsicWidth(0))
-            assertEquals(60.dp.toIntPx(), maxIntrinsicHeight(0))
+            assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
+            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
+            assertEquals(10.dp.roundToPx(), maxIntrinsicWidth(0))
+            assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
         }
     }
 
@@ -434,10 +434,10 @@
                 10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
             )
         }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(10.dp.toIntPx(), minIntrinsicWidth(0))
-            assertEquals(40.dp.toIntPx(), minIntrinsicHeight(0))
-            assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(0))
-            assertEquals(40.dp.toIntPx(), maxIntrinsicHeight(0))
+            assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
+            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
+            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
+            assertEquals(40.dp.roundToPx(), maxIntrinsicHeight(0))
         }
     }
 
@@ -448,10 +448,10 @@
                 Modifier.preferredWidth(IntrinsicSize.Max), 10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
             )
         }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(30.dp.toIntPx(), minIntrinsicWidth(0))
-            assertEquals(40.dp.toIntPx(), minIntrinsicHeight(0))
-            assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(0))
-            assertEquals(60.dp.toIntPx(), maxIntrinsicHeight(0))
+            assertEquals(30.dp.roundToPx(), minIntrinsicWidth(0))
+            assertEquals(40.dp.roundToPx(), minIntrinsicHeight(0))
+            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
+            assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
         }
     }
 
@@ -463,10 +463,10 @@
                 10.dp, 20.dp, 30.dp, 40.dp, 50.dp, 60.dp
             )
         }) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
-            assertEquals(10.dp.toIntPx(), minIntrinsicWidth(0))
-            assertEquals(60.dp.toIntPx(), minIntrinsicHeight(0))
-            assertEquals(30.dp.toIntPx(), maxIntrinsicWidth(0))
-            assertEquals(60.dp.toIntPx(), maxIntrinsicHeight(0))
+            assertEquals(10.dp.roundToPx(), minIntrinsicWidth(0))
+            assertEquals(60.dp.roundToPx(), minIntrinsicHeight(0))
+            assertEquals(30.dp.roundToPx(), maxIntrinsicWidth(0))
+            assertEquals(60.dp.roundToPx(), maxIntrinsicHeight(0))
         }
     }
 }
@@ -483,15 +483,15 @@
 ) {
     Layout(
         {},
-        minIntrinsicWidthMeasureBlock = { _, _ -> minIntrinsicWidth.toIntPx() },
-        minIntrinsicHeightMeasureBlock = { _, _ -> minIntrinsicHeight.toIntPx() },
-        maxIntrinsicWidthMeasureBlock = { _, _ -> maxIntrinsicWidth.toIntPx() },
-        maxIntrinsicHeightMeasureBlock = { _, _ -> maxIntrinsicHeight.toIntPx() },
+        minIntrinsicWidthMeasureBlock = { _, _ -> minIntrinsicWidth.roundToPx() },
+        minIntrinsicHeightMeasureBlock = { _, _ -> minIntrinsicHeight.roundToPx() },
+        maxIntrinsicWidthMeasureBlock = { _, _ -> maxIntrinsicWidth.roundToPx() },
+        maxIntrinsicHeightMeasureBlock = { _, _ -> maxIntrinsicHeight.roundToPx() },
         modifier = modifier
     ) { _, constraints ->
         layout(
-            constraints.constrainWidth(width.toIntPx()),
-            constraints.constrainHeight(height.toIntPx())
+            constraints.constrainWidth(width.roundToPx()),
+            constraints.constrainHeight(height.roundToPx())
         ) {}
     }
 }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
index 28b5cdc..6697ab4 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
@@ -35,7 +35,7 @@
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.ViewRootForTest
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.unit.Constraints
@@ -213,7 +213,7 @@
         modifier: Modifier = Modifier,
         content: @Composable () -> Unit
     ) {
-        with(AmbientDensity.current) {
+        with(LocalDensity.current) {
             val pxConstraints = Constraints(constraints)
             Layout(
                 content,
@@ -295,10 +295,10 @@
      */
     @Stable
     fun Density.Constraints(dpConstraints: DpConstraints) = Constraints(
-        minWidth = dpConstraints.minWidth.toIntPx(),
-        maxWidth = dpConstraints.maxWidth.toIntPx(),
-        minHeight = dpConstraints.minHeight.toIntPx(),
-        maxHeight = dpConstraints.maxHeight.toIntPx()
+        minWidth = dpConstraints.minWidth.roundToPx(),
+        maxWidth = dpConstraints.maxWidth.roundToPx(),
+        minHeight = dpConstraints.minHeight.roundToPx(),
+        maxHeight = dpConstraints.maxHeight.roundToPx()
     )
 
     internal fun assertEquals(expected: Size?, actual: Size?) {
@@ -376,13 +376,13 @@
         Layout(content, modifier) { measurables, incomingConstraints ->
             val containerConstraints = Constraints(constraints)
                 .copy(
-                    width?.toIntPx() ?: constraints.minWidth.toIntPx(),
-                    width?.toIntPx() ?: constraints.maxWidth.toIntPx(),
-                    height?.toIntPx() ?: constraints.minHeight.toIntPx(),
-                    height?.toIntPx() ?: constraints.maxHeight.toIntPx()
+                    width?.roundToPx() ?: constraints.minWidth.roundToPx(),
+                    width?.roundToPx() ?: constraints.maxWidth.roundToPx(),
+                    height?.roundToPx() ?: constraints.minHeight.roundToPx(),
+                    height?.roundToPx() ?: constraints.maxHeight.roundToPx()
                 ).enforce(incomingConstraints)
-            val totalHorizontal = padding.start.toIntPx() + padding.end.toIntPx()
-            val totalVertical = padding.top.toIntPx() + padding.bottom.toIntPx()
+            val totalHorizontal = padding.start.roundToPx() + padding.end.roundToPx()
+            val totalVertical = padding.top.roundToPx() + padding.bottom.roundToPx()
             val childConstraints = containerConstraints
                 .copy(minWidth = 0, minHeight = 0)
                 .offset(-totalHorizontal, -totalVertical)
@@ -414,8 +414,8 @@
                         layoutDirection
                     )
                     it.placeRelative(
-                        padding.start.toIntPx() + position.x,
-                        padding.top.toIntPx() + position.y
+                        padding.start.roundToPx() + position.x,
+                        padding.top.roundToPx() + position.y
                     )
                 }
             }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt
index cbca1c0..3fac96c 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/OffsetTest.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInRoot
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
@@ -90,8 +90,8 @@
 
         rule.onNodeWithTag("box").assertExists()
         rule.runOnIdle {
-            assertEquals(offsetX.toIntPx(), positionX)
-            assertEquals(offsetY.toIntPx(), positionY)
+            assertEquals(offsetX.roundToPx(), positionX)
+            assertEquals(offsetY.roundToPx(), positionY)
         }
     }
 
@@ -104,7 +104,7 @@
         var positionX = 0
         var positionY = 0
         rule.setContent {
-            Providers((AmbientLayoutDirection provides LayoutDirection.Rtl)) {
+            Providers((LocalLayoutDirection provides LayoutDirection.Rtl)) {
                 Box(
                     Modifier.testTag("box")
                         .wrapContentSize(Alignment.TopEnd)
@@ -124,8 +124,8 @@
 
         rule.onNodeWithTag("box").assertExists()
         rule.runOnIdle {
-            assertEquals(containerWidth.toIntPx() - offsetX.toIntPx() - boxSize, positionX)
-            assertEquals(offsetY.toIntPx(), positionY)
+            assertEquals(containerWidth.roundToPx() - offsetX.roundToPx() - boxSize, positionX)
+            assertEquals(offsetY.roundToPx(), positionY)
         }
     }
 
@@ -150,8 +150,8 @@
 
         rule.onNodeWithTag("box").assertExists()
         rule.runOnIdle {
-            assertEquals(offsetX.toIntPx(), positionX)
-            assertEquals(offsetY.toIntPx(), positionY)
+            assertEquals(offsetX.roundToPx(), positionX)
+            assertEquals(offsetY.roundToPx(), positionY)
         }
     }
 
@@ -164,7 +164,7 @@
         var positionX = 0
         var positionY = 0
         rule.setContent {
-            Providers((AmbientLayoutDirection provides LayoutDirection.Rtl)) {
+            Providers((LocalLayoutDirection provides LayoutDirection.Rtl)) {
                 Box(
                     Modifier.testTag("box")
                         .wrapContentSize(Alignment.TopEnd)
@@ -184,8 +184,8 @@
 
         rule.onNodeWithTag("box").assertExists()
         rule.runOnIdle {
-            assertEquals(containerWidth.toIntPx() - boxSize + offsetX.toIntPx(), positionX)
-            assertEquals(offsetY.toIntPx(), positionY)
+            assertEquals(containerWidth.roundToPx() - boxSize + offsetX.roundToPx(), positionX)
+            assertEquals(offsetY.roundToPx(), positionY)
         }
     }
 
@@ -224,7 +224,7 @@
         var positionX = 0
         var positionY = 0
         rule.setContent {
-            Providers((AmbientLayoutDirection provides LayoutDirection.Rtl)) {
+            Providers((LocalLayoutDirection provides LayoutDirection.Rtl)) {
                 Box(
                     Modifier.testTag("box")
                         .wrapContentSize(Alignment.TopEnd)
@@ -245,7 +245,7 @@
         rule.onNodeWithTag("box").assertExists()
         rule.runOnIdle {
             Assert.assertEquals(
-                containerWidth.toIntPx() - offsetX - boxSize,
+                containerWidth.roundToPx() - offsetX - boxSize,
                 positionX
             )
             Assert.assertEquals(offsetY, positionY)
@@ -287,7 +287,7 @@
         var positionX = 0
         var positionY = 0
         rule.setContent {
-            Providers((AmbientLayoutDirection provides LayoutDirection.Rtl)) {
+            Providers((LocalLayoutDirection provides LayoutDirection.Rtl)) {
                 Box(
                     Modifier.testTag("box")
                         .wrapContentSize(Alignment.TopEnd)
@@ -308,7 +308,7 @@
         rule.onNodeWithTag("box").assertExists()
         rule.runOnIdle {
             Assert.assertEquals(
-                containerWidth.toIntPx() - boxSize + offsetX,
+                containerWidth.roundToPx() - boxSize + offsetX,
                 positionX
             )
             Assert.assertEquals(offsetY, positionY)
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt
index 7df407d..00af6b8 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/PaddingTest.kt
@@ -25,8 +25,8 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.unit.Constraints
@@ -195,10 +195,10 @@
             }
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Spacing is applied on both sides of an axis
-            val totalAxisSpacing = (padding * 2).toIntPx()
+            val totalAxisSpacing = (padding * 2).roundToPx()
 
             // When the width/height is measured as 3 x the padding
-            val testDimension = (padding * 3).toIntPx()
+            val testDimension = (padding * 3).roundToPx()
             // The actual dimension for the AspectRatio will be: test dimension - total padding
             val actualAspectRatioDimension = testDimension - totalAxisSpacing
 
@@ -214,19 +214,19 @@
 
             try {
                 // Min width.
-                assertEquals(totalAxisSpacing, minIntrinsicWidth(0.dp.toIntPx()))
+                assertEquals(totalAxisSpacing, minIntrinsicWidth(0.dp.roundToPx()))
                 assertEquals(expectedTotalWidth, minIntrinsicWidth(testDimension))
                 assertEquals(totalAxisSpacing, minIntrinsicWidth(Constraints.Infinity))
                 // Min height.
-                assertEquals(totalAxisSpacing, minIntrinsicHeight(0.dp.toIntPx()))
+                assertEquals(totalAxisSpacing, minIntrinsicHeight(0.dp.roundToPx()))
                 assertEquals(expectedTotalHeight, minIntrinsicHeight(testDimension))
                 assertEquals(totalAxisSpacing, minIntrinsicHeight(Constraints.Infinity))
                 // Max width.
-                assertEquals(totalAxisSpacing, maxIntrinsicWidth(0.dp.toIntPx()))
+                assertEquals(totalAxisSpacing, maxIntrinsicWidth(0.dp.roundToPx()))
                 assertEquals(expectedTotalWidth, maxIntrinsicWidth(testDimension))
                 assertEquals(totalAxisSpacing, maxIntrinsicWidth(Constraints.Infinity))
                 // Max height.
-                assertEquals(totalAxisSpacing, maxIntrinsicHeight(0.dp.toIntPx()))
+                assertEquals(totalAxisSpacing, maxIntrinsicHeight(0.dp.roundToPx()))
                 assertEquals(expectedTotalHeight, maxIntrinsicHeight(testDimension))
                 assertEquals(totalAxisSpacing, maxIntrinsicHeight(Constraints.Infinity))
             } catch (t: Throwable) {
@@ -245,13 +245,13 @@
     @Test
     fun testPadding_rtl() = with(density) {
         val sizeDp = 100.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val padding1Dp = 5.dp
         val padding2Dp = 10.dp
         val padding3Dp = 15.dp
-        val padding1 = padding1Dp.toIntPx()
-        val padding2 = padding2Dp.toIntPx()
-        val padding3 = padding3Dp.toIntPx()
+        val padding1 = padding1Dp.roundToPx()
+        val padding2 = padding2Dp.roundToPx()
+        val padding3 = padding3Dp.roundToPx()
 
         val drawLatch = CountDownLatch(3)
         val childSize = Array(3) { IntSize(0, 0) }
@@ -260,7 +260,7 @@
         // ltr: P1 S P2 | S P3 | P1 S
         // rtl:    S P1 | P3 S | P2 S P1
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(Modifier.fillMaxSize()) {
                     Box(
                         Modifier.padding(start = padding1Dp, end = padding2Dp)
@@ -322,13 +322,13 @@
     @Test
     fun testAbsolutePadding_rtl() = with(density) {
         val sizeDp = 100.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val padding1Dp = 5.dp
         val padding2Dp = 10.dp
         val padding3Dp = 15.dp
-        val padding1 = padding1Dp.toIntPx()
-        val padding2 = padding2Dp.toIntPx()
-        val padding3 = padding3Dp.toIntPx()
+        val padding1 = padding1Dp.roundToPx()
+        val padding2 = padding2Dp.roundToPx()
+        val padding3 = padding3Dp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childPosition = Array(2) { Offset(0f, 0f) }
@@ -336,7 +336,7 @@
         // ltr: P1 S P2 | S P3
         // rtl:    S P3 | P1 S P2
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(Modifier.fillMaxSize()) {
                     Box(
                         Modifier.absolutePadding(left = padding1Dp, right = padding2Dp)
@@ -423,8 +423,8 @@
         paddingContainer: @Composable (@Composable () -> Unit) -> Unit
     ) = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
-        val paddingPx = padding.toIntPx()
+        val size = sizeDp.roundToPx()
+        val paddingPx = padding.roundToPx()
 
         val drawLatch = CountDownLatch(1)
         var childSize = IntSize(-1, -1)
@@ -472,7 +472,7 @@
         paddingContainer: @Composable ((@Composable () -> Unit) -> Unit)
     ) = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(1)
         var childSize = IntSize(-1, -1)
@@ -502,10 +502,10 @@
         val root = findComposeView()
         waitForDraw(root)
 
-        val paddingLeft = left.toIntPx()
-        val paddingRight = right.toIntPx()
-        val paddingTop = top.toIntPx()
-        val paddingBottom = bottom.toIntPx()
+        val paddingLeft = left.roundToPx()
+        val paddingRight = right.roundToPx()
+        val paddingTop = top.roundToPx()
+        val paddingBottom = bottom.roundToPx()
         assertEquals(
             IntSize(
                 size - paddingLeft - paddingRight,
@@ -526,8 +526,8 @@
         paddingContainer: @Composable (@Composable () -> Unit) -> Unit
     ) = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
-        val paddingPx = padding.toIntPx()
+        val size = sizeDp.roundToPx()
+        val paddingPx = padding.roundToPx()
 
         val drawLatch = CountDownLatch(1)
         var childSize = IntSize(-1, -1)
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
index 3326100..3ca28e5 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
@@ -30,8 +30,8 @@
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.Ref
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.unit.Constraints
@@ -73,7 +73,7 @@
     @Test
     fun testRow() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
@@ -123,7 +123,7 @@
     fun testRow_withChildrenWithWeight() = with(density) {
         val width = 50.toDp()
         val height = 80.toDp()
-        val childrenHeight = height.toIntPx()
+        val childrenHeight = height.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOfNulls<IntSize>(2)
@@ -178,9 +178,9 @@
     @Test
     fun testRow_withChildrenWithWeightNonFilling() = with(density) {
         val width = 50.toDp()
-        val childrenWidth = width.toIntPx()
+        val childrenWidth = width.roundToPx()
         val height = 80.toDp()
-        val childrenHeight = height.toIntPx()
+        val childrenHeight = height.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOfNulls<IntSize>(2)
@@ -228,7 +228,7 @@
     @Test
     fun testColumn() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
@@ -276,7 +276,7 @@
     @Test
     fun testColumn_withChildrenWithWeight() = with(density) {
         val width = 80.toDp()
-        val childrenWidth = width.toIntPx()
+        val childrenWidth = width.roundToPx()
         val height = 50.toDp()
 
         val drawLatch = CountDownLatch(2)
@@ -330,9 +330,9 @@
     @Test
     fun testColumn_withChildrenWithWeightNonFilling() = with(density) {
         val width = 80.toDp()
-        val childrenWidth = width.toIntPx()
+        val childrenWidth = width.roundToPx()
         val height = 50.toDp()
-        val childrenHeight = height.toIntPx()
+        val childrenHeight = height.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOfNulls<IntSize>(2)
@@ -588,7 +588,7 @@
     @Test
     fun testRow_withStretchCrossAxisAlignment() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
@@ -637,7 +637,7 @@
     @Test
     fun testRow_withGravityModifier_andGravityParameter() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(3)
         val childSize = arrayOfNulls<IntSize>(3)
@@ -709,7 +709,7 @@
     @Test
     fun testRow_withGravityModifier() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(3)
         val childSize = arrayOfNulls<IntSize>(3)
@@ -779,13 +779,13 @@
     @Test
     fun testRow_withAlignByModifier() = with(density) {
         val baseline1Dp = 30.toDp()
-        val baseline1 = baseline1Dp.toIntPx()
+        val baseline1 = baseline1Dp.roundToPx()
         val baseline2Dp = 25.toDp()
-        val baseline2 = baseline2Dp.toIntPx()
+        val baseline2 = baseline2Dp.roundToPx()
         val baseline3Dp = 20.toDp()
-        val baseline3 = baseline3Dp.toIntPx()
+        val baseline3 = baseline3Dp.roundToPx()
         val sizeDp = 40.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(5)
         val childSize = arrayOfNulls<IntSize>(5)
@@ -889,9 +889,9 @@
     @Test
     fun testRow_withAlignByModifier_andWeight() = with(density) {
         val baselineDp = 30.toDp()
-        val baseline = baselineDp.toIntPx()
+        val baseline = baselineDp.roundToPx()
         val sizeDp = 40.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOfNulls<IntSize>(2)
@@ -940,7 +940,7 @@
     @Test
     fun testColumn_withStretchCrossAxisAlignment() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOf(IntSize(-1, -1), IntSize(-1, -1))
@@ -979,7 +979,7 @@
 
         assertEquals(IntSize(root.width, size), childSize[0])
         assertEquals(
-            IntSize(root.width, (sizeDp * 2).toIntPx()),
+            IntSize(root.width, (sizeDp * 2).roundToPx()),
             childSize[1]
         )
         assertEquals(Offset(0f, 0f), childPosition[0])
@@ -989,7 +989,7 @@
     @Test
     fun testColumn_withGravityModifier() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(3)
         val childSize = arrayOfNulls<IntSize>(3)
@@ -1059,7 +1059,7 @@
     @Test
     fun testColumn_withGravityModifier_andGravityParameter() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(3)
         val childSize = arrayOfNulls<IntSize>(3)
@@ -1128,7 +1128,7 @@
     @Test
     fun testColumn_withAlignByModifier() = with(density) {
         val sizeDp = 40.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val firstBaseline1Dp = 20.toDp()
         val firstBaseline2Dp = 30.toDp()
 
@@ -1196,7 +1196,7 @@
         assertEquals(IntSize(size, size), childSize[2])
         assertEquals(
             Offset(
-                (size - firstBaseline1Dp.toIntPx()).toFloat(),
+                (size - firstBaseline1Dp.roundToPx()).toFloat(),
                 size.toFloat() * 2
             ),
             childPosition[2]
@@ -1205,7 +1205,7 @@
         assertEquals(IntSize(size, size), childSize[3])
         assertEquals(
             Offset(
-                (size - firstBaseline2Dp.toIntPx()).toFloat(),
+                (size - firstBaseline2Dp.roundToPx()).toFloat(),
                 size.toFloat() * 3
             ),
             childPosition[3]
@@ -1215,9 +1215,9 @@
     @Test
     fun testColumn_withAlignByModifier_andWeight() = with(density) {
         val baselineDp = 30.toDp()
-        val baseline = baselineDp.toIntPx()
+        val baseline = baselineDp.roundToPx()
         val sizeDp = 40.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childSize = arrayOfNulls<IntSize>(2)
@@ -1318,7 +1318,7 @@
         waitForDraw(root)
 
         assertEquals(
-            (sizeDp * 3).toIntPx(),
+            (sizeDp * 3).roundToPx(),
             rowSize.width
         )
     }
@@ -1417,7 +1417,7 @@
         waitForDraw(root)
 
         assertEquals(
-            (sizeDp * 2).toIntPx(),
+            (sizeDp * 2).roundToPx(),
             rowSize.height
         )
     }
@@ -1450,7 +1450,7 @@
         waitForDraw(root)
 
         assertEquals(
-            min(root.width, rowWidthDp.toIntPx()),
+            min(root.width, rowWidthDp.roundToPx()),
             rowSize.width
         )
     }
@@ -1492,7 +1492,7 @@
         waitForDraw(root)
 
         assertEquals(
-            min(root.width, rowWidthDp.toIntPx()),
+            min(root.width, rowWidthDp.roundToPx()),
             rowSize.width
         )
     }
@@ -1525,7 +1525,7 @@
         waitForDraw(root)
 
         assertEquals(
-            rowWidthDp.toIntPx(),
+            rowWidthDp.roundToPx(),
             rowSize.width
         )
     }
@@ -1558,7 +1558,7 @@
         waitForDraw(root)
 
         assertEquals(
-            min(root.height, rowHeightDp.toIntPx()),
+            min(root.height, rowHeightDp.roundToPx()),
             rowSize.height
         )
     }
@@ -1591,7 +1591,7 @@
         waitForDraw(root)
 
         assertEquals(
-            rowHeightDp.toIntPx(),
+            rowHeightDp.roundToPx(),
             rowSize.height
         )
     }
@@ -1603,9 +1603,9 @@
     )
     fun testRow_withMinMainAxisSize() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val rowWidthDp = 250.toDp()
-        val rowWidth = rowWidthDp.toIntPx()
+        val rowWidth = rowWidthDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         var rowSize: IntSize = IntSize.Zero
@@ -1660,19 +1660,19 @@
                     Row {
                         BoxWithConstraints {
                             assertEquals(Constraints(), constraints)
-                            FixedSizeLayout(noWeightChildWidth.toIntPx(), 0, mapOf())
+                            FixedSizeLayout(noWeightChildWidth.roundToPx(), 0, mapOf())
                         }
                         BoxWithConstraints {
                             assertEquals(Constraints(), constraints)
-                            FixedSizeLayout(noWeightChildWidth.toIntPx(), 0, mapOf())
+                            FixedSizeLayout(noWeightChildWidth.roundToPx(), 0, mapOf())
                         }
                         Layout({}, Modifier.weight(1f)) { _, constraints ->
                             assertEquals(
-                                rowMinWidth.toIntPx() - noWeightChildWidth.toIntPx() * 2,
+                                rowMinWidth.roundToPx() - noWeightChildWidth.roundToPx() * 2,
                                 constraints.minWidth
                             )
                             assertEquals(
-                                rowMinWidth.toIntPx() - noWeightChildWidth.toIntPx() * 2,
+                                rowMinWidth.roundToPx() - noWeightChildWidth.roundToPx() * 2,
                                 constraints.maxWidth
                             )
                             latch.countDown()
@@ -1706,22 +1706,30 @@
                         BoxWithConstraints {
                             assertEquals(
                                 Constraints(
-                                    maxWidth = availableWidth.toIntPx(),
-                                    maxHeight = availableHeight.toIntPx()
+                                    maxWidth = availableWidth.roundToPx(),
+                                    maxHeight = availableHeight.roundToPx()
                                 ),
                                 constraints
                             )
-                            FixedSizeLayout(childWidth.toIntPx(), childHeight.toIntPx(), mapOf())
+                            FixedSizeLayout(
+                                childWidth.roundToPx(),
+                                childHeight.roundToPx(),
+                                mapOf()
+                            )
                         }
                         BoxWithConstraints {
                             assertEquals(
                                 Constraints(
-                                    maxWidth = availableWidth.toIntPx() - childWidth.toIntPx(),
-                                    maxHeight = availableHeight.toIntPx()
+                                    maxWidth = availableWidth.roundToPx() - childWidth.roundToPx(),
+                                    maxHeight = availableHeight.roundToPx()
                                 ),
                                 constraints
                             )
-                            FixedSizeLayout(childWidth.toIntPx(), childHeight.toIntPx(), mapOf())
+                            FixedSizeLayout(
+                                childWidth.roundToPx(),
+                                childHeight.roundToPx(),
+                                mapOf()
+                            )
                             latch.countDown()
                         }
                     }
@@ -1788,7 +1796,7 @@
         waitForDraw(root)
 
         assertEquals(
-            (sizeDp * 3).toIntPx(),
+            (sizeDp * 3).roundToPx(),
             columnSize.height
         )
     }
@@ -1887,7 +1895,7 @@
         waitForDraw(root)
 
         assertEquals(
-            (sizeDp * 2).toIntPx(),
+            (sizeDp * 2).roundToPx(),
             columnSize.width
         )
     }
@@ -1920,7 +1928,7 @@
         waitForDraw(root)
 
         assertEquals(
-            min(root.height, columnHeightDp.toIntPx()),
+            min(root.height, columnHeightDp.roundToPx()),
             columnSize.height
         )
     }
@@ -1962,7 +1970,7 @@
         waitForDraw(root)
 
         assertEquals(
-            min(root.height, columnHeightDp.toIntPx()),
+            min(root.height, columnHeightDp.roundToPx()),
             columnSize.height
         )
     }
@@ -1995,7 +2003,7 @@
         waitForDraw(root)
 
         assertEquals(
-            columnHeightDp.toIntPx(),
+            columnHeightDp.roundToPx(),
             columnSize.height
         )
     }
@@ -2028,7 +2036,7 @@
         waitForDraw(root)
 
         assertEquals(
-            min(root.width, columnWidthDp.toIntPx()),
+            min(root.width, columnWidthDp.roundToPx()),
             columnSize.width
         )
     }
@@ -2061,7 +2069,7 @@
         waitForDraw(root)
 
         assertEquals(
-            columnWidthDp.toIntPx(),
+            columnWidthDp.roundToPx(),
             columnSize.width
         )
     }
@@ -2073,9 +2081,9 @@
     )
     fun testColumn_withMinMainAxisSize() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val columnHeightDp = 250.toDp()
-        val columnHeight = columnHeightDp.toIntPx()
+        val columnHeight = columnHeightDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         var columnSize: IntSize = IntSize.Zero
@@ -2132,19 +2140,29 @@
                         Column {
                             BoxWithConstraints {
                                 assertEquals(Constraints(), constraints)
-                                FixedSizeLayout(0, noWeightChildHeight.toIntPx(), mapOf())
+                                FixedSizeLayout(
+                                    0,
+                                    noWeightChildHeight.roundToPx(),
+                                    mapOf()
+                                )
                             }
                             BoxWithConstraints {
                                 assertEquals(Constraints(), constraints)
-                                FixedSizeLayout(0, noWeightChildHeight.toIntPx(), mapOf())
+                                FixedSizeLayout(
+                                    0,
+                                    noWeightChildHeight.roundToPx(),
+                                    mapOf()
+                                )
                             }
                             Layout({}, Modifier.weight(1f)) { _, constraints ->
                                 assertEquals(
-                                    columnMinHeight.toIntPx() - noWeightChildHeight.toIntPx() * 2,
+                                    columnMinHeight.roundToPx() -
+                                        noWeightChildHeight.roundToPx() * 2,
                                     constraints.minHeight
                                 )
                                 assertEquals(
-                                    columnMinHeight.toIntPx() - noWeightChildHeight.toIntPx() * 2,
+                                    columnMinHeight.roundToPx() -
+                                        noWeightChildHeight.roundToPx() * 2,
                                     constraints.maxHeight
                                 )
                                 latch.countDown()
@@ -2177,22 +2195,31 @@
                         BoxWithConstraints {
                             assertEquals(
                                 Constraints(
-                                    maxWidth = availableWidth.toIntPx(),
-                                    maxHeight = availableHeight.toIntPx()
+                                    maxWidth = availableWidth.roundToPx(),
+                                    maxHeight = availableHeight.roundToPx()
                                 ),
                                 constraints
                             )
-                            FixedSizeLayout(childWidth.toIntPx(), childHeight.toIntPx(), mapOf())
+                            FixedSizeLayout(
+                                childWidth.roundToPx(),
+                                childHeight.roundToPx(),
+                                mapOf()
+                            )
                         }
                         BoxWithConstraints {
                             assertEquals(
                                 Constraints(
-                                    maxWidth = availableWidth.toIntPx(),
-                                    maxHeight = availableHeight.toIntPx() - childHeight.toIntPx()
+                                    maxWidth = availableWidth.roundToPx(),
+                                    maxHeight = availableHeight.roundToPx() -
+                                        childHeight.roundToPx()
                                 ),
                                 constraints
                             )
-                            FixedSizeLayout(childWidth.toIntPx(), childHeight.toIntPx(), mapOf())
+                            FixedSizeLayout(
+                                childWidth.roundToPx(),
+                                childHeight.roundToPx(),
+                                mapOf()
+                            )
                             latch.countDown()
                         }
                     }
@@ -2207,7 +2234,7 @@
     @Test
     fun testRow_withStartArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2253,7 +2280,7 @@
     @Test
     fun testRow_withEndArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2299,7 +2326,7 @@
     @Test
     fun testRow_withCenterArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2355,7 +2382,7 @@
     @Test
     fun testRow_withSpaceEvenlyArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2410,7 +2437,7 @@
     @Test
     fun testRow_withSpaceBetweenArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2463,7 +2490,7 @@
     @Test
     fun testRow_withSpaceAroundArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2669,7 +2696,7 @@
     @Test
     fun testColumn_withTopArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2714,7 +2741,7 @@
     @Test
     fun testColumn_withBottomArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2760,7 +2787,7 @@
     @Test
     fun testColumn_withCenterArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2819,7 +2846,7 @@
     @Test
     fun testColumn_withSpaceEvenlyArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2883,7 +2910,7 @@
     @Test
     fun testColumn_withSpaceBetweenArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -2936,7 +2963,7 @@
     @Test
     fun testColumn_withSpaceAroundArrangement() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(4)
         val childPosition = arrayOf(
@@ -3141,7 +3168,7 @@
     fun testRow_doesNotUseMinConstraintsOnChildren() = with(density) {
         val sizeDp = 50.toDp()
         val childSizeDp = 30.toDp()
-        val childSize = childSizeDp.toIntPx()
+        val childSize = childSizeDp.roundToPx()
 
         val layoutLatch = CountDownLatch(1)
         val containerSize = Ref<IntSize>()
@@ -3171,7 +3198,7 @@
     fun testColumn_doesNotUseMinConstraintsOnChildren() = with(density) {
         val sizeDp = 50.toDp()
         val childSizeDp = 30.toDp()
-        val childSize = childSizeDp.toIntPx()
+        val childSize = childSizeDp.roundToPx()
 
         val layoutLatch = CountDownLatch(1)
         val containerSize = Ref<IntSize>()
@@ -3313,27 +3340,27 @@
             }
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
-            assertEquals(50.toDp().toIntPx(), minIntrinsicWidth(0.toDp().toIntPx()))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
             assertEquals(
-                25.toDp().toIntPx() * 2 + 50.toDp().toIntPx(),
-                minIntrinsicWidth(25.toDp().toIntPx())
+                25.toDp().roundToPx() * 2 + 50.toDp().roundToPx(),
+                minIntrinsicWidth(25.toDp().roundToPx())
             )
-            assertEquals(50.toDp().toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
             // Min height.
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(0.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(70.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(70.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
             // Max width.
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicWidth(0.toDp().toIntPx()))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
             assertEquals(
-                25.toDp().toIntPx() * 2 + 50.toDp().toIntPx(),
-                maxIntrinsicWidth(25.toDp().toIntPx())
+                25.toDp().roundToPx() * 2 + 50.toDp().roundToPx(),
+                maxIntrinsicWidth(25.toDp().roundToPx())
             )
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
             // Max height.
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(0.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(70.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(70.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
@@ -3508,48 +3535,48 @@
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 minIntrinsicWidth(0)
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
-                minIntrinsicWidth(10.toDp().toIntPx())
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                minIntrinsicWidth(10.toDp().roundToPx())
             )
             assertEquals(
-                25.toDp().toIntPx() * 2 / 2 * 7 + 20.toDp().toIntPx(),
-                minIntrinsicWidth(25.toDp().toIntPx())
+                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                minIntrinsicWidth(25.toDp().roundToPx())
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 minIntrinsicWidth(Constraints.Infinity)
             )
             // Min height.
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(0.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(125.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), minIntrinsicHeight(370.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(125.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicHeight(370.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
             // Max width.
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 maxIntrinsicWidth(0)
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
-                maxIntrinsicWidth(10.toDp().toIntPx())
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                maxIntrinsicWidth(10.toDp().roundToPx())
             )
             assertEquals(
-                25.toDp().toIntPx() * 2 / 2 * 7 + 20.toDp().toIntPx(),
-                maxIntrinsicWidth(25.toDp().toIntPx())
+                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                maxIntrinsicWidth(25.toDp().roundToPx())
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 maxIntrinsicWidth(Constraints.Infinity)
             )
             // Max height.
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(0.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(125.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicHeight(370.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(125.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicHeight(370.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
@@ -3667,27 +3694,27 @@
             }
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
-            assertEquals(50.toDp().toIntPx(), minIntrinsicWidth(0.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), minIntrinsicWidth(25.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(25.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
             // Min height.
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(0.toDp().toIntPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(0.toDp().roundToPx()))
             assertEquals(
-                50.toDp().toIntPx() / 2 + 40.toDp().toIntPx(),
-                minIntrinsicHeight(50.toDp().toIntPx())
+                50.toDp().roundToPx() / 2 + 40.toDp().roundToPx(),
+                minIntrinsicHeight(50.toDp().roundToPx())
             )
-            assertEquals(40.toDp().toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicHeight(Constraints.Infinity))
             // Max width.
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicWidth(0.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicWidth(25.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(25.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
             // Max height.
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(0.toDp().toIntPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(0.toDp().roundToPx()))
             assertEquals(
-                50.toDp().toIntPx() / 2 + 40.toDp().toIntPx(),
-                maxIntrinsicHeight(50.toDp().toIntPx())
+                50.toDp().roundToPx() / 2 + 40.toDp().roundToPx(),
+                maxIntrinsicHeight(50.toDp().roundToPx())
             )
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
@@ -3836,47 +3863,47 @@
             }
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
-            assertEquals(40.toDp().toIntPx(), minIntrinsicWidth(0.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), minIntrinsicWidth(125.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), minIntrinsicWidth(370.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(0.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(125.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), minIntrinsicWidth(370.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), minIntrinsicWidth(Constraints.Infinity))
             // Min height.
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 minIntrinsicHeight(0)
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
-                minIntrinsicHeight(10.toDp().toIntPx())
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                minIntrinsicHeight(10.toDp().roundToPx())
             )
             assertEquals(
-                25.toDp().toIntPx() * 2 / 2 * 7 + 20.toDp().toIntPx(),
-                minIntrinsicHeight(25.toDp().toIntPx())
+                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                minIntrinsicHeight(25.toDp().roundToPx())
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 minIntrinsicHeight(Constraints.Infinity)
             )
             // Max width.
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicWidth(0.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicWidth(125.toDp().toIntPx()))
-            assertEquals(50.toDp().toIntPx(), maxIntrinsicWidth(370.toDp().toIntPx()))
-            assertEquals(40.toDp().toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(0.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(125.toDp().roundToPx()))
+            assertEquals(50.toDp().roundToPx(), maxIntrinsicWidth(370.toDp().roundToPx()))
+            assertEquals(40.toDp().roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
             // Max height.
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 maxIntrinsicHeight(0)
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
-                maxIntrinsicHeight(10.toDp().toIntPx())
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
+                maxIntrinsicHeight(10.toDp().roundToPx())
             )
             assertEquals(
-                25.toDp().toIntPx() * 2 / 2 * 7 + 20.toDp().toIntPx(),
-                maxIntrinsicHeight(25.toDp().toIntPx())
+                25.toDp().roundToPx() * 2 / 2 * 7 + 20.toDp().roundToPx(),
+                maxIntrinsicHeight(25.toDp().roundToPx())
             )
             assertEquals(
-                30.toDp().toIntPx() / 2 * 7 + 20.toDp().toIntPx(),
+                30.toDp().roundToPx() / 2 * 7 + 20.toDp().roundToPx(),
                 maxIntrinsicHeight(Constraints.Infinity)
             )
         }
@@ -3895,15 +3922,15 @@
                     Modifier.width(dividerWidth).fillMaxHeight().onGloballyPositioned {
                         assertEquals(
                             it.size.height,
-                            (rowWidth.toIntPx() - dividerWidth.toIntPx()) / 2
+                            (rowWidth.roundToPx() - dividerWidth.roundToPx()) / 2
                         )
                         positionedLatch.countDown()
                     }
                 ) {}
                 Layout(
                     content = {},
-                    minIntrinsicWidthMeasureBlock = { _, _ -> rowWidth.toIntPx() / 10 },
-                    maxIntrinsicWidthMeasureBlock = { _, _ -> rowWidth.toIntPx() * 2 },
+                    minIntrinsicWidthMeasureBlock = { _, _ -> rowWidth.roundToPx() / 10 },
+                    maxIntrinsicWidthMeasureBlock = { _, _ -> rowWidth.roundToPx() * 2 },
                     minIntrinsicHeightMeasureBlock = { _, w -> w / 2 },
                     maxIntrinsicHeightMeasureBlock = { _, w -> w / 2 }
                 ) { _, constraints -> layout(constraints.maxWidth, constraints.maxWidth / 2) {} }
@@ -3926,7 +3953,7 @@
                     Modifier.height(dividerHeight).fillMaxWidth().onGloballyPositioned {
                         assertEquals(
                             it.size.width,
-                            (columnHeight.toIntPx() - dividerHeight.toIntPx()) / 2
+                            (columnHeight.roundToPx() - dividerHeight.roundToPx()) / 2
                         )
                         positionedLatch.countDown()
                     }
@@ -3935,8 +3962,8 @@
                     content = {},
                     minIntrinsicWidthMeasureBlock = { _, h -> h / 2 },
                     maxIntrinsicWidthMeasureBlock = { _, h -> h / 2 },
-                    minIntrinsicHeightMeasureBlock = { _, _ -> columnHeight.toIntPx() / 10 },
-                    maxIntrinsicHeightMeasureBlock = { _, _ -> columnHeight.toIntPx() * 2 }
+                    minIntrinsicHeightMeasureBlock = { _, _ -> columnHeight.roundToPx() / 10 },
+                    maxIntrinsicHeightMeasureBlock = { _, _ -> columnHeight.roundToPx() * 2 }
                 ) { _, constraints -> layout(constraints.maxHeight / 2, constraints.maxHeight) {} }
             }
         }
@@ -4017,12 +4044,12 @@
     @Test
     fun testRow_Rtl_arrangementStart() = with(density) {
         val sizeDp = 35.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childPosition = arrayOf(Offset.Zero, Offset.Zero)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(Modifier.fillMaxWidth()) {
                     Container(
                         Modifier.preferredSize(sizeDp).onGloballyPositioned { coordinates ->
@@ -4066,7 +4093,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     modifier = Modifier
                         .fillMaxWidth()
@@ -4122,7 +4149,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     modifier = Modifier
                         .fillMaxWidth()
@@ -4177,7 +4204,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     modifier = Modifier
                         .fillMaxWidth()
@@ -4230,7 +4257,7 @@
         val childLayoutCoordinates = arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     modifier = Modifier
                         .fillMaxWidth()
@@ -4280,7 +4307,7 @@
         val drawLatch = CountDownLatch(2)
         val childPosition = arrayOf(Offset.Zero, Offset.Zero)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     Modifier.fillMaxWidth(),
                     horizontalArrangement = Arrangement.End
@@ -4327,7 +4354,7 @@
         val rowSize = rowSizePx.toDp()
         val latch = CountDownLatch(3)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column {
                     Row(
                         horizontalArrangement = Arrangement.spacedBy(space, Alignment.End),
@@ -4358,12 +4385,12 @@
     @Test
     fun testColumn_Rtl_gravityStart() = with(density) {
         val sizeDp = 35.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childPosition = arrayOf(Offset.Zero, Offset.Zero)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column(Modifier.fillMaxWidth()) {
                     Container(
                         Modifier.preferredSize(sizeDp).onGloballyPositioned { coordinates ->
@@ -4403,12 +4430,12 @@
     @Test
     fun testColumn_Rtl_gravityEnd() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childPosition = arrayOf(Offset.Zero, Offset.Zero)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column(Modifier.fillMaxWidth()) {
                     Container(
                         Modifier.preferredSize(sizeDp)
@@ -4442,12 +4469,12 @@
     @Test
     fun testColumn_Rtl_gravityAlignBy() = with(density) {
         val sizeDp = 50.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val drawLatch = CountDownLatch(2)
         val childPosition = arrayOf(Offset.Zero, Offset.Zero)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column(Modifier.fillMaxWidth()) {
                     Container(
                         Modifier.preferredSize(sizeDp)
@@ -4555,7 +4582,7 @@
             arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     Modifier
                         .fillMaxWidth()
@@ -4668,7 +4695,7 @@
             arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     modifier = Modifier
                         .fillMaxWidth()
@@ -4797,7 +4824,7 @@
             arrayOfNulls<LayoutCoordinates?>(childPosition.size)
         var parentLayoutCoordinates: LayoutCoordinates? = null
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Row(
                     modifier = Modifier
                         .fillMaxWidth()
@@ -4933,7 +4960,7 @@
                 arrayOfNulls<LayoutCoordinates?>(childPosition.size)
             var parentLayoutCoordinates: LayoutCoordinates? = null
             show {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Row(
                         modifier = Modifier
                             .fillMaxWidth()
@@ -5065,7 +5092,7 @@
                 arrayOfNulls<LayoutCoordinates?>(childPosition.size)
             var parentLayoutCoordinates: LayoutCoordinates? = null
             show {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Row(
                         modifier = Modifier
                             .fillMaxWidth()
@@ -5197,7 +5224,7 @@
                 arrayOfNulls<LayoutCoordinates?>(childPosition.size)
             var parentLayoutCoordinates: LayoutCoordinates? = null
             show {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Row(
                         modifier = Modifier
                             .fillMaxWidth()
@@ -5268,7 +5295,7 @@
         val rowSize = rowSizePx.toDp()
         val latch = CountDownLatch(3)
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column {
                     Row(
                         horizontalArrangement = Arrangement.Absolute.spacedBy(space, Alignment.End),
@@ -5375,14 +5402,14 @@
         content = content,
         modifier = modifier,
         measureBlock = { _, constraints ->
-            val widthPx = max(width.toIntPx(), constraints.minWidth)
+            val widthPx = max(width.roundToPx(), constraints.minWidth)
             val heightPx =
-                max(height.toIntPx(), constraints.minHeight)
+                max(height.roundToPx(), constraints.minHeight)
             layout(
                 widthPx, heightPx,
                 mapOf(
-                    horizontalLine to baseline.toIntPx(),
-                    TestVerticalLine to baseline.toIntPx()
+                    horizontalLine to baseline.roundToPx(),
+                    TestVerticalLine to baseline.roundToPx()
                 )
             ) {}
         }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
index 2eddbde..c37575dc 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
@@ -26,8 +26,8 @@
 import androidx.compose.ui.node.Ref
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInParent
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.unit.Constraints
@@ -67,7 +67,7 @@
     @Test
     fun testPreferredSize_withWidthSizeModifiers() = with(density) {
         val sizeDp = 50.toDp()
-        val sizeIpx = sizeDp.toIntPx()
+        val sizeIpx = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(6)
         val size = MutableList(6) { Ref<IntSize>() }
@@ -129,7 +129,7 @@
         assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
         assertEquals(Offset(0f, (sizeIpx * 3).toFloat()), position[3].value)
 
-        assertEquals(IntSize((sizeDp * 2).toIntPx(), sizeIpx), size[4].value)
+        assertEquals(IntSize((sizeDp * 2).roundToPx(), sizeIpx), size[4].value)
         assertEquals(Offset(0f, (sizeIpx * 4).toFloat()), position[4].value)
 
         assertEquals(IntSize(sizeIpx, sizeIpx), size[5].value)
@@ -139,7 +139,7 @@
     @Test
     fun testPreferredSize_withHeightSizeModifiers() = with(density) {
         val sizeDp = 10.toDp()
-        val sizeIpx = sizeDp.toIntPx()
+        val sizeIpx = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(6)
         val size = MutableList(6) { Ref<IntSize>() }
@@ -202,7 +202,7 @@
         assertEquals(IntSize(sizeIpx, sizeIpx), size[3].value)
         assertEquals(Offset((sizeIpx * 3).toFloat(), 0f), position[3].value)
 
-        assertEquals(IntSize(sizeIpx, (sizeDp * 2).toIntPx()), size[4].value)
+        assertEquals(IntSize(sizeIpx, (sizeDp * 2).roundToPx()), size[4].value)
         assertEquals(Offset((sizeIpx * 4).toFloat(), 0f), position[4].value)
 
         assertEquals(IntSize(sizeIpx, sizeIpx), size[5].value)
@@ -212,7 +212,7 @@
     @Test
     fun testPreferredSize_withSizeModifiers() = with(density) {
         val sizeDp = 50.toDp()
-        val sizeIpx = sizeDp.toIntPx()
+        val sizeIpx = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(5)
         val size = MutableList(5) { Ref<IntSize>() }
@@ -276,7 +276,7 @@
     @Test
     fun testPreferredSizeModifiers_respectMaxConstraint() = with(density) {
         val sizeDp = 100.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(2)
         val constrainedBoxSize = Ref<IntSize>()
@@ -316,7 +316,7 @@
     @Test
     fun testMaxModifiers_withInfiniteValue() = with(density) {
         val sizeDp = 20.toDp()
-        val sizeIpx = sizeDp.toIntPx()
+        val sizeIpx = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(4)
         val size = MutableList(4) { Ref<IntSize>() }
@@ -1338,7 +1338,7 @@
     @Test
     fun test2DWrapContentSize() = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(2)
         val alignSize = Ref<IntSize>()
@@ -1373,7 +1373,7 @@
     @Test
     fun test1DWrapContentSize() = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(2)
         val alignSize = Ref<IntSize>()
@@ -1411,13 +1411,13 @@
     @Test
     fun testWrapContentSize_rtl() = with(density) {
         val sizeDp = 200.toDp()
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(3)
         val childSize = Array(3) { Ref<IntSize>() }
         val childPosition = Array(3) { Ref<Offset>() }
         show {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(Modifier.fillMaxSize()) {
                     Box(Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
                         Box(
@@ -1482,13 +1482,13 @@
         }
 
         assertTrue(latch.await(1, TimeUnit.SECONDS))
-        assertEquals(IntSize(contentSize.toIntPx(), contentSize.toIntPx()), size.value)
+        assertEquals(IntSize(contentSize.roundToPx(), contentSize.roundToPx()), size.value)
     }
 
     @Test
     fun testWrapContentSize_wrapsContent_whenMeasuredWithInfiniteConstraints() = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(2)
         val alignSize = Ref<IntSize>()
@@ -1531,9 +1531,9 @@
     @Test
     fun testWrapContentSize_respectsMinConstraints() = with(density) {
         val sizeDp = 50.dp
-        val size = sizeDp.toIntPx()
+        val size = sizeDp.roundToPx()
         val doubleSizeDp = sizeDp * 2
-        val doubleSize = doubleSizeDp.toIntPx()
+        val doubleSize = doubleSizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(2)
         val wrapSize = Ref<IntSize>()
@@ -1557,8 +1557,8 @@
                     measureBlock = { measurables, incomingConstraints ->
                         val measurable = measurables.first()
                         val constraints = Constraints(
-                            minWidth = doubleSizeDp.toIntPx(),
-                            minHeight = doubleSizeDp.toIntPx()
+                            minWidth = doubleSizeDp.roundToPx(),
+                            minHeight = doubleSizeDp.roundToPx()
                         ).enforce(incomingConstraints)
                         val placeable = measurable.measure(constraints)
                         layout(placeable.width, placeable.height) {
@@ -1636,23 +1636,29 @@
         ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
             // Min width.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.toIntPx() * 2, minIntrinsicWidth(25.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(25.dp.roundToPx() * 2, minIntrinsicWidth(25.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
 
             // Min height.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals((50.dp.toIntPx() / 2f).roundToInt(), minIntrinsicHeight(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(
+                (50.dp.roundToPx() / 2f).roundToInt(),
+                minIntrinsicHeight(50.dp.roundToPx())
+            )
+            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
 
             // Max width.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.toIntPx() * 2, maxIntrinsicWidth(25.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(25.dp.roundToPx() * 2, maxIntrinsicWidth(25.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
 
             // Max height.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals((50.dp.toIntPx() / 2f).roundToInt(), maxIntrinsicHeight(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(
+                (50.dp.roundToPx() / 2f).roundToInt(),
+                maxIntrinsicHeight(50.dp.roundToPx())
+            )
+            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
@@ -1667,23 +1673,29 @@
 
             // Min width.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.toIntPx() * 2, minIntrinsicWidth(25.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), minIntrinsicWidth(Constraints.Infinity))
+            assertEquals(25.dp.roundToPx() * 2, minIntrinsicWidth(25.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), minIntrinsicWidth(Constraints.Infinity))
 
             // Min height.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals((50.dp.toIntPx() / 2f).roundToInt(), minIntrinsicHeight(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), minIntrinsicHeight(Constraints.Infinity))
+            assertEquals(
+                (50.dp.roundToPx() / 2f).roundToInt(),
+                minIntrinsicHeight(50.dp.roundToPx())
+            )
+            assertEquals(0.dp.roundToPx(), minIntrinsicHeight(Constraints.Infinity))
 
             // Max width.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals(25.dp.toIntPx() * 2, maxIntrinsicWidth(25.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), maxIntrinsicWidth(Constraints.Infinity))
+            assertEquals(25.dp.roundToPx() * 2, maxIntrinsicWidth(25.dp.roundToPx()))
+            assertEquals(0.dp.roundToPx(), maxIntrinsicWidth(Constraints.Infinity))
 
             // Max height.
             assertEquals(0, minIntrinsicWidth(0))
-            assertEquals((50.dp.toIntPx() / 2f).roundToInt(), maxIntrinsicHeight(50.dp.toIntPx()))
-            assertEquals(0.dp.toIntPx(), maxIntrinsicHeight(Constraints.Infinity))
+            assertEquals(
+                (50.dp.roundToPx() / 2f).roundToInt(),
+                maxIntrinsicHeight(50.dp.roundToPx())
+            )
+            assertEquals(0.dp.roundToPx(), maxIntrinsicHeight(Constraints.Infinity))
         }
     }
 
@@ -1697,7 +1709,7 @@
         // be visible.
         val parentSize = 100.toDp()
         val childSizeDp = 1.toDp()
-        val childSizeIpx = childSizeDp.toIntPx()
+        val childSizeIpx = childSizeDp.roundToPx()
 
         val positionedLatch = CountDownLatch(2)
         val alignSize = Ref<IntSize>()
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt
index 4006f9b..9d1dc2b 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SpacerTest.kt
@@ -60,8 +60,8 @@
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         with(density) {
-            Truth.assertThat(size?.height).isEqualTo(height.toIntPx())
-            Truth.assertThat(size?.width).isEqualTo(width.toIntPx())
+            Truth.assertThat(size?.height).isEqualTo(height.roundToPx())
+            Truth.assertThat(size?.width).isEqualTo(width.roundToPx())
         }
     }
 
@@ -95,8 +95,8 @@
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         with(density) {
-            Truth.assertThat(size?.height).isEqualTo(containerHeight.toIntPx())
-            Truth.assertThat(size?.width).isEqualTo(containerWidth.toIntPx())
+            Truth.assertThat(size?.height).isEqualTo(containerHeight.roundToPx())
+            Truth.assertThat(size?.width).isEqualTo(containerWidth.roundToPx())
         }
     }
 
@@ -120,7 +120,7 @@
 
         with(density) {
             Truth.assertThat(size?.height).isEqualTo(0)
-            Truth.assertThat(size?.width).isEqualTo(width.toIntPx())
+            Truth.assertThat(size?.width).isEqualTo(width.roundToPx())
         }
     }
 
@@ -154,7 +154,7 @@
 
         with(density) {
             Truth.assertThat(size?.height).isEqualTo(0)
-            Truth.assertThat(size?.width).isEqualTo(containerWidth.toIntPx())
+            Truth.assertThat(size?.width).isEqualTo(containerWidth.roundToPx())
         }
     }
 
@@ -178,7 +178,7 @@
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         with(density) {
-            Truth.assertThat(size?.height).isEqualTo(height.toIntPx())
+            Truth.assertThat(size?.height).isEqualTo(height.roundToPx())
             Truth.assertThat(size?.width).isEqualTo(0)
         }
     }
@@ -212,7 +212,7 @@
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
 
         with(density) {
-            Truth.assertThat(size?.height).isEqualTo(containerHeight.toIntPx())
+            Truth.assertThat(size?.height).isEqualTo(containerHeight.roundToPx())
             Truth.assertThat(size?.width).isEqualTo(0)
         }
     }
diff --git a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/ConstraintLayout.kt b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/ConstraintLayout.kt
index a947136..f7afcaa 100644
--- a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/ConstraintLayout.kt
+++ b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/ConstraintLayout.kt
@@ -1113,7 +1113,7 @@
 
     override fun convertDimension(value: Any?): Int {
         return if (value is Dp) {
-            with(density) { value.toIntPx() }
+            with(density) { value.roundToPx() }
         } else {
             super.convertDimension(value)
         }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
index 6a7ef5d..b3b581d 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
@@ -280,10 +280,10 @@
     val axisMax = if (alignmentLine.horizontal) constraints.maxHeight else constraints.maxWidth
     // Compute padding required to satisfy the total before and after offsets.
     val paddingBefore =
-        ((if (before != Dp.Unspecified) before.toIntPx() else 0) - linePosition)
+        ((if (before != Dp.Unspecified) before.roundToPx() else 0) - linePosition)
             .coerceIn(0, axisMax - axis)
     val paddingAfter =
-        ((if (after != Dp.Unspecified) after.toIntPx() else 0) - axis + linePosition)
+        ((if (after != Dp.Unspecified) after.roundToPx() else 0) - axis + linePosition)
             .coerceIn(0, axisMax - axis - paddingBefore)
 
     val width = if (alignmentLine.horizontal) {
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
index 256536c..162884c 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
@@ -575,7 +575,7 @@
             outPositions: IntArray
         ) {
             if (sizes.isEmpty()) return
-            val spacePx = with(density) { space.toIntPx() }
+            val spacePx = with(density) { space.roundToPx() }
 
             var occupied = 0
             var lastSpace = 0
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Flow.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Flow.kt
index 79ae87d..9ea4b83 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Flow.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Flow.kt
@@ -167,13 +167,13 @@
 
         // Return whether the placeable can be added to the current sequence.
         fun canAddToCurrentSequence(placeable: Placeable) =
-            currentSequence.isEmpty() || currentMainAxisSize + mainAxisSpacing.toIntPx() +
+            currentSequence.isEmpty() || currentMainAxisSize + mainAxisSpacing.roundToPx() +
                 placeable.mainAxisSize() <= constraints.mainAxisMax
 
         // Store current sequence information and start a new sequence.
         fun startNewSequence() {
             if (sequences.isNotEmpty()) {
-                crossAxisSpace += crossAxisSpacing.toIntPx()
+                crossAxisSpace += crossAxisSpacing.roundToPx()
             }
             sequences += currentSequence.toList()
             crossAxisSizes += currentCrossAxisSize
@@ -196,7 +196,7 @@
 
             // Add the child to the current sequence.
             if (currentSequence.isNotEmpty()) {
-                currentMainAxisSize += mainAxisSpacing.toIntPx()
+                currentMainAxisSize += mainAxisSpacing.roundToPx()
             }
             currentSequence.add(placeable)
             currentMainAxisSize += placeable.mainAxisSize()
@@ -229,7 +229,7 @@
             sequences.fastForEachIndexed { i, placeables ->
                 val childrenMainAxisSizes = IntArray(placeables.size) { j ->
                     placeables[j].mainAxisSize() +
-                        if (j < placeables.lastIndex) mainAxisSpacing.toIntPx() else 0
+                        if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
                 }
                 val arrangement = if (i < sequences.lastIndex) {
                     mainAxisAlignment.arrangement
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
index 537efd3..bb95440 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
@@ -183,9 +183,9 @@
         val placeable = measurable.measure(constraints)
         return layout(placeable.width, placeable.height) {
             if (rtlAware) {
-                placeable.placeRelative(x.toIntPx(), y.toIntPx())
+                placeable.placeRelative(x.roundToPx(), y.roundToPx())
             } else {
-                placeable.place(x.toIntPx(), y.toIntPx())
+                placeable.place(x.roundToPx(), y.roundToPx())
             }
         }
     }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
index 7a161de..69fff89 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
@@ -209,8 +209,8 @@
         measurable: Measurable,
         constraints: Constraints
     ): MeasureResult {
-        val horizontal = start.toIntPx() + end.toIntPx()
-        val vertical = top.toIntPx() + bottom.toIntPx()
+        val horizontal = start.roundToPx() + end.roundToPx()
+        val vertical = top.roundToPx() + bottom.roundToPx()
 
         val placeable = measurable.measure(constraints.offset(-horizontal, -vertical))
 
@@ -218,9 +218,9 @@
         val height = constraints.constrainHeight(placeable.height + vertical)
         return layout(width, height) {
             if (rtlAware) {
-                placeable.placeRelative(start.toIntPx(), top.toIntPx())
+                placeable.placeRelative(start.roundToPx(), top.roundToPx())
             } else {
-                placeable.place(start.toIntPx(), top.toIntPx())
+                placeable.place(start.roundToPx(), top.roundToPx())
             }
         }
     }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
index b0c3cbb..66401e5 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
@@ -61,7 +61,7 @@
         maxIntrinsicHeightMeasureBlock = MaxIntrinsicHeightMeasureBlock(orientation)
     ) { measurables, outerConstraints ->
         val constraints = OrientationIndependentConstraints(outerConstraints, orientation)
-        val arrangementSpacingPx = arrangementSpacing.toIntPx()
+        val arrangementSpacingPx = arrangementSpacing.roundToPx()
 
         var totalWeight = 0f
         var fixedSpace = 0
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
index 600b9af..ea13d6c 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
@@ -667,11 +667,12 @@
 ) : LayoutModifier, InspectorValueInfo(inspectorInfo) {
     private val Density.targetConstraints
         get() = Constraints(
-            minWidth = if (minWidth != Dp.Unspecified) minWidth.toIntPx() else 0,
-            minHeight = if (minHeight != Dp.Unspecified) minHeight.toIntPx() else 0,
-            maxWidth = if (maxWidth != Dp.Unspecified) maxWidth.toIntPx() else Constraints.Infinity,
+            minWidth = if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0,
+            minHeight = if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0,
+            maxWidth =
+                if (maxWidth != Dp.Unspecified) maxWidth.roundToPx() else Constraints.Infinity,
             maxHeight = if (maxHeight != Dp.Unspecified) {
-                maxHeight.toIntPx()
+                maxHeight.roundToPx()
             } else {
                 Constraints.Infinity
             }
@@ -803,13 +804,13 @@
     ): MeasureResult {
         val wrappedConstraints = Constraints(
             if (minWidth != Dp.Unspecified && constraints.minWidth == 0) {
-                minWidth.toIntPx().coerceAtMost(constraints.maxWidth)
+                minWidth.roundToPx().coerceAtMost(constraints.maxWidth)
             } else {
                 constraints.minWidth
             },
             constraints.maxWidth,
             if (minHeight != Dp.Unspecified && constraints.minHeight == 0) {
-                minHeight.toIntPx().coerceAtMost(constraints.maxHeight)
+                minHeight.roundToPx().coerceAtMost(constraints.maxHeight)
             } else {
                 constraints.minHeight
             },
@@ -825,28 +826,28 @@
         measurable: IntrinsicMeasurable,
         height: Int
     ) = measurable.minIntrinsicWidth(height).coerceAtLeast(
-        if (minWidth != Dp.Unspecified) minWidth.toIntPx() else 0
+        if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0
     )
 
     override fun IntrinsicMeasureScope.maxIntrinsicWidth(
         measurable: IntrinsicMeasurable,
         height: Int
     ) = measurable.maxIntrinsicWidth(height).coerceAtLeast(
-        if (minWidth != Dp.Unspecified) minWidth.toIntPx() else 0
+        if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0
     )
 
     override fun IntrinsicMeasureScope.minIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
     ) = measurable.minIntrinsicHeight(width).coerceAtLeast(
-        if (minHeight != Dp.Unspecified) minHeight.toIntPx() else 0
+        if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0
     )
 
     override fun IntrinsicMeasureScope.maxIntrinsicHeight(
         measurable: IntrinsicMeasurable,
         width: Int
     ) = measurable.maxIntrinsicHeight(width).coerceAtLeast(
-        if (minHeight != Dp.Unspecified) minHeight.toIntPx() else 0
+        if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0
     )
 }
 
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index b2e0d0d..38f9934 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -6,10 +6,6 @@
     method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
   }
 
-  public final class BaseTextFieldKt {
-    method @Deprecated @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void BaseTextField-ngE-tqQ(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional long textColor, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted, optional long cursorColor);
-  }
-
   public final class BorderKt {
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier border-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
@@ -35,19 +31,16 @@
   }
 
   public final class ClickableKt {
-    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
-    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
   public final class ClickableTextKt {
     method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional androidx.compose.ui.text.style.TextOverflow overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
-  public final class ContentColorKt {
-    method @Deprecated @androidx.compose.runtime.Composable public static long contentColor();
-    method @Deprecated public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.graphics.Color> getAmbientContentColor();
-  }
-
   public final class DarkThemeKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -59,12 +52,6 @@
     method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.InteractionState? interactionState);
   }
 
-  public final class IconKt {
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-1Wn-iBs(androidx.compose.ui.graphics.ImageBitmap bitmap, optional androidx.compose.ui.Modifier modifier, optional long tint);
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-1eoVtfs(androidx.compose.ui.graphics.painter.Painter painter, optional androidx.compose.ui.Modifier modifier, optional long tint);
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-tu7MLKI(androidx.compose.ui.graphics.vector.ImageVector imageVector, optional androidx.compose.ui.Modifier modifier, optional long tint);
-  }
-
   public final class ImageKt {
     method @androidx.compose.runtime.Composable public static inline void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
     method @androidx.compose.runtime.Composable public static inline void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
@@ -81,7 +68,8 @@
   }
 
   public final class IndicationKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>> getAmbientIndication();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>>! getAmbientIndication();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>> getLocalIndication();
     method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, optional androidx.compose.foundation.Indication? indication);
   }
 
@@ -220,6 +208,7 @@
     method public static suspend Object? awaitVerticalDragOrCancellation-ijcpFGM(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
     method public static suspend Object? awaitVerticalTouchSlopOrCancellation-qFc19kk(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
     method public static suspend Object? detectDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectDragGesturesAfterLongPress(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? detectHorizontalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onHorizontalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? detectVerticalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onVerticalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? drag-Pd94rOk(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
@@ -612,12 +601,40 @@
   public final class MultiWidgetSelectionDelegateKt {
   }
 
+  public final class SelectionContainerKt {
+    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SelectionHandlesKt {
+  }
+
+  public final class SelectionManagerKt {
+  }
+
+  public final class SelectionRegistrarKt {
+  }
+
+  public final class SimpleLayoutKt {
+  }
+
   public final class TextFieldSelectionDelegateKt {
   }
 
   public final class TextFieldSelectionManagerKt {
   }
 
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+  }
+
   public final class TextSelectionDelegateKt {
   }
 
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index b2e0d0d..38f9934 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -6,10 +6,6 @@
     method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
   }
 
-  public final class BaseTextFieldKt {
-    method @Deprecated @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void BaseTextField-ngE-tqQ(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional long textColor, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted, optional long cursorColor);
-  }
-
   public final class BorderKt {
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier border-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
@@ -35,19 +31,16 @@
   }
 
   public final class ClickableKt {
-    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
-    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
   public final class ClickableTextKt {
     method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional androidx.compose.ui.text.style.TextOverflow overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
-  public final class ContentColorKt {
-    method @Deprecated @androidx.compose.runtime.Composable public static long contentColor();
-    method @Deprecated public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.graphics.Color> getAmbientContentColor();
-  }
-
   public final class DarkThemeKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -59,12 +52,6 @@
     method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.InteractionState? interactionState);
   }
 
-  public final class IconKt {
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-1Wn-iBs(androidx.compose.ui.graphics.ImageBitmap bitmap, optional androidx.compose.ui.Modifier modifier, optional long tint);
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-1eoVtfs(androidx.compose.ui.graphics.painter.Painter painter, optional androidx.compose.ui.Modifier modifier, optional long tint);
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-tu7MLKI(androidx.compose.ui.graphics.vector.ImageVector imageVector, optional androidx.compose.ui.Modifier modifier, optional long tint);
-  }
-
   public final class ImageKt {
     method @androidx.compose.runtime.Composable public static inline void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
     method @androidx.compose.runtime.Composable public static inline void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
@@ -81,7 +68,8 @@
   }
 
   public final class IndicationKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>> getAmbientIndication();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>>! getAmbientIndication();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>> getLocalIndication();
     method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, optional androidx.compose.foundation.Indication? indication);
   }
 
@@ -220,6 +208,7 @@
     method public static suspend Object? awaitVerticalDragOrCancellation-ijcpFGM(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
     method public static suspend Object? awaitVerticalTouchSlopOrCancellation-qFc19kk(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
     method public static suspend Object? detectDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectDragGesturesAfterLongPress(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? detectHorizontalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onHorizontalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? detectVerticalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onVerticalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? drag-Pd94rOk(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
@@ -612,12 +601,40 @@
   public final class MultiWidgetSelectionDelegateKt {
   }
 
+  public final class SelectionContainerKt {
+    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SelectionHandlesKt {
+  }
+
+  public final class SelectionManagerKt {
+  }
+
+  public final class SelectionRegistrarKt {
+  }
+
+  public final class SimpleLayoutKt {
+  }
+
   public final class TextFieldSelectionDelegateKt {
   }
 
   public final class TextFieldSelectionManagerKt {
   }
 
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+  }
+
   public final class TextSelectionDelegateKt {
   }
 
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index b2e0d0d..38f9934 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -6,10 +6,6 @@
     method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
   }
 
-  public final class BaseTextFieldKt {
-    method @Deprecated @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void BaseTextField-ngE-tqQ(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional long textColor, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted, optional long cursorColor);
-  }
-
   public final class BorderKt {
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier border-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
@@ -35,19 +31,16 @@
   }
 
   public final class ClickableKt {
-    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
-    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
   public final class ClickableTextKt {
     method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional androidx.compose.ui.text.style.TextOverflow overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
-  public final class ContentColorKt {
-    method @Deprecated @androidx.compose.runtime.Composable public static long contentColor();
-    method @Deprecated public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.graphics.Color> getAmbientContentColor();
-  }
-
   public final class DarkThemeKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -59,12 +52,6 @@
     method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.InteractionState? interactionState);
   }
 
-  public final class IconKt {
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-1Wn-iBs(androidx.compose.ui.graphics.ImageBitmap bitmap, optional androidx.compose.ui.Modifier modifier, optional long tint);
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-1eoVtfs(androidx.compose.ui.graphics.painter.Painter painter, optional androidx.compose.ui.Modifier modifier, optional long tint);
-    method @Deprecated @androidx.compose.runtime.Composable public static void Icon-tu7MLKI(androidx.compose.ui.graphics.vector.ImageVector imageVector, optional androidx.compose.ui.Modifier modifier, optional long tint);
-  }
-
   public final class ImageKt {
     method @androidx.compose.runtime.Composable public static inline void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
     method @androidx.compose.runtime.Composable public static inline void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
@@ -81,7 +68,8 @@
   }
 
   public final class IndicationKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>> getAmbientIndication();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>>! getAmbientIndication();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<kotlin.jvm.functions.Function0<androidx.compose.foundation.Indication>> getLocalIndication();
     method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.InteractionState interactionState, optional androidx.compose.foundation.Indication? indication);
   }
 
@@ -220,6 +208,7 @@
     method public static suspend Object? awaitVerticalDragOrCancellation-ijcpFGM(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
     method public static suspend Object? awaitVerticalTouchSlopOrCancellation-qFc19kk(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
     method public static suspend Object? detectDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectDragGesturesAfterLongPress(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? detectHorizontalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onHorizontalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? detectVerticalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onVerticalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public static suspend Object? drag-Pd94rOk(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
@@ -612,12 +601,40 @@
   public final class MultiWidgetSelectionDelegateKt {
   }
 
+  public final class SelectionContainerKt {
+    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SelectionHandlesKt {
+  }
+
+  public final class SelectionManagerKt {
+  }
+
+  public final class SelectionRegistrarKt {
+  }
+
+  public final class SimpleLayoutKt {
+  }
+
   public final class TextFieldSelectionDelegateKt {
   }
 
   public final class TextFieldSelectionManagerKt {
   }
 
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+  }
+
   public final class TextSelectionDelegateKt {
   }
 
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index 583c592..77e386a 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -62,6 +62,7 @@
 
         androidTestImplementation project(":compose:test-utils")
         androidTestImplementation project(":compose:ui:ui-test-font")
+        androidTestImplementation project(":test-screenshot")
         androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
         androidTestImplementation(ANDROIDX_TEST_RULES)
         androidTestImplementation(ANDROIDX_TEST_RUNNER)
@@ -123,6 +124,7 @@
             androidAndroidTest.dependencies {
                 implementation project(":compose:test-utils")
                 implementation project(":compose:ui:ui-test-font")
+                implementation project(":test-screenshot")
 
                 implementation(ANDROIDX_TEST_UIAUTOMATOR)
                 implementation(ANDROIDX_TEST_RULES)
@@ -152,6 +154,13 @@
         }
     }
 }
+
+// Screenshot tests related setup
+android {
+    sourceSets.androidTest.assets.srcDirs +=
+            project.rootDir.absolutePath + "/../../golden/compose/foundation/foundation"
+}
+
 androidx {
     name = "Compose Foundation"
     publish = Publish.SNAPSHOT_AND_RELEASE
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 51a1925..78896f0 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
@@ -49,8 +49,8 @@
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.integration.demos.common.ComposableDemo
-import androidx.compose.material.AmbientContentColor
-import androidx.compose.material.AmbientTextStyle
+import androidx.compose.material.LocalContentColor
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
@@ -63,8 +63,8 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -123,7 +123,7 @@
         }
         LazyColumn(Modifier.fillMaxWidth()) {
             items((1..numItems).map { it + offset }) {
-                Text("$it", style = AmbientTextStyle.current.copy(fontSize = 40.sp))
+                Text("$it", style = LocalTextStyle.current.copy(fontSize = 40.sp))
             }
         }
     }
@@ -139,7 +139,7 @@
         @Suppress("DEPRECATION")
         FlowRow {
             val buttonModifier = Modifier.padding(8.dp)
-            val density = AmbientDensity.current
+            val density = LocalDensity.current
             val coroutineScope = rememberCoroutineScope()
             Button(
                 modifier = buttonModifier,
@@ -196,7 +196,7 @@
             state = state
         ) {
             items(1000) {
-                Text("$it", style = AmbientTextStyle.current.copy(fontSize = 40.sp))
+                Text("$it", style = LocalTextStyle.current.copy(fontSize = 40.sp))
             }
         }
     }
@@ -210,7 +210,7 @@
             .background(Color(0xFF6200EE), RoundedCornerShape(4.dp))
             .padding(horizontal = 16.dp, vertical = 8.dp)
     ) {
-        Providers(AmbientContentColor provides Color.White, content = content)
+        Providers(LocalContentColor provides Color.White, content = content)
     }
 }
 
@@ -253,7 +253,7 @@
 
 @Composable
 private fun RtlListDemo() {
-    Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+    Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
         LazyRow(Modifier.fillMaxWidth()) {
             items(100) {
                 Text(
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt
index ca65435..ba0fbbd 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeInputField.kt
@@ -31,7 +31,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.text.SoftwareKeyboardController
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.ImeAction
@@ -46,7 +46,7 @@
             TagLine(tag = "LTR Layout")
         }
         item {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Ltr) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Ltr) {
                 Column(modifier = Modifier.fillMaxWidth()) {
                     TagLine(tag = "simple editing single line")
                     EditLine(singleLine = true)
@@ -61,7 +61,7 @@
             TagLine(tag = "RTL Layout")
         }
         item {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Column(modifier = Modifier.fillMaxWidth()) {
                     TagLine(tag = "simple editing RTL")
                     EditLine()
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt
index c634148..637e42cc 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelection.kt
@@ -25,8 +25,8 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.selection.DisableSelection
-import androidx.compose.ui.selection.SelectionContainer
+import androidx.compose.foundation.text.selection.DisableSelection
+import androidx.compose.foundation.text.selection.SelectionContainer
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.buildAnnotatedString
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt
index 9a5e08f..1dc2487 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeTextSelectionSample.kt
@@ -28,7 +28,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.selection.SelectionContainer
+import androidx.compose.foundation.text.selection.SelectionContainer
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.withStyle
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TypefaceDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TypefaceDemo.kt
index 1d8f0b3..33b23a4 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TypefaceDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TypefaceDemo.kt
@@ -19,7 +19,7 @@
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.Typeface
@@ -44,7 +44,7 @@
 
 @Composable
 fun TypefaceFromFontFamilyDemo() {
-    val typeface = Typeface(AmbientContext.current, FontFamily.Cursive)
+    val typeface = Typeface(LocalContext.current, FontFamily.Cursive)
     val fontFamily = FontFamily(typeface)
     Text("Hello World", style = TextStyle(fontFamily = fontFamily))
 }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
index 83533c0..adf9bbc 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
@@ -26,6 +26,7 @@
 import androidx.compose.foundation.gestures.awaitVerticalDragOrCancellation
 import androidx.compose.foundation.gestures.awaitVerticalTouchSlopOrCancellation
 import androidx.compose.foundation.gestures.detectDragGestures
+import androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress
 import androidx.compose.foundation.gestures.detectHorizontalDragGestures
 import androidx.compose.foundation.gestures.detectVerticalDragGestures
 import androidx.compose.foundation.gestures.drag
@@ -430,3 +431,37 @@
         )
     }
 }
+
+@Composable
+@Sampled
+fun DetectDragWithLongPressGesturesSample() {
+    val offsetX = remember { mutableStateOf(0f) }
+    val offsetY = remember { mutableStateOf(0f) }
+    var size by remember { mutableStateOf(Size.Zero) }
+    Box(
+        Modifier.fillMaxSize()
+            .onSizeChanged { size = it.toSize() }
+    ) {
+        Box(
+            Modifier.offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
+                .size(50.dp)
+                .background(Color.Blue)
+                .pointerInput {
+                    detectDragGesturesAfterLongPress { change, dragAmount ->
+                        val original = Offset(offsetX.value, offsetY.value)
+                        val summed = original + dragAmount
+                        val newValue = Offset(
+                            x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
+                            y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
+                        )
+                        change.consumePositionChange(
+                            consumedDx = newValue.x - original.x,
+                            consumedDy = newValue.y - original.y
+                        )
+                        offsetX.value = newValue.x
+                        offsetY.value = newValue.y
+                    }
+                }
+        )
+    }
+}
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt
index a620c11..9f5ff01 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/IndicationSamples.kt
@@ -17,8 +17,8 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.foundation.AmbientIndication
 import androidx.compose.foundation.InteractionState
+import androidx.compose.foundation.LocalIndication
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.indication
 import androidx.compose.foundation.layout.Column
@@ -51,8 +51,8 @@
             text = "I'm neighbour and I indicate when you click the other one",
             modifier = Modifier
                 // this element doesn't have a click, but will show default indication from the
-                // ambient as it accepts same interaction state
-                .indication(interactionState, AmbientIndication.current())
+                // CompositionLocal as it accepts same interaction state
+                .indication(interactionState, LocalIndication.current())
                 .padding(10.dp)
         )
     }
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionStateSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionStateSample.kt
index f4fcf0b..0918e83 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionStateSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/InteractionStateSample.kt
@@ -17,10 +17,10 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.foundation.AmbientIndication
 import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.Interaction
 import androidx.compose.foundation.InteractionState
+import androidx.compose.foundation.LocalIndication
 import androidx.compose.foundation.border
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.gestures.draggable
@@ -31,7 +31,7 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.material.AmbientTextStyle
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
@@ -72,14 +72,14 @@
                 .fillMaxSize()
                 .clickable(
                     interactionState = interactionState,
-                    indication = AmbientIndication.current()
+                    indication = LocalIndication.current()
                 ) { /* do nothing */ }
                 .then(draggable)
                 .border(BorderStroke(3.dp, color))
                 .padding(3.dp)
         ) {
             Text(
-                text, style = AmbientTextStyle.current.copy(textAlign = TextAlign.Center),
+                text, style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
                 modifier = Modifier.fillMaxSize().wrapContentSize()
             )
         }
@@ -98,7 +98,7 @@
 
     val clickable = Modifier.clickable(
         interactionState = interactionState,
-        indication = AmbientIndication.current()
+        indication = LocalIndication.current()
     ) {
         /* update some business state here */
     }
@@ -136,7 +136,7 @@
                 val pressed = Interaction.Pressed in interactionState
                 Text(
                     text = if (pressed) "Pressed" else "Not pressed",
-                    style = AmbientTextStyle.current.copy(textAlign = TextAlign.Center),
+                    style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
                     modifier = Modifier.fillMaxSize().wrapContentSize()
                 )
             }
@@ -150,14 +150,14 @@
                 val dragged = Interaction.Dragged in interactionState
                 Text(
                     text = if (dragged) "Dragged" else "Not dragged",
-                    style = AmbientTextStyle.current.copy(textAlign = TextAlign.Center),
+                    style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
                     modifier = Modifier.fillMaxSize().wrapContentSize()
                 )
             }
         }
         Text(
             text = text,
-            style = AmbientTextStyle.current.copy(textAlign = TextAlign.Center),
+            style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
             modifier = Modifier.fillMaxSize().wrapContentSize()
         )
     }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SelectionSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectionSample.kt
similarity index 83%
rename from compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SelectionSample.kt
rename to compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectionSample.kt
index 531435e..2d93ad6 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/SelectionSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectionSample.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.samples
+package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
 import androidx.compose.foundation.layout.Column
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.selection.DisableSelection
-import androidx.compose.ui.selection.SelectionContainer
+import androidx.compose.foundation.text.selection.DisableSelection
+import androidx.compose.foundation.text.selection.SelectionContainer
 
 @Sampled
 @Composable
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TextFieldSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TextFieldSample.kt
deleted file mode 100644
index a5570d9..0000000
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/TextFieldSample.kt
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.samples
-
-import androidx.annotation.Sampled
-import androidx.compose.foundation.BaseTextField
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.layout.Box
-import androidx.compose.material.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.text.input.TextFieldValue
-
-@Sampled
-@Composable
-@OptIn(ExperimentalFoundationApi::class)
-@Suppress("DEPRECATION")
-fun TextFieldSample() {
-    var value by rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue())
-    }
-    BaseTextField(
-        value = value,
-        onValueChange = { value = it }
-    )
-}
-
-@Sampled
-@Composable
-@OptIn(ExperimentalFoundationApi::class)
-@Suppress("DEPRECATION")
-fun PlaceholderTextFieldSample() {
-    val state = rememberSaveable(stateSaver = TextFieldValue.Saver) {
-        mutableStateOf(TextFieldValue())
-    }
-    Box {
-        BaseTextField(
-            value = state.value,
-            onValueChange = { state.value = it }
-        )
-        if (state.value.text.isEmpty()) {
-            Text(
-                text = "Placeholder"
-            )
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
index a9cda4d..635fec5 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
@@ -17,10 +17,9 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.foundation.InteractionState
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
-import androidx.compose.foundation.clickable
+import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.gestures.rememberZoomableController
 import androidx.compose.foundation.gestures.zoomable
 import androidx.compose.foundation.layout.Box
@@ -37,6 +36,7 @@
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
@@ -51,12 +51,9 @@
         Box(
             Modifier
                 .zoomable(zoomableController)
-                .clickable(
-                    indication = null,
-                    interactionState = remember { InteractionState() },
-                    onDoubleClick = { zoomableController.smoothScaleBy(4f) },
-                    onClick = {}
-                )
+                .pointerInput {
+                    detectTapGestures(onDoubleTap = { zoomableController.smoothScaleBy(4f) })
+                }
                 .fillMaxSize()
                 .border(1.dp, Color.Green),
             contentAlignment = Alignment.Center
diff --git a/compose/foundation/foundation/src/androidAndroidTest/AndroidManifest.xml b/compose/foundation/foundation/src/androidAndroidTest/AndroidManifest.xml
index 45ad1d9..56e43ad 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/AndroidManifest.xml
+++ b/compose/foundation/foundation/src/androidAndroidTest/AndroidManifest.xml
@@ -14,4 +14,11 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<manifest package="androidx.compose.foundation" />
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.compose.foundation" >
+    <application>
+        <activity
+            android:name="androidx.compose.foundation.TestActivity"
+            android:theme="@android:style/Theme.Material.NoActionBar.Fullscreen" />
+    </application>
+</manifest>
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BackgroundTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BackgroundTest.kt
index 484f51f..95ca719 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BackgroundTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BackgroundTest.kt
@@ -32,9 +32,9 @@
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.SolidColor
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
@@ -183,7 +183,7 @@
     fun background_rtl_initially() {
         rule.setContent {
             SemanticParent {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Box(
                         Modifier.preferredSize(40f.toDp())
                             .background(Color.Magenta)
@@ -210,7 +210,7 @@
         val direction = mutableStateOf(LayoutDirection.Ltr)
         rule.setContent {
             SemanticParent {
-                Providers(AmbientLayoutDirection provides direction.value) {
+                Providers(LocalLayoutDirection provides direction.value) {
                     Box(
                         Modifier.preferredSize(40f.toDp())
                             .background(Color.Magenta)
@@ -267,7 +267,7 @@
     @Composable
     private fun SemanticParent(content: @Composable Density.() -> Unit) {
         Box(Modifier.testTag(contentTag)) {
-            AmbientDensity.current.content()
+            LocalDensity.current.content()
         }
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BorderTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BorderTest.kt
index 37bde61..f228931 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BorderTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/BorderTest.kt
@@ -35,9 +35,9 @@
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.SolidColor
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.graphics.toPixelMap
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -264,7 +264,7 @@
         val direction = mutableStateOf(LayoutDirection.Ltr)
         rule.setContent {
             SemanticParent {
-                Providers(AmbientLayoutDirection provides direction.value) {
+                Providers(LocalLayoutDirection provides direction.value) {
                     Box(
                         Modifier.preferredSize(40.0f.toDp(), 40.0f.toDp())
                             .background(color = Color.Blue)
@@ -293,7 +293,7 @@
     fun SemanticParent(content: @Composable Density.() -> Unit) {
         Box {
             Box(modifier = Modifier.testTag(testTag)) {
-                AmbientDensity.current.content()
+                LocalDensity.current.content()
             }
         }
     }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/CanvasTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/CanvasTest.kt
index 14c436d..cb59aaa 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/CanvasTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/CanvasTest.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.asAndroidBitmap
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.captureToImage
@@ -62,7 +62,7 @@
     fun testCanvas() {
         val strokeWidth = 5.0f
         rule.setContent {
-            val density = AmbientDensity.current.density
+            val density = LocalDensity.current.density
             val containerSize = (containerSize * 2 / density).dp
             val minWidth = (boxWidth / density).dp
             val minHeight = (boxHeight / density).dp
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
index b82de1f..bac6bb6 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
@@ -57,6 +57,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
 class ClickableTest {
 
     @get:Rule
@@ -117,7 +118,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(onLongClick = onClick) {}
+                        .combinedClickable(onLongClick = onClick) {}
                 )
             }
         }
@@ -209,7 +210,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(onLongClick = onClick) {}
+                        .combinedClickable(onLongClick = onClick) {}
                 )
             }
         }
@@ -246,7 +247,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(
+                        .combinedClickable(
                             onLongClick = onLongClick,
                             onClick = onClick
                         )
@@ -288,7 +289,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(
+                        .combinedClickable(
                             onDoubleClick = onDoubleClick,
                             onClick = onClick
                         )
@@ -332,7 +333,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(
+                        .combinedClickable(
                             onDoubleClick = onDoubleClick,
                             onLongClick = onLongClick,
                             onClick = onClick
@@ -387,7 +388,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(onDoubleClick = onClick) {}
+                        .combinedClickable(onDoubleClick = onClick) {}
                 )
             }
         }
@@ -417,7 +418,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(
+                        .combinedClickable(
                             interactionState = interactionState,
                             indication = null
                         ) {}
@@ -456,7 +457,7 @@
                         "ClickableText",
                         modifier = Modifier
                             .testTag("myClickable")
-                            .clickable(
+                            .combinedClickable(
                                 interactionState = interactionState,
                                 indication = null
                             ) {}
@@ -503,7 +504,7 @@
                     "ClickableText",
                     modifier = Modifier
                         .testTag("myClickable")
-                        .clickable(
+                        .combinedClickable(
                             enabled = enabled.value,
                             onDoubleClick = onDoubleClick,
                             onLongClick = onLongClick,
@@ -596,8 +597,8 @@
     fun clickable_testInspectorValue_noIndicationOverload() {
         val onClick: () -> Unit = { }
         rule.setContent {
-            val modifier = Modifier.clickable(onClick = onClick) as InspectableValue
-            assertThat(modifier.nameFallback).isEqualTo("clickable")
+            val modifier = Modifier.combinedClickable(onClick = onClick) as InspectableValue
+            assertThat(modifier.nameFallback).isEqualTo("combinedClickable")
             assertThat(modifier.valueOverride).isNull()
             assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
                 "enabled",
@@ -615,12 +616,12 @@
     fun clickable_testInspectorValue_fullParamsOverload() {
         val onClick: () -> Unit = { }
         rule.setContent {
-            val modifier = Modifier.clickable(
+            val modifier = Modifier.combinedClickable(
                 onClick = onClick,
                 interactionState = remember { InteractionState() },
                 indication = null
             ) as InspectableValue
-            assertThat(modifier.nameFallback).isEqualTo("clickable")
+            assertThat(modifier.nameFallback).isEqualTo("combinedClickable")
             assertThat(modifier.valueOverride).isNull()
             assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
                 "enabled",
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/GoldenCommon.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/GoldenCommon.kt
new file mode 100644
index 0000000..16051e6
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/GoldenCommon.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation
+
+internal const val GOLDEN_UI = "compose/foundation/foundation"
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt
index 208dd07..1b42081 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt
@@ -55,7 +55,7 @@
 import androidx.compose.testutils.assertPixels
 import androidx.compose.ui.graphics.painter.ColorPainter
 import androidx.compose.ui.graphics.toPixelMap
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.res.imageResource
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.semantics.Role
@@ -113,7 +113,7 @@
     @Test
     fun testImage() {
         rule.setContent {
-            val size = (containerSize / AmbientDensity.current.density).dp
+            val size = (containerSize / LocalDensity.current.density).dp
             Box(
                 Modifier.preferredSize(size)
                     .background(color = Color.White)
@@ -158,7 +158,7 @@
         val subsectionWidth = imageWidth / 2
         val subsectionHeight = imageHeight / 2
         rule.setContent {
-            val size = (containerSize / AmbientDensity.current.density).dp
+            val size = (containerSize / LocalDensity.current.density).dp
             Box(
                 Modifier.preferredSize(size)
                     .background(color = Color.White)
@@ -257,7 +257,7 @@
         val imageComposableWidth = imageWidth * 2
         val imageComposableHeight = imageHeight * 2
         rule.setContent {
-            val density = AmbientDensity.current.density
+            val density = LocalDensity.current.density
             val size = (containerSize * 2 / density).dp
             Box(
                 Modifier.preferredSize(size)
@@ -319,7 +319,7 @@
         val imageComposableHeight = imageHeight * 7
 
         rule.setContent {
-            val density = AmbientDensity.current
+            val density = LocalDensity.current
             val size = (containerSize * 2 / density.density).dp
             val ImageBitmap = ImageBitmap(imageWidth, imageHeight)
             CanvasDrawScope().draw(
@@ -359,7 +359,7 @@
         val imageComposableWidth = imageWidth * 2
         val imageComposableHeight = imageHeight * 2
         rule.setContent {
-            val density = AmbientDensity.current.density
+            val density = LocalDensity.current.density
             val size = (containerSize * 2 / density).dp
             Box(
                 Modifier.preferredSize(size)
@@ -419,7 +419,7 @@
         // used to wait until vector resource is loaded asynchronously
         var vectorDrawn = false
         rule.setContent {
-            val density = AmbientDensity.current.density
+            val density = LocalDensity.current.density
             val size = (boxWidth * 2 / density).dp
             val minWidth = (boxWidth / density).dp
             val minHeight = (boxHeight / density).dp
@@ -517,7 +517,7 @@
                 }
                 this
             }
-            val heightDp = asset.height / AmbientDensity.current.density
+            val heightDp = asset.height / LocalDensity.current.density
             Image(
                 asset,
                 null,
@@ -596,7 +596,7 @@
     fun testImageWithNoIntrinsicSizePainterFillsMaxConstraints() {
         val testTag = "testTag"
         rule.setContent {
-            val sizeDp = with(AmbientDensity.current) { 50 / density }
+            val sizeDp = with(LocalDensity.current) { 50 / density }
             Box(modifier = Modifier.size(sizeDp.dp)) {
                 Image(
                     painter = ColorPainter(Color.Red),
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
index 727fc31..c7f16ef 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
@@ -37,8 +37,8 @@
 import androidx.compose.testutils.assertPixels
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
@@ -769,7 +769,7 @@
         with(rule.density) {
             rule.setContent {
                 val direction = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
-                Providers(AmbientLayoutDirection provides direction) {
+                Providers(LocalLayoutDirection provides direction) {
                     Box {
                         Row(
                             modifier = Modifier
@@ -856,7 +856,7 @@
                         }
                     } else {
                         val direction = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
-                        Providers(AmbientLayoutDirection provides direction) {
+                        Providers(LocalLayoutDirection provides direction) {
                             Row(
                                 Modifier.testTag(scrollerTag)
                                     .horizontalScroll(scrollState, reverseScrolling = isReversed)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
index b73bf05..a49a0f6 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
@@ -40,8 +40,8 @@
 import androidx.compose.ui.gesture.nestedscroll.NestedScrollSource
 import androidx.compose.ui.gesture.nestedscroll.nestedScroll
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.platform.AmbientViewConfiguration
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
@@ -931,7 +931,7 @@
             )
 
             rule.setContent {
-                touchSlop = AmbientViewConfiguration.current.touchSlop
+                touchSlop = LocalViewConfiguration.current.touchSlop
                 Box {
                     Box(
                         modifier = Modifier.preferredSize(300.dp)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TestActivity.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TestActivity.kt
new file mode 100644
index 0000000..ca0dedb
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TestActivity.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.compose.foundation
+
+import androidx.activity.ComponentActivity
+import java.util.concurrent.CountDownLatch
+
+class TestActivity : ComponentActivity() {
+    var hasFocusLatch = CountDownLatch(1)
+
+    override fun onWindowFocusChanged(hasFocus: Boolean) {
+        super.onWindowFocusChanged(hasFocus)
+        if (hasFocus) {
+            hasFocusLatch.countDown()
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
index 46035f9..ea61262 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
@@ -21,7 +21,7 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
@@ -320,7 +320,7 @@
 
     fun composeRowWith(arrangement: Arrangement.Horizontal, layoutDirection: LayoutDirection) {
         rule.setContent {
-            Providers(AmbientLayoutDirection provides layoutDirection) {
+            Providers(LocalLayoutDirection provides layoutDirection) {
                 LazyRow(
                     horizontalArrangement = arrangement,
                     modifier = Modifier.size(containerSize)
@@ -338,9 +338,9 @@
         reversedItemsOrder: Boolean = false
     ) {
         with(rule.density) {
-            val sizes = IntArray(2) { itemSize.toIntPx() }
+            val sizes = IntArray(2) { itemSize.roundToPx() }
             val outPositions = IntArray(2) { 0 }
-            with(arrangement) { arrange(containerSize.toIntPx(), sizes, outPositions) }
+            with(arrangement) { arrange(containerSize.roundToPx(), sizes, outPositions) }
 
             outPositions.forEachIndexed { index, position ->
                 val realIndex = if (reversedItemsOrder) if (index == 0) 1 else 0 else index
@@ -356,10 +356,10 @@
         reversedItemsOrder: Boolean = false
     ) {
         with(rule.density) {
-            val sizes = IntArray(2) { itemSize.toIntPx() }
+            val sizes = IntArray(2) { itemSize.roundToPx() }
             val outPositions = IntArray(2) { 0 }
             with(arrangement) {
-                arrange(containerSize.toIntPx(), sizes, layoutDirection, outPositions)
+                arrange(containerSize.roundToPx(), sizes, layoutDirection, outPositions)
             }
 
             outPositions.forEachIndexed { index, position ->
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
index 8bd7d3e..75b0c30 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
@@ -43,7 +43,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.AmbientViewConfiguration
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.SemanticsNodeInteraction
@@ -471,10 +471,10 @@
         var lazyColumnBounds = rule.onNodeWithTag(LazyListTag)
             .getUnclippedBoundsInRoot()
 
-        assertThat(lazyColumnBounds.left.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyColumnBounds.right.toIntPx()).isWithin1PixelFrom(50.dp.toIntPx())
-        assertThat(lazyColumnBounds.top.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyColumnBounds.bottom.toIntPx()).isWithin1PixelFrom(100.dp.toIntPx())
+        assertThat(lazyColumnBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyColumnBounds.right.roundToPx()).isWithin1PixelFrom(50.dp.roundToPx())
+        assertThat(lazyColumnBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyColumnBounds.bottom.roundToPx()).isWithin1PixelFrom(100.dp.roundToPx())
 
         rule.runOnIdle {
             sameSizeItems = false
@@ -491,10 +491,10 @@
         lazyColumnBounds = rule.onNodeWithTag(LazyListTag)
             .getUnclippedBoundsInRoot()
 
-        assertThat(lazyColumnBounds.left.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyColumnBounds.right.toIntPx()).isWithin1PixelFrom(70.dp.toIntPx())
-        assertThat(lazyColumnBounds.top.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyColumnBounds.bottom.toIntPx()).isWithin1PixelFrom(120.dp.toIntPx())
+        assertThat(lazyColumnBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyColumnBounds.right.roundToPx()).isWithin1PixelFrom(70.dp.roundToPx())
+        assertThat(lazyColumnBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyColumnBounds.bottom.roundToPx()).isWithin1PixelFrom(120.dp.roundToPx())
     }
 
     private val firstItemTag = "firstItemTag"
@@ -527,8 +527,8 @@
 
         with(rule.density) {
             // Verify the width of the column
-            assertThat(lazyColumnBounds.left.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-            assertThat(lazyColumnBounds.right.toIntPx()).isWithin1PixelFrom(100.dp.toIntPx())
+            assertThat(lazyColumnBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+            assertThat(lazyColumnBounds.right.roundToPx()).isWithin1PixelFrom(100.dp.roundToPx())
         }
     }
 
@@ -889,8 +889,8 @@
             with(rule.density) {
                 // TODO(b/169232491): test scrolling doesn't appear to be scrolling exactly the right
                 //  number of pixels
-                val expectedOffset = 10.dp.toIntPx()
-                val tolerance = 2.dp.toIntPx()
+                val expectedOffset = 10.dp.roundToPx()
+                val tolerance = 2.dp.roundToPx()
                 assertThat(state.firstVisibleItemScrollOffset).isEqualTo(expectedOffset, tolerance)
             }
         }
@@ -959,8 +959,8 @@
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             with(rule.density) {
-                val expectedOffset = 10.dp.toIntPx()
-                val tolerance = 2.dp.toIntPx()
+                val expectedOffset = 10.dp.roundToPx()
+                val tolerance = 2.dp.roundToPx()
                 assertThat(state.firstVisibleItemScrollOffset)
                     .isEqualTo(expectedOffset, tolerance)
             }
@@ -971,7 +971,7 @@
     fun initialScrollIsApplied() {
         val items by mutableStateOf((0..20).toList())
         lateinit var state: LazyListState
-        val expectedOffset = with(rule.density) { 10.dp.toIntPx() }
+        val expectedOffset = with(rule.density) { 10.dp.roundToPx() }
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState(2, expectedOffset)
             LazyColumn(
@@ -1246,7 +1246,7 @@
 
     private fun LazyListState.scrollBy(offset: Dp) {
         runBlocking {
-            smoothScrollBy(with(rule.density) { offset.toIntPx().toFloat() }, snap())
+            smoothScrollBy(with(rule.density) { offset.roundToPx().toFloat() }, snap())
         }
     }
 }
@@ -1278,7 +1278,7 @@
     composable: @Composable () -> Unit
 ) {
     this.setContent {
-        Providers(AmbientViewConfiguration provides FakeViewConfiguration) {
+        Providers(LocalViewConfiguration provides FakeViewConfiguration) {
             composable()
         }
     }
@@ -1288,8 +1288,8 @@
     performGesture {
         with(density) {
             val touchSlop = TestTouchSlop.toInt()
-            val xPx = x.toIntPx()
-            val yPx = y.toIntPx()
+            val xPx = x.roundToPx()
+            val yPx = y.roundToPx()
             val offsetX = if (xPx > 0) xPx + touchSlop else if (xPx < 0) xPx - touchSlop else 0
             val offsetY = if (yPx > 0) yPx + touchSlop else if (yPx < 0) yPx - touchSlop else 0
             swipeWithVelocity(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsContentPaddingTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsContentPaddingTest.kt
index a7d5427..559960e 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsContentPaddingTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsContentPaddingTest.kt
@@ -376,7 +376,7 @@
     fun row_contentPaddingIsNotAffectingScrollPosition() {
         lateinit var state: LazyListState
         val itemSize = with(rule.density) {
-            50.dp.toIntPx().toDp()
+            50.dp.roundToPx().toDp()
         }
         rule.setContent {
             LazyRow(
@@ -612,7 +612,7 @@
 
     private fun LazyListState.scrollBy(offset: Dp) {
         runBlocking {
-            smoothScrollBy(with(rule.density) { offset.toIntPx().toFloat() }, snap())
+            smoothScrollBy(with(rule.density) { offset.roundToPx().toFloat() }, snap())
         }
     }
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt
index 4b3898944..56d67f9 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
@@ -365,7 +365,7 @@
     @Test
     fun row_rtl_emitTwoElementsAsOneItem_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyRow(
                     reverseLayout = true
                 ) {
@@ -386,7 +386,7 @@
     @Test
     fun row_rtl_emitTwoItems_positionedReversed() {
         rule.setContentWithTestViewConfiguration {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyRow(
                     reverseLayout = true
                 ) {
@@ -410,7 +410,7 @@
     fun row_rtl_scrollForwardHalfWay() {
         lateinit var state: LazyListState
         rule.setContentWithTestViewConfiguration {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 LazyRow(
                     reverseLayout = true,
                     state = rememberLazyListState().also { state = it },
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
index 3c9af9c..31138fd 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
@@ -34,7 +34,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.SemanticsNodeInteraction
 import androidx.compose.ui.test.assertHeightIsEqualTo
@@ -302,10 +302,10 @@
         var lazyRowBounds = rule.onNodeWithTag(LazyListTag)
             .getUnclippedBoundsInRoot()
 
-        assertThat(lazyRowBounds.left.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyRowBounds.right.toIntPx()).isWithin1PixelFrom(100.dp.toIntPx())
-        assertThat(lazyRowBounds.top.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyRowBounds.bottom.toIntPx()).isWithin1PixelFrom(50.dp.toIntPx())
+        assertThat(lazyRowBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyRowBounds.right.roundToPx()).isWithin1PixelFrom(100.dp.roundToPx())
+        assertThat(lazyRowBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyRowBounds.bottom.roundToPx()).isWithin1PixelFrom(50.dp.roundToPx())
 
         rule.runOnIdle {
             sameSizeItems = false
@@ -322,10 +322,10 @@
         lazyRowBounds = rule.onNodeWithTag(LazyListTag)
             .getUnclippedBoundsInRoot()
 
-        assertThat(lazyRowBounds.left.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyRowBounds.right.toIntPx()).isWithin1PixelFrom(120.dp.toIntPx())
-        assertThat(lazyRowBounds.top.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-        assertThat(lazyRowBounds.bottom.toIntPx()).isWithin1PixelFrom(70.dp.toIntPx())
+        assertThat(lazyRowBounds.left.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyRowBounds.right.roundToPx()).isWithin1PixelFrom(120.dp.roundToPx())
+        assertThat(lazyRowBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+        assertThat(lazyRowBounds.bottom.roundToPx()).isWithin1PixelFrom(70.dp.roundToPx())
     }
 
     private val firstItemTag = "firstItemTag"
@@ -358,8 +358,8 @@
 
         with(rule.density) {
             // Verify the height of the row
-            assertThat(lazyRowBounds.top.toIntPx()).isWithin1PixelFrom(0.dp.toIntPx())
-            assertThat(lazyRowBounds.bottom.toIntPx()).isWithin1PixelFrom(100.dp.toIntPx())
+            assertThat(lazyRowBounds.top.roundToPx()).isWithin1PixelFrom(0.dp.roundToPx())
+            assertThat(lazyRowBounds.bottom.roundToPx()).isWithin1PixelFrom(100.dp.roundToPx())
         }
     }
 
@@ -509,7 +509,7 @@
     @Test
     fun scrollsLeftInRtl() {
         rule.setContentWithTestViewConfiguration {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(Modifier.preferredWidth(100.dp)) {
                     LazyRow(Modifier.testTag(LazyListTag)) {
                         items(4) {
@@ -746,8 +746,8 @@
             with(rule.density) {
                 // TODO(b/169232491): test scrolling doesn't appear to be scrolling exactly the right
                 //  number of pixels
-                val expectedOffset = 10.dp.toIntPx()
-                val tolerance = 2.dp.toIntPx()
+                val expectedOffset = 10.dp.roundToPx()
+                val tolerance = 2.dp.roundToPx()
                 assertThat(state.firstVisibleItemScrollOffset).isEqualTo(expectedOffset, tolerance)
             }
         }
@@ -774,8 +774,8 @@
         rule.runOnIdle {
             assertThat(state.firstVisibleItemIndex).isEqualTo(0)
             with(rule.density) {
-                val expectedOffset = 10.dp.toIntPx()
-                val tolerance = 2.dp.toIntPx()
+                val expectedOffset = 10.dp.roundToPx()
+                val tolerance = 2.dp.roundToPx()
                 assertThat(state.firstVisibleItemScrollOffset)
                     .isEqualTo(expectedOffset, tolerance)
             }
@@ -785,7 +785,7 @@
     @Test
     fun initialScrollIsApplied() {
         lateinit var state: LazyListState
-        val expectedOffset = with(rule.density) { 10.dp.toIntPx() }
+        val expectedOffset = with(rule.density) { 10.dp.roundToPx() }
         rule.setContentWithTestViewConfiguration {
             state = rememberLazyListState(2, expectedOffset)
             LazyRow(Modifier.size(100.dp).testTag(LazyListTag), state = state) {
@@ -1027,7 +1027,7 @@
 
     private fun LazyListState.scrollBy(offset: Dp) {
         runBlocking {
-            smoothScrollBy(with(rule.density) { offset.toIntPx().toFloat() }, snap())
+            smoothScrollBy(with(rule.density) { offset.roundToPx().toFloat() }, snap())
         }
     }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt
index 029a4f3..fde2278 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
-import androidx.compose.ui.platform.AmbientFocusManager
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -56,7 +56,7 @@
         // Arrange.
         lateinit var view: View
         rule.setContent {
-            view = AmbientView.current
+            view = LocalView.current
             CoreTextField(
                 value = TextFieldValue("Hello"),
                 onValueChange = {},
@@ -78,7 +78,7 @@
         val focusRequester = FocusRequester()
         lateinit var view: View
         rule.setContent {
-            view = AmbientView.current
+            view = LocalView.current
             CoreTextField(
                 value = TextFieldValue("Hello"),
                 onValueChange = {},
@@ -101,8 +101,8 @@
         lateinit var view: View
         val focusRequester = FocusRequester()
         rule.setContent {
-            view = AmbientView.current
-            focusManager = AmbientFocusManager.current
+            view = LocalView.current
+            focusManager = LocalFocusManager.current
             CoreTextField(
                 value = TextFieldValue("Hello"),
                 onValueChange = {},
@@ -127,7 +127,7 @@
         // Arrange.
         lateinit var view: View
         rule.setContent {
-            view = AmbientView.current
+            view = LocalView.current
             CoreTextField(
                 value = TextFieldValue("Hello"),
                 onValueChange = {},
@@ -156,7 +156,7 @@
         val (focusRequester1, focusRequester2) = FocusRequester.createRefs()
         lateinit var view: View
         rule.setContent {
-            view = AmbientView.current
+            view = LocalView.current
             Column {
                 CoreTextField(
                     value = TextFieldValue("Hello"),
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
index fab4850..d478324 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.TextLayoutResult
@@ -67,7 +67,7 @@
         var width: Int? = null
 
         rule.setContent {
-            Providers(AmbientDensity provides density) {
+            Providers(LocalDensity provides density) {
                 CoreTextField(
                     value = TextFieldValue(string),
                     onValueChange = {},
@@ -87,7 +87,7 @@
         with(density) {
             assertThat(textLayout).isNotNull()
             assertThat(width).isNotNull()
-            assertThat(width).isEqualTo(composableWidth.toIntPx())
+            assertThat(width).isEqualTo(composableWidth.roundToPx())
             assertThat(textLayout?.lineCount).isEqualTo(1)
         }
     }
@@ -104,7 +104,7 @@
         var width: Int? = null
 
         rule.setContent {
-            Providers(AmbientDensity provides density) {
+            Providers(LocalDensity provides density) {
                 CoreTextField(
                     value = TextFieldValue(string),
                     onValueChange = {},
@@ -124,7 +124,7 @@
         with(density) {
             assertThat(textLayout).isNotNull()
             assertThat(width).isNotNull()
-            assertThat(width).isEqualTo(composableWidth.toIntPx())
+            assertThat(width).isEqualTo(composableWidth.roundToPx())
             // each character has the same width as composable width
             // therefore the string.length is the line count
             assertThat(textLayout?.lineCount).isEqualTo(string.length)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt
index e7196f5..1b292b8 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutDirectionTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.foundation.text
 
 import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.input.TextFieldValue
@@ -40,7 +40,7 @@
         var layoutDirection: LayoutDirection? = null
 
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 @OptIn(InternalTextApi::class)
                 CoreTextField(
                     value = TextFieldValue("..."),
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
index 911108c..0386ab2 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
@@ -21,8 +21,6 @@
 import androidx.activity.ComponentActivity
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.selection.Selectable
-import androidx.compose.ui.selection.Selection
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.ExperimentalTextApi
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
new file mode 100644
index 0000000..8b1ab77
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.text.selection
+
+import android.view.View
+import android.view.ViewGroup
+import androidx.activity.ComponentActivity
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.foundation.text.CoreText
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.hapticfeedback.HapticFeedback
+import androidx.compose.ui.hapticfeedback.HapticFeedbackType
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.AmbientHapticFeedback
+import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.click
+import androidx.compose.ui.test.hasTestTag
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.longClick
+import androidx.compose.ui.test.performGesture
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.InternalTextApi
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.font.test.R
+import androidx.compose.ui.text.font.toFontFamily
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth.assertThat
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.times
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
+
+@Suppress("DEPRECATION")
+@OptIn(InternalTextApi::class)
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class SelectionContainerFocusTest {
+    @get:Rule
+    val rule = createAndroidComposeRule<ComponentActivity>()
+
+    private lateinit var view: View
+
+    private val textContent = "Text Demo Text"
+    private val fontFamily = Font(
+        resId = R.font.sample_font,
+        weight = FontWeight.Normal,
+        style = FontStyle.Normal
+    ).toFontFamily()
+
+    private val selection1 = mutableStateOf<Selection?>(null)
+    private val selection2 = mutableStateOf<Selection?>(null)
+    private val fontSize = 20.sp
+    private val boxSize = 40.dp
+
+    private val hapticFeedback = mock<HapticFeedback>()
+    @Test
+    fun click_anywhere_to_cancel() {
+        // Setup. Long press to create a selection.
+        // A reasonable number.
+        createSelectionContainer()
+        // Touch position. In this test, each character's width and height equal to fontSize.
+        // Position is computed so that (position, position) is the center of the first character.
+        val positionInText = with(Density(view.context)) {
+            fontSize.toPx() / 2
+        }
+        rule.onNode(hasTestTag("selectionContainer1"))
+            .performGesture { longClick(Offset(x = positionInText, y = positionInText)) }
+        rule.runOnIdle {
+            assertThat(selection1.value).isNotNull()
+        }
+
+        // Touch position. In this test, each character's width and height equal to fontSize.
+        // Position is computed so that (position, position) is the center of the first character.
+        val positionInBox = with(Density(view.context)) {
+            boxSize.toPx() / 2
+        }
+        // Act.
+        rule.onNode(hasTestTag("box"))
+            .performGesture { click(Offset(x = positionInBox, y = positionInBox)) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(selection1.value).isNull()
+            assertThat(selection2.value).isNull()
+            verify(
+                hapticFeedback,
+                times(2)
+            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        }
+    }
+
+    @Test
+    fun select_anotherContainer_cancelOld() {
+        // Setup. Long press to create a selection.
+        // A reasonable number.
+        createSelectionContainer()
+        // Touch position. In this test, each character's width and height equal to fontSize.
+        // Position is computed so that (position, position) is the center of the first character.
+        val positionInText = with(Density(view.context)) {
+            fontSize.toPx() / 2
+        }
+        rule.onNode(hasTestTag("selectionContainer1"))
+            .performGesture { longClick(Offset(x = positionInText, y = positionInText)) }
+        rule.runOnIdle {
+            assertThat(selection1.value).isNotNull()
+        }
+
+        // Act.
+        rule.onNode(hasTestTag("selectionContainer2"))
+            .performGesture { longClick(Offset(x = positionInText, y = positionInText)) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(selection1.value).isNull()
+            assertThat(selection2.value).isNotNull()
+            // There will be 2 times from the first SelectionContainer and 1 time from the second
+            // SelectionContainer.
+            verify(
+                hapticFeedback,
+                times(3)
+            ).performHapticFeedback(HapticFeedbackType.TextHandleMove)
+        }
+    }
+
+    private fun createSelectionContainer(isRtl: Boolean = false) {
+        val measureLatch = CountDownLatch(1)
+
+        val layoutDirection = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
+        rule.setContent {
+            Providers(
+                AmbientHapticFeedback provides hapticFeedback,
+                AmbientLayoutDirection provides layoutDirection
+            ) {
+                Column {
+                    SelectionContainer(
+                        modifier = Modifier.onGloballyPositioned {
+                            measureLatch.countDown()
+                        }.testTag("selectionContainer1"),
+                        selection = selection1.value,
+                        onSelectionChange = {
+                            selection1.value = it
+                        }
+                    ) {
+                        CoreText(
+                            AnnotatedString(textContent),
+                            Modifier.fillMaxWidth(),
+                            style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
+                            softWrap = true,
+                            overflow = TextOverflow.Clip,
+                            maxLines = Int.MAX_VALUE,
+                            inlineContent = mapOf(),
+                            onTextLayout = {}
+                        )
+                    }
+
+                    SelectionContainer(
+                        modifier = Modifier.onGloballyPositioned {
+                            measureLatch.countDown()
+                        }.testTag("selectionContainer2"),
+                        selection = selection2.value,
+                        onSelectionChange = {
+                            selection2.value = it
+                        }
+                    ) {
+                        CoreText(
+                            AnnotatedString(textContent),
+                            Modifier.fillMaxWidth(),
+                            style = TextStyle(fontFamily = fontFamily, fontSize = fontSize),
+                            softWrap = true,
+                            overflow = TextOverflow.Clip,
+                            maxLines = Int.MAX_VALUE,
+                            inlineContent = mapOf(),
+                            onTextLayout = {}
+                        )
+                    }
+
+                    Box(Modifier.preferredSize(boxSize, boxSize).testTag("box"))
+                }
+            }
+        }
+        rule.activityRule.scenario.onActivity {
+            view = it.findViewById<ViewGroup>(android.R.id.content)
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
index f51a960..73507fd 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
@@ -38,11 +38,9 @@
 import androidx.compose.ui.input.pointer.changedToUp
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientHapticFeedback
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalHapticFeedback
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionContainer
 import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
@@ -275,8 +273,8 @@
         val layoutDirection = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
         rule.setContent {
             Providers(
-                AmbientHapticFeedback provides hapticFeedback,
-                AmbientLayoutDirection provides layoutDirection
+                LocalHapticFeedback provides hapticFeedback,
+                LocalLayoutDirection provides layoutDirection
             ) {
                 TestParent(Modifier.testTag("selectionContainer").gestureSpy(log)) {
                     SelectionContainer(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/SelectionHandlePopupPositionTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
similarity index 75%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/SelectionHandlePopupPositionTest.kt
rename to compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
index 2f7ec39..643f60f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/SelectionHandlePopupPositionTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,26 +14,34 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import android.view.View
 import android.view.WindowManager
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.node.Owner
-import androidx.compose.ui.platform.AmbientLayoutDirection
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.ViewRootForTest
 import androidx.compose.ui.test.junit4.ComposeTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.style.ResolvedTextDirection
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
-import androidx.compose.ui.window.SimpleContainer
+import androidx.compose.ui.unit.enforce
+import androidx.compose.ui.unit.hasFixedHeight
+import androidx.compose.ui.unit.hasFixedWidth
 import androidx.compose.ui.window.isPopupLayout
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.Root
@@ -50,6 +58,7 @@
 import org.junit.runner.RunWith
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlin.math.max
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
@@ -156,7 +165,7 @@
 
             rule.setContent {
                 // Get the compose view position on screen
-                val composeView = AmbientView.current
+                val composeView = LocalView.current
                 val positionArray = IntArray(2)
                 composeView.getLocationOnScreen(positionArray)
                 composeViewAbsolutePos = IntOffset(
@@ -167,7 +176,7 @@
                 // Align the parent of the popup on the top left corner, this results in the global
                 // position of the parent to be (0, 0)
                 val layoutDirection = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
-                Providers(AmbientLayoutDirection provides layoutDirection) {
+                Providers(LocalLayoutDirection provides layoutDirection) {
                     SimpleLayout {
                         SimpleContainer(width = parentWidthDp, height = parentHeightDp) {}
                         SelectionHandle(
@@ -229,7 +238,7 @@
 internal fun ComposeTestRule.singleSelectionHandleMatches(viewMatcher: Matcher<in View>) {
     // Make sure that current measurement/drawing is finished
     runOnIdle { }
-    Espresso.onView(CoreMatchers.instanceOf(Owner::class.java))
+    Espresso.onView(CoreMatchers.instanceOf(ViewRootForTest::class.java))
         .inRoot(SingleSelectionHandleMatcher())
         .check(ViewAssertions.matches(viewMatcher))
 }
@@ -250,3 +259,59 @@
         return matches
     }
 }
+
+/**
+ * A Container Box implementation used for selection children and handle layout
+ */
+@Composable
+internal fun SimpleContainer(
+    modifier: Modifier = Modifier,
+    width: Dp? = null,
+    height: Dp? = null,
+    content: @Composable () -> Unit
+) {
+    Layout(content, modifier) { measurables, incomingConstraints ->
+        val containerConstraints = Constraints()
+            .copy(
+                width?.roundToPx() ?: 0,
+                width?.roundToPx() ?: Constraints.Infinity,
+                height?.roundToPx() ?: 0,
+                height?.roundToPx() ?: Constraints.Infinity
+            )
+            .enforce(incomingConstraints)
+        val childConstraints = containerConstraints.copy(minWidth = 0, minHeight = 0)
+        var placeable: Placeable? = null
+        val containerWidth = if (
+            containerConstraints.hasFixedWidth
+        ) {
+            containerConstraints.maxWidth
+        } else {
+            placeable = measurables.firstOrNull()?.measure(childConstraints)
+            max((placeable?.width ?: 0), containerConstraints.minWidth)
+        }
+        val containerHeight = if (
+            containerConstraints.hasFixedHeight
+        ) {
+            containerConstraints.maxHeight
+        } else {
+            if (placeable == null) {
+                placeable = measurables.firstOrNull()?.measure(childConstraints)
+            }
+            max((placeable?.height ?: 0), containerConstraints.minHeight)
+        }
+        layout(containerWidth, containerHeight) {
+            val p = placeable ?: measurables.firstOrNull()?.measure(childConstraints)
+            p?.let {
+                val position = Alignment.Center.align(
+                    IntSize(it.width, it.height),
+                    IntSize(containerWidth, containerHeight),
+                    layoutDirection
+                )
+                it.placeRelative(
+                    position.x,
+                    position.y
+                )
+            }
+        }
+    }
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/SelectionHandlesTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
similarity index 66%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/SelectionHandlesTest.kt
rename to compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
index 7e230fe..c9791c3 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/SelectionHandlesTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,28 +14,38 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
+import android.graphics.Bitmap
 import android.os.Build
+import android.os.Handler
+import android.os.Looper
+import android.view.PixelCopy
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewTreeObserver
+import androidx.annotation.RequiresApi
+import androidx.compose.foundation.TestActivity
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.setContent
-import androidx.compose.ui.runOnUiThreadIR
-import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.style.ResolvedTextDirection
-import androidx.compose.ui.waitAndScreenShot
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.mock
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
 @MediumTest
@@ -44,7 +54,7 @@
 class SelectionHandlesTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val rule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
+    val rule = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
     private lateinit var activity: TestActivity
 
     private val HANDLE_COLOR = Color(0xFF4286F4)
@@ -213,3 +223,100 @@
         ).isTrue()
     }
 }
+
+@Suppress("DEPRECATION")
+// We only need this because IR compiler doesn't like converting lambdas to Runnables
+private fun androidx.test.rule.ActivityTestRule<*>.runOnUiThreadIR(block: () -> Unit) {
+    val runnable: Runnable = object : Runnable {
+        override fun run() {
+            block()
+        }
+    }
+    runOnUiThread(runnable)
+}
+
+@Suppress("DEPRECATION")
+fun androidx.test.rule.ActivityTestRule<*>.findAndroidComposeView(): ViewGroup {
+    val contentViewGroup = activity.findViewById<ViewGroup>(android.R.id.content)
+    return findAndroidComposeView(contentViewGroup)!!
+}
+
+fun findAndroidComposeView(parent: ViewGroup): ViewGroup? {
+    for (index in 0 until parent.childCount) {
+        val child = parent.getChildAt(index)
+        if (child is ViewGroup) {
+            if (child is ComposeView)
+                return child
+            else {
+                val composeView = findAndroidComposeView(child)
+                if (composeView != null) {
+                    return composeView
+                }
+            }
+        }
+    }
+    return null
+}
+
+@Suppress("DEPRECATION")
+@RequiresApi(Build.VERSION_CODES.O)
+fun androidx.test.rule.ActivityTestRule<*>.waitAndScreenShot(
+    forceInvalidate: Boolean = true
+): Bitmap = waitAndScreenShot(findAndroidComposeView(), forceInvalidate)
+
+class DrawCounterListener(private val view: View) :
+    ViewTreeObserver.OnPreDrawListener {
+    val latch = CountDownLatch(5)
+
+    override fun onPreDraw(): Boolean {
+        latch.countDown()
+        if (latch.count > 0) {
+            view.postInvalidate()
+        } else {
+            view.viewTreeObserver.removeOnPreDrawListener(this)
+        }
+        return true
+    }
+}
+
+@Suppress("DEPRECATION")
+@RequiresApi(Build.VERSION_CODES.O)
+fun androidx.test.rule.ActivityTestRule<*>.waitAndScreenShot(
+    view: View,
+    forceInvalidate: Boolean = true
+): Bitmap {
+    val flushListener = DrawCounterListener(view)
+    val offset = intArrayOf(0, 0)
+    var handler: Handler? = null
+    runOnUiThread {
+        view.getLocationInWindow(offset)
+        if (forceInvalidate) {
+            view.viewTreeObserver.addOnPreDrawListener(flushListener)
+            view.invalidate()
+        }
+        handler = Handler(Looper.getMainLooper())
+    }
+
+    if (forceInvalidate) {
+        assertTrue("Drawing latch timed out", flushListener.latch.await(1, TimeUnit.SECONDS))
+    }
+    val width = view.width
+    val height = view.height
+
+    val dest =
+        Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+    val srcRect = android.graphics.Rect(0, 0, width, height)
+    srcRect.offset(offset[0], offset[1])
+    val latch = CountDownLatch(1)
+    var copyResult = 0
+    val onCopyFinished = object : PixelCopy.OnPixelCopyFinishedListener {
+        override fun onPixelCopyFinished(result: Int) {
+            copyResult = result
+            latch.countDown()
+        }
+    }
+    PixelCopy.request(activity.window, srcRect, dest, onCopyFinished, handler!!)
+    assertTrue("Pixel copy latch timed out", latch.await(1, TimeUnit.SECONDS))
+    assertEquals(PixelCopy.SUCCESS, copyResult)
+    return dest
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/TextSelectionColorsScreenshotTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt
similarity index 92%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/TextSelectionColorsScreenshotTest.kt
rename to compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt
index 02b11ce..84b244b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/selection/TextSelectionColorsScreenshotTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextSelectionColorsScreenshotTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import android.os.Build
+import androidx.compose.foundation.GOLDEN_UI
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
@@ -25,7 +26,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
 import androidx.compose.testutils.assertAgainstGolden
-import androidx.compose.ui.GOLDEN_UI
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
@@ -71,7 +71,7 @@
     @Test
     fun text_defaultSelectionColors() {
         rule.setContent {
-            TextTestContent(textSelectionColors = AmbientTextSelectionColors.current)
+            TextTestContent(textSelectionColors = LocalTextSelectionColors.current)
         }
 
         rule.onNodeWithText(Text)
@@ -112,7 +112,7 @@
     @Test
     fun textField_defaultSelectionColors() {
         rule.setContent {
-            TextFieldTestContent(textSelectionColors = AmbientTextSelectionColors.current)
+            TextFieldTestContent(textSelectionColors = LocalTextSelectionColors.current)
         }
 
         // Click once to focus text field
@@ -174,7 +174,7 @@
 @OptIn(InternalTextApi::class)
 @Composable
 private fun TextTestContent(textSelectionColors: TextSelectionColors) {
-    Providers(AmbientTextSelectionColors provides textSelectionColors) {
+    Providers(LocalTextSelectionColors provides textSelectionColors) {
         Row(Modifier.testTag(Tag), horizontalArrangement = Arrangement.spacedBy(20.dp)) {
             // Manually draw selection handles as we cannot screenshot the ones drawn in the popup
             DefaultSelectionHandle(
@@ -200,7 +200,7 @@
 
 @Composable
 private fun TextFieldTestContent(textSelectionColors: TextSelectionColors) {
-    Providers(AmbientTextSelectionColors provides textSelectionColors) {
+    Providers(LocalTextSelectionColors provides textSelectionColors) {
         Box(Modifier.testTag(Tag)) {
             BasicTextField(value = Text, onValueChange = {})
         }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/InactiveTextFieldTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/InactiveTextFieldTest.kt
index e2e5010..eb4cf5d 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/InactiveTextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/InactiveTextFieldTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.selection.AmbientSelectionRegistrar
+import androidx.compose.foundation.text.selection.LocalSelectionRegistrar
 import androidx.compose.ui.test.assertIsEnabled
 import androidx.compose.ui.test.assertIsFocused
 import androidx.compose.ui.test.assertIsNotEnabled
@@ -102,7 +102,7 @@
             InactiveTextField(
                 value = text,
                 modifier = Modifier.testTag(tag).width(100.dp).composed {
-                    assertThat(AmbientSelectionRegistrar.current).isNull()
+                    assertThat(LocalSelectionRegistrar.current).isNull()
                     Modifier
                 },
                 enabled = false
@@ -116,7 +116,7 @@
             InactiveTextField(
                 value = text,
                 modifier = Modifier.composed {
-                    assertThat(AmbientSelectionRegistrar.current).isNotNull()
+                    assertThat(LocalSelectionRegistrar.current).isNotNull()
                     Modifier
                 },
                 enabled = true
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/SoftwareKeyboardTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/SoftwareKeyboardTest.kt
index 5dd938f..e63050b 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/SoftwareKeyboardTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/SoftwareKeyboardTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientTextInputService
+import androidx.compose.ui.platform.LocalTextInputService
 import androidx.compose.ui.test.hasSetTextAction
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.performClick
@@ -58,7 +58,7 @@
         val onTextInputStarted: (SoftwareKeyboardController) -> Unit = mock()
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 val state = remember { mutableStateOf("") }
                 BasicTextField(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
index 4e0012e..8cfdf0c 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
@@ -245,7 +245,7 @@
     }
 
     private fun ImageBitmap.assertCursor(cursorWidth: Dp, density: Density) {
-        val cursorWidthPx = (with(density) { cursorWidth.toIntPx() })
+        val cursorWidthPx = (with(density) { cursorWidth.roundToPx() })
         val width = width
         val height = height
         this.assertPixels(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
index 6a53413..06993e6 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.Font
@@ -89,7 +89,7 @@
         }
 
         with(density) {
-            assertThat(size).isEqualTo(minWidth.toIntPx())
+            assertThat(size).isEqualTo(minWidth.roundToPx())
         }
     }
 
@@ -111,7 +111,7 @@
         }
 
         with(density) {
-            assertThat(size).isEqualTo(width.toIntPx())
+            assertThat(size).isEqualTo(width.roundToPx())
         }
     }
 
@@ -168,7 +168,7 @@
         }
 
         with(density) {
-            assertThat(size).isEqualTo(textFieldWidth.toIntPx())
+            assertThat(size).isEqualTo(textFieldWidth.roundToPx())
         }
     }
 
@@ -194,7 +194,7 @@
         style = FontStyle.Normal
     )
 
-    Providers(AmbientDensity provides density) {
+    Providers(LocalDensity provides density) {
         androidx.compose.foundation.layout.Box {
             BasicTextField(
                 value = text,
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
index d4f13a5..b6d392b 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -22,7 +22,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.AmbientTextInputService
+import androidx.compose.ui.platform.LocalTextInputService
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.hasSetTextAction
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -74,7 +74,7 @@
 
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 val state = remember {
                     mutableStateOf(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
index c864623..e15b40b 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
@@ -44,8 +44,8 @@
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientViewConfiguration
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
@@ -396,7 +396,7 @@
         var touchSlop = 0f
 
         rule.setContent {
-            touchSlop = AmbientViewConfiguration.current.touchSlop
+            touchSlop = LocalViewConfiguration.current.touchSlop
             Column(
                 Modifier
                     .preferredSize(size)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
index fd8a3f6..ac169c4 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
@@ -51,8 +51,8 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientTextInputService
-import androidx.compose.ui.platform.AmbientTextToolbar
+import androidx.compose.ui.platform.LocalTextInputService
+import androidx.compose.ui.platform.LocalTextToolbar
 import androidx.compose.ui.platform.TextToolbar
 import androidx.compose.ui.platform.TextToolbarStatus
 import androidx.compose.ui.platform.testTag
@@ -123,7 +123,7 @@
         rule.setContent {
             val state = remember { mutableStateOf("") }
             Providers(
-                AmbientTextInputService provides inputService
+                LocalTextInputService provides inputService
             ) {
                 BasicTextField(
                     value = state.value,
@@ -162,7 +162,7 @@
 
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 TextFieldApp()
             }
@@ -233,7 +233,7 @@
 
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 OnlyDigitsApp()
             }
@@ -292,7 +292,7 @@
         val onTextLayout: (TextLayoutResult) -> Unit = mock()
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 val state = remember { mutableStateOf("") }
                 BasicTextField(
@@ -367,7 +367,7 @@
         }
 
         with(rule.density) {
-            assertThat(size).isEqualTo(parentSize.toIntPx() - boxSize.toIntPx())
+            assertThat(size).isEqualTo(parentSize.roundToPx() - boxSize.roundToPx())
         }
     }
 
@@ -615,7 +615,7 @@
         var toolbar: TextToolbar? = null
 
         rule.setContent {
-            toolbar = AmbientTextToolbar.current
+            toolbar = LocalTextToolbar.current
             BasicTextField(
                 modifier = Modifier.testTag(Tag),
                 value = value,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.kt
index becda0f..8c959b0 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/DarkTheme.kt
@@ -19,7 +19,7 @@
 import android.content.res.Configuration
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ReadOnlyComposable
-import androidx.compose.ui.platform.AmbientConfiguration
+import androidx.compose.ui.platform.LocalConfiguration
 
 /**
  * This function should be used to help build responsive UIs that follow the system setting, to
@@ -31,9 +31,9 @@
  *
  * It is also recommended to provide user accessible overrides in your application, so users can
  * choose to force an always-light or always-dark theme. To do this, you should provide the current
- * theme value in an ambient or similar to components further down your hierarchy, only calling
- * this effect once at the top level if no user override has been set. This also helps avoid
- * multiple calls to this effect, which can be expensive as it queries system configuration.
+ * theme value in a CompositionLocal or similar to components further down your hierarchy, only
+ * calling this effect once at the top level if no user override has been set. This also helps
+ * avoid multiple calls to this effect, which can be expensive as it queries system configuration.
  *
  * For example, to draw a white rectangle when in dark theme, and a black rectangle when in light
  * theme:
@@ -45,6 +45,6 @@
 @Composable
 @ReadOnlyComposable
 fun isSystemInDarkTheme(): Boolean {
-    val uiMode = AmbientConfiguration.current.uiMode
+    val uiMode = LocalConfiguration.current.uiMode
     return (uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingCalculator.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingCalculator.kt
index 6bb3c64..30955a3 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingCalculator.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingCalculator.kt
@@ -44,7 +44,7 @@
  * Configuration for Android-feel flinging motion at the given density.
  *
  * @param friction scroll friction.
- * @param density density of the screen. Use [DensityAmbient] to get current density in composition.
+ * @param density density of the screen. Use LocalDensity to get current density in composition.
  */
 internal class AndroidFlingCalculator(
     private val friction: Float,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingConfig.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingConfig.kt
index 2ed0f66..3d03ed5 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingConfig.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingConfig.kt
@@ -19,13 +19,13 @@
 import androidx.compose.animation.core.TargetAnimation
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 
 @Composable
 internal actual fun actualFlingConfig(adjustTarget: (Float) -> TargetAnimation?): FlingConfig {
     // This function will internally update the calculation of fling decay when the density changes,
     // but the reference to the returned FlingConfig will not change across calls.
-    val density = AmbientDensity.current
+    val density = LocalDensity.current
     return remember(density.density) {
         val decayAnimation = FloatAndroidFlingDecaySpec(density)
         FlingConfig(
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.kt
index e4449de0..9e0a72f 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.foundation.gestures
 
 import androidx.compose.runtime.State
@@ -132,6 +134,7 @@
     }
 }
 
+@Suppress("DEPRECATION")
 internal actual fun Modifier.mouseScrollable(
     scrollCallback: ScrollCallback,
     orientation: Orientation
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
deleted file mode 100644
index ae33409..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.foundation
-
-import androidx.compose.foundation.text.BasicTextField
-import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.takeOrElse
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextLayoutResult
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.VisualTransformation
-
-/**
- * Composable that enables users to edit text via hardware or software keyboard.
- *
- * Whenever the user edits the text, [onValueChange] is called with the most up to date state
- * represented by [TextFieldValue]. [TextFieldValue] contains
- * the text entered by user, as well as selection, cursor and text composition information.
- * Please check [TextFieldValue] for the description of its contents.
- *
- * It is crucial that the value provided in the [onValueChange] is fed back into [BaseTextField] in
- * order to have the final state of the text being displayed. Example usage:
- * @sample androidx.compose.foundation.samples.TextFieldSample
- *
- * Please keep in mind that [onValueChange] is useful to be informed about the latest state of the
- * text input by users, however it is generally not recommended to modify the values in the
- * [TextFieldValue] that you get via [onValueChange] callback. Any change to the values in
- * [TextFieldValue] may result in a context reset and end up with input session restart. Such
- * a scenario would cause glitches in the UI or text input experience for users.
- *
- * This composable provides basic text editing functionality, however does not include any
- * decorations such as borders, hints/placeholder. A design system based implementation such as
- * Material Design Filled text field is typically what is needed to cover most of the needs. This
- * composable is designed to be used when a custom implementation for different design system is
- * needed.
- *
- * For example, if you need to include a hint in your TextField you can write a composable as below:
- * @sample androidx.compose.foundation.samples.PlaceholderTextFieldSample
- *
- * @param value The [TextFieldValue] to be shown in the [BaseTextField].
- * @param onValueChange Called when the input service updates values in
- * [TextFieldValue].
- * @param modifier optional [Modifier] for this text field.
- * @param textColor [Color] to apply to the text. If [Color.Unspecified], and [textStyle] has no
- * color set, this will be [AmbientContentColor].
- * @param textStyle Style configuration that applies at character level such as color, font etc.
- * The default [textStyle] uses the [AmbientTextStyle] defined by the theme
- * @param keyboardType The keyboard type to be used in this text field. Note that this input type
- * is honored by IME and shows corresponding keyboard but this is not guaranteed. For example,
- * some IME may send non-ASCII character even if you set [KeyboardType.Ascii].
- * @param imeAction The IME action. This IME action is honored by IME and may show specific icons
- * on the keyboard. For example, search icon may be shown if [ImeAction.Search] is specified.
- * Then, when user tap that key, the [onImeActionPerformed] callback is called with specified
- * ImeAction.
- *  * @param onImeActionPerformed Called when the input service requested an IME action. When the
- * input service emitted an IME action, this callback is called with the emitted IME action. Note
- * that this IME action may be different from what you specified in [imeAction].
- * @param visualTransformation The visual transformation filter for changing the visual
- * representation of the input. By default no visual transformation is applied.
- * @param onTextLayout Callback that is executed when a new text layout is calculated.
- * @param onTextInputStarted Callback that is executed when the initialization has done for
- * communicating with platform text input service, e.g. software keyboard on Android. Called with
- * [SoftwareKeyboardController] instance which can be used for requesting input show/hide software
- * keyboard.
- * @param cursorColor Color of the cursor. If [Color.Unspecified], there will be no cursor drawn
- *
- * @see TextFieldValue
- * @see ImeAction
- * @see KeyboardType
- * @see VisualTransformation
- */
-@Deprecated(
-    "Use BasicTextField instead.",
-    replaceWith = ReplaceWith(
-        "BasicTextField(value, onValueChange, modifier, textStyle.merge(TextStyle(color = " +
-            "textColor)), keyboardType, imeAction, onImeActionPerformed, visualTransformation, " +
-            "onTextLayout, onTextInputStarted, cursorColor)",
-        "androidx.compose.foundation.text.BasicTextField",
-        "androidx.compose.foundation.AmbientContentColor",
-        "androidx.compose.foundation.AmbientTextStyle",
-        "androidx.compose.ui.text.TextStyle",
-    )
-)
-@Composable
-@ExperimentalFoundationApi
-fun BaseTextField(
-    value: TextFieldValue,
-    onValueChange: (TextFieldValue) -> Unit,
-    modifier: Modifier = Modifier,
-    textColor: Color = Color.Unspecified,
-    textStyle: TextStyle = TextStyle(),
-    keyboardType: KeyboardType = KeyboardType.Text,
-    imeAction: ImeAction = ImeAction.Default,
-    onImeActionPerformed: (ImeAction) -> Unit = {},
-    visualTransformation: VisualTransformation = VisualTransformation.None,
-    onTextLayout: (TextLayoutResult) -> Unit = {},
-    onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
-    cursorColor: Color = AmbientContentColor.current
-) {
-    val color = textColor.takeOrElse { textStyle.color.takeOrElse { AmbientContentColor.current } }
-    val mergedStyle = textStyle.merge(TextStyle(color = color))
-
-    BasicTextField(
-        value = value,
-        modifier = modifier,
-        onValueChange = onValueChange,
-        textStyle = mergedStyle,
-        keyboardOptions = KeyboardOptions(
-            keyboardType = keyboardType,
-            imeAction = imeAction
-        ),
-        onImeActionPerformed = onImeActionPerformed,
-        visualTransformation = visualTransformation,
-        onTextLayout = onTextLayout,
-        onTextInputStarted = onTextInputStarted,
-        cursorColor = cursorColor
-    )
-}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
index 6032f46..f683f03 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
@@ -35,10 +35,113 @@
 /**
  * Configure component to receive clicks via input or accessibility "click" event.
  *
- * Add this modifier to the element to make it clickable within its bounds.
+ * Add this modifier to the element to make it clickable within its bounds and show a default
+ * indication when it's pressed.
  *
  * This version has no [InteractionState] or [Indication] parameters, default indication from
- * [AmbientIndication] will be used. To specify [InteractionState] or [Indication], use another
+ * [LocalIndication] will be used. To specify [InteractionState] or [Indication], use another
+ * overload.
+ *
+ * If you need to support double click or long click alongside the single click, consider
+ * using [combinedClickable].
+ *
+ * @sample androidx.compose.foundation.samples.ClickableSample
+ *
+ * @param enabled Controls the enabled state. When `false`, [onClick], and this modifier will
+ * appear disabled for accessibility services
+ * @param onClickLabel semantic / accessibility label for the [onClick] action
+ * @param role the type of user interface element. Accessibility services might use this
+ * to describe the element or do customizations
+ * @param onClick will be called when user clicks on the element
+ */
+fun Modifier.clickable(
+    enabled: Boolean = true,
+    onClickLabel: String? = null,
+    role: Role? = null,
+    onClick: () -> Unit
+) = composed(
+    inspectorInfo = debugInspectorInfo {
+        name = "clickable"
+        properties["enabled"] = enabled
+        properties["onClickLabel"] = onClickLabel
+        properties["role"] = role
+        properties["onClick"] = onClick
+    }
+) {
+    Modifier.clickable(
+        enabled = enabled,
+        onClickLabel = onClickLabel,
+        onClick = onClick,
+        role = role,
+        indication = LocalIndication.current(),
+        interactionState = remember { InteractionState() }
+    )
+}
+
+/**
+ * Configure component to receive clicks via input or accessibility "click" event.
+ *
+ * Add this modifier to the element to make it clickable within its bounds and show an indication
+ * as specified in [indication] parameter.
+ *
+ * If you need to support double click or long click alongside the single click, consider
+ * using [combinedClickable].
+ *
+ * @sample androidx.compose.foundation.samples.ClickableSample
+ *
+ * @param interactionState [InteractionState] that will be updated when this Clickable is
+ * pressed, using [Interaction.Pressed]. Only initial (first) press will be recorded and added to
+ * [InteractionState]
+ * @param indication indication to be shown when modified element is pressed. Be default,
+ * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
+ * current value from [LocalIndication] to show theme default
+ * @param enabled Controls the enabled state. When `false`, [onClick], and this modifier will
+ * appear disabled for accessibility services
+ * @param onClickLabel semantic / accessibility label for the [onClick] action
+ * @param role the type of user interface element. Accessibility services might use this
+ * to describe the element or do customizations
+ * @param onClick will be called when user clicks on the element
+ */
+@OptIn(ExperimentalFoundationApi::class)
+fun Modifier.clickable(
+    interactionState: InteractionState,
+    indication: Indication?,
+    enabled: Boolean = true,
+    onClickLabel: String? = null,
+    role: Role? = null,
+    onClick: () -> Unit
+) = composed(
+    factory = {
+        Modifier.combinedClickable(
+            enabled = enabled,
+            onClickLabel = onClickLabel,
+            onClick = onClick,
+            role = role,
+            indication = indication,
+            interactionState = interactionState
+        )
+    },
+    inspectorInfo = debugInspectorInfo {
+        name = "clickable"
+        properties["enabled"] = enabled
+        properties["onClickLabel"] = onClickLabel
+        properties["role"] = role
+        properties["onClick"] = onClick
+        properties["indication"] = indication
+        properties["interactionState"] = interactionState
+    }
+)
+
+/**
+ * Configure component to receive clicks, double clicks and long clicks via input or accessibility
+ * "click" event.
+ *
+ * Add this modifier to the element to make it clickable within its bounds.
+ *
+ * If you need only click handling, and no double or long clicks, consider using [clickable]
+ *
+ * This version has no [InteractionState] or [Indication] parameters, default indication from
+ * [LocalIndication] will be used. To specify [InteractionState] or [Indication], use another
  * overload.
  *
  * @sample androidx.compose.foundation.samples.ClickableSample
@@ -48,11 +151,13 @@
  * @param onClickLabel semantic / accessibility label for the [onClick] action
  * @param role the type of user interface element. Accessibility services might use this
  * to describe the element or do customizations
+ * @param onLongClickLabel semantic / accessibility label for the [onLongClick] action
  * @param onLongClick will be called when user long presses on the element
  * @param onDoubleClick will be called when user double clicks on the element
  * @param onClick will be called when user clicks on the element
  */
-fun Modifier.clickable(
+@ExperimentalFoundationApi
+fun Modifier.combinedClickable(
     enabled: Boolean = true,
     onClickLabel: String? = null,
     role: Role? = null,
@@ -62,7 +167,7 @@
     onClick: () -> Unit
 ) = composed(
     inspectorInfo = debugInspectorInfo {
-        name = "clickable"
+        name = "combinedClickable"
         properties["enabled"] = enabled
         properties["onClickLabel"] = onClickLabel
         properties["role"] = role
@@ -72,7 +177,7 @@
         properties["onLongClickLabel"] = onLongClickLabel
     }
 ) {
-    Modifier.clickable(
+    Modifier.combinedClickable(
         enabled = enabled,
         onClickLabel = onClickLabel,
         onLongClickLabel = onLongClickLabel,
@@ -80,38 +185,45 @@
         onDoubleClick = onDoubleClick,
         onClick = onClick,
         role = role,
-        indication = AmbientIndication.current(),
+        indication = LocalIndication.current(),
         interactionState = remember { InteractionState() }
     )
 }
 
 /**
- * Configure component to receive clicks via input or accessibility "click" event.
+ * Configure component to receive clicks, double clicks and long clicks via input or accessibility
+ * "click" event.
+ *
+ * Add this modifier to the element to make it clickable within its bounds.
+ *
+ * If you need only click handling, and no double or long clicks, consider using [clickable].
  *
  * Add this modifier to the element to make it clickable within its bounds.
  *
  * @sample androidx.compose.foundation.samples.ClickableSample
  *
- * @param enabled Controls the enabled state. When `false`, [onClick], [onLongClick] or
- * [onDoubleClick] won't be invoked
  * @param interactionState [InteractionState] that will be updated when this Clickable is
  * pressed, using [Interaction.Pressed]. Only initial (first) press will be recorded and added to
  * [InteractionState]
  * @param indication indication to be shown when modified element is pressed. Be default,
- * indication from [AmbientIndication] will be used. Pass `null` to show no indication, or
- * current value from [AmbientIndication] to show theme default
+ * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
+ * current value from [LocalIndication] to show theme default
+ * @param enabled Controls the enabled state. When `false`, [onClick], [onLongClick] or
+ * [onDoubleClick] won't be invoked
  * @param onClickLabel semantic / accessibility label for the [onClick] action
  * @param role the type of user interface element. Accessibility services might use this
  * to describe the element or do customizations
+ * @param onLongClickLabel semantic / accessibility label for the [onLongClick] action
  * @param onLongClick will be called when user long presses on the element
  * @param onDoubleClick will be called when user double clicks on the element
  * @param onClick will be called when user clicks on the element
  */
 @Suppress("DEPRECATION")
-fun Modifier.clickable(
-    enabled: Boolean = true,
+@ExperimentalFoundationApi
+fun Modifier.combinedClickable(
     interactionState: InteractionState,
     indication: Indication?,
+    enabled: Boolean = true,
     onClickLabel: String? = null,
     role: Role? = null,
     onLongClickLabel: String? = null,
@@ -168,7 +280,7 @@
             .then(doubleTap)
     },
     inspectorInfo = debugInspectorInfo {
-        name = "clickable"
+        name = "combinedClickable"
         properties["enabled"] = enabled
         properties["onClickLabel"] = onClickLabel
         properties["role"] = role
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ContentColor.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ContentColor.kt
deleted file mode 100644
index 05ee91c..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ContentColor.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.ambientOf
-import androidx.compose.ui.graphics.Color
-
-/**
- * Returns the preferred content color at the call site's position in the hierarchy.
- *
- * This color should be used for any typography / iconography, to ensure that the color of these
- * adjusts when the background color changes. For example, on a dark background, text should be
- * light, and on a light background, text should be dark.
- *
- * @return the preferred content color specified by a parent, defaulting to [Color.Black] if
- * unspecified.
- */
-@Suppress("DEPRECATION")
-@Deprecated(
-    message = "Use AmbientContentColor.current directly",
-    replaceWith = ReplaceWith(
-        "AmbientContentColor.current",
-        "androidx.compose.foundation.AmbientContentColor"
-    )
-)
-@Composable
-fun contentColor() = AmbientContentColor.current
-
-/**
- * Ambient containing the preferred content color for a given position in the hierarchy.
- *
- * This color should be used for any typography / iconography, to ensure that the color of these
- * adjusts when the background color changes. For example, on a dark background, text should be
- * light, and on a light background, text should be dark.
- *
- * Defaults to [Color.Black] if no color has been explicitly set.
- */
-@Deprecated(
-    message = "AmbientContentColor has moved to the Material library. For non-Material " +
-        "applications, create your own design system specific theming ambients.",
-    replaceWith = ReplaceWith(
-        "AmbientContentColor", "androidx.compose.material.AmbientContentColor"
-    )
-)
-val AmbientContentColor = ambientOf { Color.Black }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Icon.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Icon.kt
deleted file mode 100644
index f63b5e8..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Icon.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.foundation
-
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.paint
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.ColorFilter
-import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.painter.ImagePainter
-import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.graphics.vector.rememberVectorPainter
-import androidx.compose.ui.unit.dp
-
-/**
- * Icon component that draws [imageVector] using [tint], defaulting to [AmbientContentColor].
- *
- * @param imageVector [ImageVector] to draw inside this Icon
- * @param modifier optional [Modifier] for this Icon
- * @param tint tint to be applied to [asset]. If [Color.Unspecified] is provided, then no
- *  tint is applied
- */
-@Deprecated(
-    "Icon has been moved into the Material library: androidx.compose.material.Icon",
-    replaceWith = ReplaceWith("Icon(asset)", "androidx.compose.material.Icon")
-)
-@Composable
-fun Icon(
-    imageVector: ImageVector,
-    modifier: Modifier = Modifier,
-    tint: Color = AmbientContentColor.current
-) {
-    @Suppress("DEPRECATION")
-    Icon(
-        painter = rememberVectorPainter(imageVector),
-        modifier = modifier,
-        tint = tint
-    )
-}
-
-/**
- * Icon component that draws [bitmap] using [tint], defaulting to [AmbientContentColor].
- *
- * @param bitmap [ImageBitmap] to draw inside this Icon
- * @param modifier optional [Modifier] for this Icon
- * @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no
- *  tint is applied
- */
-@Deprecated(
-    "Icon has been moved into the Material library: androidx.compose.material.Icon",
-    replaceWith = ReplaceWith("Icon(asset)", "androidx.compose.material.Icon")
-)
-@Composable
-fun Icon(
-    bitmap: ImageBitmap,
-    modifier: Modifier = Modifier,
-    tint: Color = AmbientContentColor.current
-) {
-    val painter = remember(bitmap) { ImagePainter(bitmap) }
-    @Suppress("DEPRECATION")
-    Icon(
-        painter = painter,
-        modifier = modifier,
-        tint = tint
-    )
-}
-
-/**
- * Icon component that draws a [painter] using [tint], defaulting to [AmbientContentColor].
- *
- * @param painter Painter to draw inside this Icon
- * @param modifier optional [Modifier] for this Icon
- * @param tint tint to be applied to [painter]. If [Color.Unspecified] is provided, then no
- *  tint is applied
- */
-@Deprecated(
-    "Icon has been moved into the Material library: androidx.compose.material.Icon",
-    replaceWith = ReplaceWith("Icon(asset)", "androidx.compose.material.Icon")
-)
-@Composable
-fun Icon(
-    painter: Painter,
-    modifier: Modifier = Modifier,
-    tint: Color = AmbientContentColor.current
-) {
-    // TODO: consider allowing developers to override the intrinsic size, and specify their own
-    // size that this icon will be forced to take up.
-    // TODO: b/149735981 semantics for content description
-    val colorFilter = if (tint == Color.Unspecified) null else ColorFilter.tint(tint)
-    Box(modifier.defaultSizeFor(painter).paint(painter, colorFilter = colorFilter))
-}
-
-private fun Modifier.defaultSizeFor(painter: Painter) =
-    this.then(
-        if (painter.intrinsicSize == Size.Unspecified || painter.intrinsicSize.isInfinite()) {
-            DefaultIconSizeModifier
-        } else {
-            Modifier
-        }
-    )
-
-private fun Size.isInfinite() = width.isInfinite() && height.isInfinite()
-
-// Default icon size, for icons with no intrinsic size information
-private val DefaultIconSizeModifier = Modifier.preferredSize(24.dp)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt
index e540e8f..5d78137 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.RememberObserver
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
 import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.Modifier
@@ -37,7 +37,7 @@
  * [indication] modifier.
  *
  * If you want to override default behaviour for [indication] for the whole subtree, consider
- * creating object of this factory and providing it in [AmbientIndication].
+ * creating object of this factory and providing it in [LocalIndication].
  */
 @Stable
 interface Indication {
@@ -106,12 +106,31 @@
 )
 
 /**
- * Ambient to provide [IndicationInstance] to draw visual indication for press and other events.
+ * CompositionLocal that provides an [IndicationInstance] to draw visual indication for press and
+ * other events.
  *
- * By default there will be [DefaultDebugIndication] created.
+ * By default this will provide [DefaultDebugIndication].
  */
 // TODO : temporary made it to be lambda, fix when b/157150564 is fixed
-val AmbientIndication = staticAmbientOf<@Composable () -> Indication> { { DefaultDebugIndication } }
+@Deprecated(
+    "Renamed to LocalIndication",
+    replaceWith = ReplaceWith(
+        "LocalIndication",
+        "androidx.compose.foundation.LocalIndication"
+    )
+)
+val AmbientIndication get() = LocalIndication
+
+/**
+ * CompositionLocal that provides an [IndicationInstance] to draw visual indication for press and
+ * other events.
+ *
+ * By default this will provide [DefaultDebugIndication].
+ */
+// TODO : temporary made it to be lambda, fix when b/157150564 is fixed
+val LocalIndication = staticCompositionLocalOf<@Composable () -> Indication> {
+    { DefaultDebugIndication }
+}
 
 private object NoIndication : Indication {
     private object NoIndicationInstance : IndicationInstance {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
index 65bc7c7..07a5f44 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
@@ -55,8 +55,8 @@
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.semantics.ScrollAxisRange
 import androidx.compose.ui.semantics.horizontalScrollAxisRange
@@ -86,7 +86,7 @@
     initial: Float = 0f,
     interactionState: InteractionState? = null
 ): ScrollState {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     val config = defaultFlingConfig()
     return rememberSaveable(
         clock, config, interactionState,
@@ -412,8 +412,8 @@
         val semantics = Modifier.semantics {
             if (isScrollable) {
                 val accessibilityScrollState = ScrollAxisRange(
-                    value = state.value,
-                    maxValue = state.maxValue,
+                    value = { state.value },
+                    maxValue = { state.maxValue },
                     reverseScrolling = reverseScrolling
                 )
                 if (isVertical) {
@@ -436,7 +436,7 @@
                 )
             }
         }
-        val isRtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+        val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
         val scrolling = Modifier.scrollable(
             orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal,
             // reverse scroll by default, to have "natural" gesture that goes reversed to layout
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
index 1368fa2..363fd7d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
@@ -25,10 +25,17 @@
 import androidx.compose.ui.input.pointer.PointerInputScope
 import androidx.compose.ui.input.pointer.anyPositionChangeConsumed
 import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed
+import androidx.compose.ui.input.pointer.isOutOfBounds
 import androidx.compose.ui.input.pointer.positionChange
 import androidx.compose.ui.input.pointer.positionChangeIgnoreConsumed
 import androidx.compose.ui.input.pointer.positionChangedIgnoreConsumed
 import androidx.compose.ui.platform.ViewConfiguration
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFirstOrNull
+import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.TimeoutCancellationException
+import kotlinx.coroutines.withTimeout
 import kotlin.math.abs
 import kotlin.math.sign
 
@@ -207,6 +214,50 @@
 }
 
 /**
+ * Gesture detector that waits for pointer down and long press, after which it calls [onDrag] for
+ * each drag event. [onDrag] must consume the position change if it wants to accept the drag
+ * motion. [onDragStart] will be called when long press in detected with the last known pointer
+ * position provided. [onDragEnd] is called after all pointers are up and [onDragCancel] is
+ * called if another gesture has consumed pointer input, canceling this gesture.
+ *
+ * Example Usage:
+ * @sample androidx.compose.foundation.samples.DetectDragWithLongPressGesturesSample
+ *
+ * @see detectVerticalDragGestures
+ * @see detectHorizontalDragGestures
+ * @see detectDragGestures
+ */
+suspend fun PointerInputScope.detectDragGesturesAfterLongPress(
+    onDragEnd: () -> Unit = { },
+    onDragCancel: () -> Unit = { },
+    onDragStart: (Offset) -> Unit = { },
+    onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
+) {
+    forEachGesture {
+        val down = awaitPointerEventScope {
+            awaitFirstDown(requireUnconsumed = false)
+        }
+        try {
+            val drag = awaitLongPressOrCancellation(down)
+            if (drag != null) {
+                onDragStart.invoke(drag.position)
+
+                awaitPointerEventScope {
+                    if (!drag(drag.id) { onDrag(it, it.positionChange()) }) {
+                        onDragCancel()
+                    } else {
+                        onDragEnd()
+                    }
+                }
+            }
+        } catch (c: CancellationException) {
+            onDragCancel()
+            throw c
+        }
+    }
+}
+
+/**
  * Waits for vertical drag motion to pass [touch slop][ViewConfiguration.touchSlop], using
  * [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from
  * those that are down will be chosen to lead the gesture, and if none are down, `null` is returned.
@@ -595,5 +646,57 @@
     }
 }
 
+private suspend fun PointerInputScope.awaitLongPressOrCancellation(
+    initialDown: PointerInputChange
+): PointerInputChange? {
+    var longPress: PointerInputChange? = null
+    var currentDown = initialDown
+    val longPressTimeout = viewConfiguration.longPressTimeoutMillis
+    return try {
+        // wait for first tap up or long press
+        withTimeout(longPressTimeout) {
+            awaitPointerEventScope {
+                var finished = false
+                while (!finished) {
+                    val event = awaitPointerEvent(PointerEventPass.Main)
+                    if (event.changes.fastAll { it.changedToUpIgnoreConsumed() }) {
+                        // All pointers are up
+                        finished = true
+                    }
+
+                    if (
+                        event.changes.fastAny { it.consumed.downChange || it.isOutOfBounds(size) }
+                    ) {
+                        finished = true // Canceled
+                    }
+
+                    // Check for cancel by position consumption. We can look on the Final pass of
+                    // the existing pointer event because it comes after the Main pass we checked
+                    // above.
+                    val consumeCheck = awaitPointerEvent(PointerEventPass.Final)
+                    if (consumeCheck.changes.fastAny { it.anyPositionChangeConsumed() }) {
+                        finished = true
+                    }
+                    if (!event.isPointerUp(currentDown.id)) {
+                        longPress = event.changes.firstOrNull { it.id == currentDown.id }
+                    } else {
+                        val newPressed = event.changes.fastFirstOrNull { it.pressed }
+                        if (newPressed != null) {
+                            currentDown = newPressed
+                            longPress = currentDown
+                        } else {
+                            // should technically never happen as we checked it above
+                            finished = true
+                        }
+                    }
+                }
+            }
+        }
+        null
+    } catch (_: TimeoutCancellationException) {
+        longPress ?: initialDown
+    }
+}
+
 private fun PointerEvent.isPointerUp(pointerId: PointerId): Boolean =
     changes.firstOrNull { it.id == pointerId }?.pressed != true
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
index 15a8e9a..2890e00 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
@@ -44,7 +44,7 @@
 import androidx.compose.ui.gesture.nestedscroll.NestedScrollSource
 import androidx.compose.ui.gesture.nestedscroll.nestedScroll
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Velocity
 import kotlinx.coroutines.Job
@@ -68,7 +68,7 @@
     interactionState: InteractionState? = null,
     consumeScrollDelta: (Float) -> Float
 ): ScrollableController {
-    val clocks = AmbientAnimationClock.current.asDisposableClock()
+    val clocks = LocalAnimationClock.current.asDisposableClock()
     val flingConfig = defaultFlingConfig()
     return remember(clocks, flingConfig, interactionState) {
         ScrollableController(consumeScrollDelta, flingConfig, clocks, interactionState)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Zoomable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Zoomable.kt
index c791a3b..6657e37 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Zoomable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Zoomable.kt
@@ -38,7 +38,7 @@
 import androidx.compose.ui.input.pointer.consumeAllChanges
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.input.pointer.positionChanged
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.util.fastAny
 import androidx.compose.ui.util.fastForEach
@@ -53,7 +53,7 @@
  */
 @Composable
 fun rememberZoomableController(onZoomDelta: (Float) -> Unit): ZoomableController {
-    val clocks = AmbientAnimationClock.current.asDisposableClock()
+    val clocks = LocalAnimationClock.current.asDisposableClock()
     return remember(clocks) { ZoomableController(clocks, onZoomDelta) }
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index e1bc857..23fdd92 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.layout.SubcomposeLayout
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.LayoutDirection
 
 @Composable
@@ -59,7 +59,7 @@
     /** The factory defining the content for an item on the given position in the list */
     itemContent: LazyItemScope.(Int) -> @Composable () -> Unit
 ) {
-    val isRtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+    val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
     // reverse scroll by default, to have "natural" gesture that goes reversed to layout
     // if rtl and horizontal, do not reverse to make it right-to-left
     val reverseScrollDirection = if (!isVertical && isRtl) reverseLayout else !reverseLayout
@@ -86,15 +86,15 @@
         // this will update the scope object if the constrains have been changed
         cachingItemContentFactory.updateItemScope(this, constraints)
 
-        val startContentPaddingPx = startContentPadding.toIntPx()
-        val endContentPaddingPx = endContentPadding.toIntPx()
+        val startContentPaddingPx = startContentPadding.roundToPx()
+        val endContentPaddingPx = endContentPadding.roundToPx()
         val mainAxisMaxSize = (if (isVertical) constraints.maxHeight else constraints.maxWidth)
         val spaceBetweenItemsDp = if (isVertical) {
             requireNotNull(verticalArrangement).spacing
         } else {
             requireNotNull(horizontalArrangement).spacing
         }
-        val spaceBetweenItems = spaceBetweenItemsDp.toIntPx()
+        val spaceBetweenItems = spaceBetweenItemsDp.roundToPx()
 
         val itemProvider = LazyMeasuredItemProvider(
             constraints,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 6b90307..6bcc913 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -35,7 +35,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.layout.Remeasurement
 import androidx.compose.ui.layout.RemeasurementModifier
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
 import kotlin.math.abs
 
 /**
@@ -57,7 +57,7 @@
     initialFirstVisibleItemScrollOffset: Int = 0,
     interactionState: InteractionState? = null
 ): LazyListState {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     val config = defaultFlingConfig()
 
     // Avoid creating a new instance every invocation
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt
index 6c572d7..1e77f3a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Selectable.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.foundation.selection
 
-import androidx.compose.foundation.AmbientIndication
 import androidx.compose.foundation.Indication
 import androidx.compose.foundation.Interaction
 import androidx.compose.foundation.InteractionState
+import androidx.compose.foundation.LocalIndication
 import androidx.compose.foundation.Strings
 import androidx.compose.foundation.clickable
 import androidx.compose.runtime.remember
@@ -40,7 +40,7 @@
  * using [Modifier.toggleable]
  *
  * This version has no [InteractionState] or [Indication] parameters, default indication from
- * [AmbientIndication] will be used. To specify [InteractionState] or [Indication], use another
+ * [LocalIndication] will be used. To specify [InteractionState] or [Indication], use another
  * overload.
  *
  * @sample androidx.compose.foundation.samples.SelectableSample
@@ -71,7 +71,7 @@
         enabled = enabled,
         role = role,
         interactionState = remember { InteractionState() },
-        indication = AmbientIndication.current(),
+        indication = LocalIndication.current(),
         onClick = onClick
     )
 }
@@ -93,8 +93,8 @@
  * @param interactionState [InteractionState] that will be updated when this element is
  * pressed, using [Interaction.Pressed]
  * @param indication indication to be shown when the modified element is pressed. By default,
- * the indication from [AmbientIndication] will be used. Set to `null` to show no indication, or
- * current value from [AmbientIndication] to show theme default
+ * the indication from [LocalIndication] will be used. Set to `null` to show no indication, or
+ * current value from [LocalIndication] to show theme default
  * @param enabled whether or not this [selectable] will handle input events
  * and appear enabled from a semantics perspective
  * @param role the type of user interface element. Accessibility services might use this
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
index 504f56c..96c5ba2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.foundation.selection
 
-import androidx.compose.foundation.AmbientIndication
 import androidx.compose.foundation.Indication
 import androidx.compose.foundation.Interaction
 import androidx.compose.foundation.InteractionState
+import androidx.compose.foundation.LocalIndication
 import androidx.compose.foundation.Strings
 import androidx.compose.foundation.indication
 import androidx.compose.runtime.DisposableEffect
@@ -45,7 +45,7 @@
  * Configure component to make it toggleable via input and accessibility events
  *
  * This version has no [InteractionState] or [Indication] parameters, default indication from
- * [AmbientIndication] will be used. To specify [InteractionState] or [Indication], use another
+ * [LocalIndication] will be used. To specify [InteractionState] or [Indication], use another
  * overload.
  *
  * @sample androidx.compose.foundation.samples.ToggleableSample
@@ -80,7 +80,7 @@
         enabled = enabled,
         role = role,
         interactionState = remember { InteractionState() },
-        indication = AmbientIndication.current()
+        indication = LocalIndication.current()
     )
 }
 
@@ -98,8 +98,8 @@
  * @param interactionState [InteractionState] that will be updated when this toggleable is
  * pressed, using [Interaction.Pressed]
  * @param indication indication to be shown when modified element is pressed. Be default,
- * indication from [AmbientIndication] will be used. Pass `null` to show no indication, or
- * current value from [AmbientIndication] to show theme default
+ * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
+ * current value from [LocalIndication] to show theme default
  * @param enabled whether or not this [toggleable] will handle input events and appear
  * enabled for semantics purposes
  * * @param role the type of user interface element. Accessibility services might use this
@@ -144,7 +144,7 @@
  * component and those can have different values.
  *
  * This version has no [InteractionState] or [Indication] parameters, default indication from
- * [AmbientIndication] will be used. To specify [InteractionState] or [Indication], use another
+ * [LocalIndication] will be used. To specify [InteractionState] or [Indication], use another
  * overload.
  *
  * @sample androidx.compose.foundation.samples.TriStateToggleableSample
@@ -177,7 +177,7 @@
         enabled,
         role,
         remember { InteractionState() },
-        AmbientIndication.current(),
+        LocalIndication.current(),
         onClick
     )
 }
@@ -200,8 +200,8 @@
  * @param interactionState [InteractionState] that will be updated when this toggleable is
  * pressed, using [Interaction.Pressed]
  * @param indication indication to be shown when modified element is pressed. Be default,
- * indication from [AmbientIndication] will be used. Pass `null` to show no indication, or
- * current value from [AmbientIndication] to show theme default
+ * indication from [LocalIndication] will be used. Pass `null` to show no indication, or
+ * current value from [LocalIndication] to show theme default
  * @param enabled whether or not this [triStateToggleable] will handle input events and
  * appear enabled for semantics purposes
  * @param role the type of user interface element. Accessibility services might use this
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
index 9ff8fdb..ab9da6a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@file:Suppress("DEPRECATION_ERROR")
+@file:Suppress("DEPRECATION_ERROR", "DEPRECATION")
 
 package androidx.compose.foundation.text
 
@@ -43,12 +43,12 @@
 import androidx.compose.ui.layout.MeasureBlock
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInWindow
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientFontLoader
-import androidx.compose.ui.selection.AmbientSelectionRegistrar
-import androidx.compose.ui.selection.AmbientTextSelectionColors
-import androidx.compose.ui.selection.Selectable
-import androidx.compose.ui.selection.SelectionRegistrar
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalFontLoader
+import androidx.compose.foundation.text.selection.LocalSelectionRegistrar
+import androidx.compose.foundation.text.selection.LocalTextSelectionColors
+import androidx.compose.foundation.text.selection.Selectable
+import androidx.compose.foundation.text.selection.SelectionRegistrar
 import androidx.compose.ui.semantics.getTextLayoutResult
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.text.AnnotatedString
@@ -94,6 +94,7 @@
  */
 @Composable
 @OptIn(ExperimentalTextApi::class, InternalTextApi::class)
+@Suppress("DEPRECATION") // longPressDragGestureFilter
 internal fun CoreText(
     text: AnnotatedString,
     modifier: Modifier = Modifier,
@@ -107,10 +108,10 @@
     require(maxLines > 0) { "maxLines should be greater than 0" }
 
     // selection registrar, if no SelectionContainer is added ambient value will be null
-    val selectionRegistrar = AmbientSelectionRegistrar.current
-    val density = AmbientDensity.current
-    val resourceLoader = AmbientFontLoader.current
-    val selectionBackgroundColor = AmbientTextSelectionColors.current.backgroundColor
+    val selectionRegistrar = LocalSelectionRegistrar.current
+    val density = LocalDensity.current
+    val resourceLoader = LocalFontLoader.current
+    val selectionBackgroundColor = LocalTextSelectionColors.current.backgroundColor
 
     val (placeholders, inlineComposables) = resolveInlineContent(text, inlineContent)
 
@@ -452,6 +453,7 @@
     ExperimentalTextApi::class
 )
 /*@VisibleForTesting*/
+@Suppress("DEPRECATION") // LongPressDragObserver
 internal fun longPressDragObserver(
     state: TextState,
     selectionRegistrar: SelectionRegistrar?
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index b4fed75..41796d2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -46,14 +46,14 @@
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientClipboardManager
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientFontLoader
-import androidx.compose.ui.platform.AmbientHapticFeedback
-import androidx.compose.ui.platform.AmbientTextInputService
-import androidx.compose.ui.platform.AmbientTextToolbar
-import androidx.compose.ui.selection.AmbientTextSelectionColors
-import androidx.compose.ui.selection.SimpleLayout
+import androidx.compose.ui.platform.LocalClipboardManager
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalFontLoader
+import androidx.compose.ui.platform.LocalHapticFeedback
+import androidx.compose.ui.platform.LocalTextInputService
+import androidx.compose.ui.platform.LocalTextToolbar
+import androidx.compose.foundation.text.selection.LocalTextSelectionColors
+import androidx.compose.foundation.text.selection.SimpleLayout
 import androidx.compose.ui.semantics.copyText
 import androidx.compose.ui.semantics.cutText
 import androidx.compose.ui.semantics.disabled
@@ -181,12 +181,12 @@
     val scope = currentRecomposeScope
     val focusRequester = FocusRequester()
 
-    // Ambients
+    // CompositionLocals
     // If the text field is disabled or read-only, we should not deal with the input service
-    val textInputService = if (!enabled || readOnly) null else AmbientTextInputService.current
-    val density = AmbientDensity.current
-    val resourceLoader = AmbientFontLoader.current
-    val selectionBackgroundColor = AmbientTextSelectionColors.current.backgroundColor
+    val textInputService = if (!enabled || readOnly) null else LocalTextInputService.current
+    val density = LocalDensity.current
+    val resourceLoader = LocalFontLoader.current
+    val selectionBackgroundColor = LocalTextSelectionColors.current.backgroundColor
 
     // Scroll state
     val singleLine = maxLines == 1 && !softWrap && imeOptions.singleLine
@@ -245,9 +245,9 @@
     manager.onValueChange = onValueChangeWrapper
     manager.state = state
     manager.value = value
-    manager.clipboardManager = AmbientClipboardManager.current
-    manager.textToolbar = AmbientTextToolbar.current
-    manager.hapticFeedBack = AmbientHapticFeedback.current
+    manager.clipboardManager = LocalClipboardManager.current
+    manager.textToolbar = LocalTextToolbar.current
+    manager.hapticFeedBack = LocalHapticFeedback.current
     manager.focusRequester = focusRequester
     manager.editable = !readOnly
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InactiveTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InactiveTextField.kt
index b29e015..791a40a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InactiveTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InactiveTextField.kt
@@ -21,8 +21,8 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.selection.DisableSelection
-import androidx.compose.ui.selection.SelectionContainer
+import androidx.compose.foundation.text.selection.DisableSelection
+import androidx.compose.foundation.text.selection.SelectionContainer
 import androidx.compose.ui.semantics.disabled
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.text.TextLayoutResult
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/MaxLinesHeightModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/MaxLinesHeightModifier.kt
index a080669..f23a824 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/MaxLinesHeightModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/MaxLinesHeightModifier.kt
@@ -20,9 +20,9 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientFontLoader
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalFontLoader
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.resolveDefaults
@@ -47,9 +47,9 @@
     }
     if (maxLines == Int.MAX_VALUE) return@composed Modifier
 
-    val density = AmbientDensity.current
-    val resourceLoader = AmbientFontLoader.current
-    val layoutDirection = AmbientLayoutDirection.current
+    val density = LocalDensity.current
+    val resourceLoader = LocalFontLoader.current
+    val layoutDirection = LocalLayoutDirection.current
 
     // Difference between the height of two lines paragraph and one line paragraph gives us
     // an approximation of height of one line
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt
index 51c0904..30fe4cc2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldGestureModifiers.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION") // gestures
+
 package androidx.compose.foundation.text
 
 import androidx.compose.foundation.InteractionState
@@ -36,7 +38,6 @@
     enabled: Boolean
 ) = if (enabled) this.then(longPressDragGestureFilter(observer)) else this
 
-@Suppress("DEPRECATION")
 internal fun Modifier.focusRequestTapModifier(onTap: (Offset) -> Unit, enabled: Boolean) =
     if (enabled) this.tapGestureFilter(onTap) else this
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt
index bc86ec6..986db1c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldScroll.kt
@@ -39,8 +39,8 @@
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
@@ -67,7 +67,7 @@
     }
 ) {
     // do not reverse direction only in case of RTL in horizontal orientation
-    val rtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+    val rtl = LocalLayoutDirection.current == LayoutDirection.Rtl
     val reverseDirection = scrollerPosition.orientation == Orientation.Vertical || !rtl
     val controller = rememberScrollableController(
         scrollerPosition,
@@ -130,7 +130,7 @@
     interactionState: InteractionState? = null,
     consumeScrollDelta: (Float) -> Float
 ): ScrollableController {
-    val clocks = AmbientAnimationClock.current.asDisposableClock()
+    val clocks = LocalAnimationClock.current.asDisposableClock()
     val flingConfig = defaultFlingConfig()
     return remember(inputs, clocks, flingConfig, interactionState) {
         ScrollableController(consumeScrollDelta, flingConfig, clocks, interactionState)
@@ -219,7 +219,7 @@
     val cursorRect = textLayoutResult?.getCursorRect(
         transformedText.offsetMapping.originalToTransformed(cursorOffset)
     ) ?: Rect.Zero
-    val thickness = DefaultCursorThickness.toIntPx()
+    val thickness = DefaultCursorThickness.roundToPx()
 
     val cursorLeft = if (rtl) {
         textFieldWidth - cursorRect.left - thickness
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
index 74891fb..6c97389 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
@@ -21,9 +21,9 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.layout.layout
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientFontLoader
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalFontLoader
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.resolveDefaults
@@ -33,9 +33,9 @@
 
 @Suppress("ModifierInspectorInfo")
 internal fun Modifier.textFieldMinSize(style: TextStyle) = composed {
-    val density = AmbientDensity.current
-    val resourceLoader = AmbientFontLoader.current
-    val layoutDirection = AmbientLayoutDirection.current
+    val density = LocalDensity.current
+    val resourceLoader = LocalFontLoader.current
+    val layoutDirection = LocalLayoutDirection.current
 
     val minSizeState = remember { TextFieldSize(layoutDirection, density, resourceLoader, style) }
     minSizeState.update(layoutDirection, density, resourceLoader, style)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
index 48e2f1d..f207cac 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
@@ -19,8 +19,6 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.selection.Selectable
-import androidx.compose.ui.selection.Selection
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.TextLayoutResult
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/Selectable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
similarity index 94%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/Selectable.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
index b98c168..b728f69 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/Selectable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,20 +14,19 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.ExperimentalTextApi
 
 /**
  * Provides [Selection] information for a composable to SelectionContainer. Composables who can
  * be selected should subscribe to [SelectionRegistrar] using this interface.
  */
-@ExperimentalTextApi
-interface Selectable {
+
+internal interface Selectable {
     /**
      * Returns [Selection] information for a selectable composable. If no selection can be provided
      * null should be returned.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/Selection.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
similarity index 93%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/Selection.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
index bb80ac9..4466d69 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/Selection.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.runtime.Immutable
 import androidx.compose.ui.text.ExperimentalTextApi
@@ -26,7 +26,7 @@
  */
 @Immutable
 @OptIn(ExperimentalTextApi::class)
-data class Selection(
+internal data class Selection(
     /**
      * Information about the start of the selection.
      */
@@ -51,7 +51,7 @@
      * Contains information about an anchor (start/end) of selection.
      */
     @Immutable
-    data class AnchorInfo(
+    internal data class AnchorInfo(
         /**
          * Text direction of the character in selection edge.
          */
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
new file mode 100644
index 0000000..bc60b85
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionContainer.kt
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.text.selection
+
+import androidx.compose.foundation.Interaction
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.platform.LocalClipboardManager
+import androidx.compose.ui.platform.LocalHapticFeedback
+import androidx.compose.ui.platform.LocalTextToolbar
+import androidx.compose.ui.text.InternalTextApi
+
+/**
+ * Enables text selection for it's direct or indirection children.
+ *
+ * @sample androidx.compose.foundation.samples.SelectionSample
+ */
+@OptIn(InternalTextApi::class)
+@Composable
+fun SelectionContainer(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
+    var selection by remember { mutableStateOf<Selection?>(null) }
+    SelectionContainer(
+        modifier = modifier,
+        selection = selection,
+        onSelectionChange = {
+            selection = it
+        },
+        children = content
+    )
+}
+
+/**
+ * Disables text selection for it's direct or indirection children. To use this, simply add this
+ * to wrap one or more text composables.
+ *
+ * @sample androidx.compose.foundation.samples.DisableSelectionSample
+ */
+@Composable
+fun DisableSelection(content: @Composable () -> Unit) {
+    Providers(
+        LocalSelectionRegistrar provides null,
+        content = content
+    )
+}
+
+/**
+ * Selection Composable.
+ *
+ * The selection composable wraps composables and let them to be selectable. It paints the selection
+ * area with start and end handles.
+ *
+ * @suppress
+ */
+@Suppress("ComposableLambdaParameterNaming", "DEPRECATION")
+@InternalTextApi // Used by foundation
+@Composable
+internal fun SelectionContainer(
+    /** A [Modifier] for SelectionContainer. */
+    modifier: Modifier = Modifier,
+    /** Current Selection status.*/
+    selection: Selection?,
+    /** A function containing customized behaviour when selection changes. */
+    onSelectionChange: (Selection?) -> Unit,
+    children: @Composable () -> Unit
+) {
+    val registrarImpl = remember { SelectionRegistrarImpl() }
+    val manager = remember { SelectionManager(registrarImpl) }
+
+    manager.hapticFeedBack = LocalHapticFeedback.current
+    manager.clipboardManager = LocalClipboardManager.current
+    manager.textToolbar = LocalTextToolbar.current
+    manager.onSelectionChange = onSelectionChange
+    manager.selection = selection
+
+    Providers(LocalSelectionRegistrar provides registrarImpl) {
+        // Get the layout coordinates of the selection container. This is for hit test of
+        // cross-composable selection.
+        SimpleLayout(modifier = modifier.then(manager.modifier)) {
+            children()
+            if (manager.interactionState.contains(Interaction.Focused)) {
+                manager.selection?.let {
+                    for (isStartHandle in listOf(true, false)) {
+                        SelectionHandle(
+                            startHandlePosition = manager.startHandlePosition,
+                            endHandlePosition = manager.endHandlePosition,
+                            isStartHandle = isStartHandle,
+                            directions = Pair(it.start.direction, it.end.direction),
+                            handlesCrossed = it.handlesCrossed,
+                            modifier = Modifier.dragGestureFilter(
+                                manager.handleDragObserver(
+                                    isStartHandle
+                                )
+                            ),
+                            handle = null
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    DisposableEffect(manager) {
+        onDispose {
+            manager.hideSelectionToolbar()
+        }
+    }
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionHandles.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt
similarity index 96%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionHandles.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt
index 67ff734..ddcef67 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionHandles.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
@@ -36,7 +36,7 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -110,7 +110,7 @@
     handlesCrossed: Boolean
 ) {
     val selectionHandleCache = remember { SelectionHandleCache() }
-    val handleColor = AmbientTextSelectionColors.current.handleColor
+    val handleColor = LocalTextSelectionColors.current.handleColor
     HandleDrawLayout(modifier = modifier, width = HANDLE_WIDTH, height = HANDLE_HEIGHT) {
         drawPath(
             selectionHandleCache.createPath(
@@ -188,7 +188,7 @@
 ) {
     Layout({}, modifier.drawBehind(onCanvas)) { _, _ ->
         // take width and height space of the screen and allow draw modifier to draw inside of it
-        layout(width.toIntPx(), height.toIntPx()) {
+        layout(width.roundToPx(), height.roundToPx()) {
             // this layout has no children, only draw modifier.
         }
     }
@@ -261,7 +261,7 @@
     val offset: IntOffset
 ) : PopupPositionProvider {
     override fun calculatePosition(
-        anchorBounds: IntBounds,
+        anchorBounds: IntRect,
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
similarity index 91%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
index 084a67d..e6a9b7f5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,13 +14,22 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+@file:Suppress("DEPRECATION")
 
+package androidx.compose.foundation.text.selection
+
+import androidx.compose.foundation.InteractionState
+import androidx.compose.foundation.focusable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.isFocused
+import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.gesture.DragObserver
@@ -28,6 +37,7 @@
 import androidx.compose.ui.hapticfeedback.HapticFeedbackType
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.boundsInWindow
+import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.ClipboardManager
 import androidx.compose.ui.platform.TextToolbar
 import androidx.compose.ui.platform.TextToolbarStatus
@@ -79,6 +89,29 @@
     var textToolbar: TextToolbar? = null
 
     /**
+     * Focus requester used to request focus when selection becomes active.
+     */
+    var focusRequester: FocusRequester = FocusRequester()
+
+    /**
+     * InteractionState corresponds to the focusRequester, it will return trun.
+     */
+    val interactionState: InteractionState = InteractionState()
+
+    /**
+     * Modifier for selection container.
+     */
+    val modifier get() = Modifier
+        .onGloballyPositioned { containerLayoutCoordinates = it }
+        .focusRequester(focusRequester)
+        .onFocusChanged { focusState ->
+            if (!focusState.isFocused) {
+                onRelease()
+            }
+        }
+        .focusable(interactionState = interactionState)
+
+    /**
      * Layout Coordinates of the selection container.
      */
     var containerLayoutCoordinates: LayoutCoordinates? = null
@@ -138,6 +171,7 @@
                 longPress = true
             )
             hideSelectionToolbar()
+            focusRequester.requestFocus()
         }
 
         selectionRegistrar.onSelectionUpdateCallback =
@@ -235,8 +269,7 @@
     ): Selection? {
 
         val newSelection = selectionRegistrar.sort(requireContainerCoordinates())
-            .fold(null) { mergedSelection: Selection?,
-                handler: Selectable ->
+            .fold(null) { mergedSelection: Selection?, handler: Selectable ->
                 merge(
                     mergedSelection,
                     handler.getSelection(
@@ -384,13 +417,15 @@
 
     // This is for PressGestureDetector to cancel the selection.
     fun onRelease() {
-        // Call mergeSelections with an out of boundary input to inform all text widgets to
-        // cancel their individual selection.
-        mergeSelections(
-            startPosition = Offset(-1f, -1f),
-            endPosition = Offset(-1f, -1f),
-            previousSelection = selection
-        )
+        if (containerLayoutCoordinates?.isAttached == true) {
+            // Call mergeSelections with an out of boundary input to inform all text widgets to
+            // cancel their individual selection.
+            mergeSelections(
+                startPosition = Offset(-1f, -1f),
+                endPosition = Offset(-1f, -1f),
+                previousSelection = selection
+            )
+        }
         hideSelectionToolbar()
         if (selection != null) onSelectionChange(null)
     }
@@ -559,7 +594,7 @@
 }
 
 /** Returns the boundary of the visible area in this [LayoutCoordinates]. */
-private fun LayoutCoordinates.visibleBounds(): Rect {
+internal fun LayoutCoordinates.visibleBounds(): Rect {
     // globalBounds is the global boundaries of this LayoutCoordinates after it's clipped by
     // parents. We can think it as the global visible bounds of this Layout. Here globalBounds
     // is convert to local, which is the boundary of the visible area within the LayoutCoordinates.
@@ -570,5 +605,5 @@
     )
 }
 
-private fun Rect.containsInclusive(offset: Offset): Boolean =
+internal fun Rect.containsInclusive(offset: Offset): Boolean =
     offset.x in left..right && offset.y in top..bottom
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionRegistrar.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
similarity index 88%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionRegistrar.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
index f9f23c5..a3d728a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionRegistrar.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.text.ExperimentalTextApi
@@ -25,7 +25,7 @@
  *  An interface allowing a composable to subscribe and unsubscribe to selection changes.
  */
 @ExperimentalTextApi
-interface SelectionRegistrar {
+internal interface SelectionRegistrar {
     /**
      * Subscribe to SelectionContainer selection changes.
      */
@@ -103,8 +103,9 @@
 }
 
 /**
- * Ambient of SelectionRegistrar. Composables that implement selection logic can use this ambient
- * to get a [SelectionRegistrar] in order to subscribe and unsubscribe to [SelectionRegistrar].
+ * SelectionRegistrar CompositionLocal. Composables that implement selection logic can use this
+ * CompositionLocal to get a [SelectionRegistrar] in order to subscribe and unsubscribe to
+ * [SelectionRegistrar].
  */
 @OptIn(ExperimentalTextApi::class)
-val AmbientSelectionRegistrar = ambientOf<SelectionRegistrar?>()
+internal val LocalSelectionRegistrar = compositionLocalOf<SelectionRegistrar?>()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionRegistrarImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt
similarity index 97%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionRegistrarImpl.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt
index a99995d..b18499e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionRegistrarImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImpl.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SimpleLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
similarity index 93%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SimpleLayout.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
index 4923415..206d170 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SimpleLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
index c80f96e..15064be 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION") // gestures
+
 package androidx.compose.foundation.text.selection
 
 import androidx.compose.foundation.text.TextFieldDelegate
@@ -31,13 +33,9 @@
 import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.ui.hapticfeedback.HapticFeedback
 import androidx.compose.ui.hapticfeedback.HapticFeedbackType
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.boundsInWindow
 import androidx.compose.ui.platform.ClipboardManager
 import androidx.compose.ui.platform.TextToolbar
 import androidx.compose.ui.platform.TextToolbarStatus
-import androidx.compose.ui.selection.SelectionHandle
-import androidx.compose.ui.selection.getAdjustedCoordinates
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.TextRange
@@ -627,21 +625,3 @@
 ): Boolean = state?.layoutCoordinates?.visibleBounds()?.containsInclusive(
     getHandlePosition(isStartHandle)
 ) ?: false
-
-/** Returns the boundary of the visible area in this [LayoutCoordinates]. */
-internal fun LayoutCoordinates.visibleBounds(): Rect {
-    // globalBounds is the global boundaries of this LayoutCoordinates after it's clipped by
-    // parents. We can think it as the global visible bounds of this Layout. Here globalBounds
-    // is convert to local, which is the boundary of the visible area within the LayoutCoordinates.
-    val boundsInWindow = boundsInWindow()
-    return Rect(
-        windowToLocal(boundsInWindow.topLeft),
-        windowToLocal(boundsInWindow.bottomRight)
-    )
-}
-
-/**
- * Returns true is the [offset] is contained by this [Rect]
- */
-internal fun Rect.containsInclusive(offset: Offset): Boolean =
-    offset.x in left..right && offset.y in top..bottom
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/TextSelectionColors.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt
similarity index 83%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/TextSelectionColors.kt
rename to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt
index 1c763e7..c9da65a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/TextSelectionColors.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionColors.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,17 +14,17 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.Stable
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.ui.graphics.Color
 
 /**
  * Represents the colors used for text selection by text and text field components.
  *
- * See [AmbientTextSelectionColors] to provide new values for this throughout the hierarchy.
+ * See [LocalTextSelectionColors] to provide new values for this throughout the hierarchy.
  *
  * @property handleColor the color used for the selection handles on either side of the
  * selection region.
@@ -62,10 +62,10 @@
 }
 
 /**
- * Ambient used to change the [TextSelectionColors] used by text and text field components in the
- * hierarchy.
+ * CompositionLocal used to change the [TextSelectionColors] used by text and text field
+ * components in the hierarchy.
  */
-val AmbientTextSelectionColors = ambientOf { DefaultTextSelectionColors }
+val LocalTextSelectionColors = compositionLocalOf { DefaultTextSelectionColors }
 
 /**
  * Default color used is the blue from the Compose logo, b/172679845 for context
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.kt
index f92d0f0..9f3f449 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.foundation
 
 import androidx.compose.animation.animateColorAsState
@@ -28,7 +30,7 @@
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.geometry.Offset
@@ -42,7 +44,7 @@
 import androidx.compose.ui.input.pointer.pointerMoveFilter
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.MeasuringIntrinsicsMeasureBlocks
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.constrainHeight
@@ -57,7 +59,7 @@
  * This value is typically set in some "Theme" composable function
  * (DesktopTheme, MaterialTheme)
  */
-val ScrollbarStyleAmbient = staticAmbientOf { defaultScrollbarStyle() }
+val ScrollbarStyleAmbient = staticCompositionLocalOf { defaultScrollbarStyle() }
 
 /**
  * Defines visual style of scrollbars (thickness, shapes, colors, etc).
@@ -174,7 +176,7 @@
     style: ScrollbarStyle,
     interactionState: InteractionState,
     isVertical: Boolean
-) = with(AmbientDensity.current) {
+) = with(LocalDensity.current) {
     DisposableEffect(interactionState) {
         onDispose {
             interactionState.removeInteraction(Interaction.Dragged)
@@ -305,7 +307,7 @@
     itemCount: Int,
     averageItemSize: Dp
 ): ScrollbarAdapter {
-    val averageItemSizePx = with(AmbientDensity.current) {
+    val averageItemSizePx = with(LocalDensity.current) {
         averageItemSize.toPx()
     }
     return remember(scrollState, itemCount, averageItemSizePx) {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/animation/DesktopFlingConfig.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/animation/DesktopFlingConfig.kt
index 1272c0e..a85753d 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/animation/DesktopFlingConfig.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/animation/DesktopFlingConfig.kt
@@ -19,13 +19,13 @@
 import androidx.compose.animation.core.TargetAnimation
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 
 @Composable
 internal actual fun actualFlingConfig(adjustTarget: (Float) -> TargetAnimation?): FlingConfig {
     // This function will internally update the calculation of fling decay when the density changes,
     // but the reference to the returned FlingConfig will not change across calls.
-    val density = AmbientDensity.current
+    val density = LocalDensity.current
     return remember(density.density) {
         val decayAnimation = DesktopFlingDecaySpec(density)
         FlingConfig(
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.kt
index e1d7067..69c8791 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.foundation.gestures
 
 import androidx.compose.ui.Modifier
@@ -22,7 +24,7 @@
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.input.mouse.mouseScrollFilter
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.DesktopPlatform
 import androidx.compose.ui.platform.DesktopPlatformAmbient
 import androidx.compose.ui.unit.Density
@@ -44,7 +46,7 @@
     scrollCallback: ScrollCallback,
     orientation: Orientation
 ): Modifier = composed {
-    val density = AmbientDensity.current
+    val density = LocalDensity.current
     val desktopPlatform = DesktopPlatformAmbient.current
     val config = PlatformScrollConfig(density, desktopPlatform)
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelection.kt
similarity index 85%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
rename to compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelection.kt
index e9fa62c..1c4da68 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelection.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -13,7 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package androidx.compose.ui.platform
+
+@file:Suppress("DEPRECATION")
+
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
@@ -27,9 +30,7 @@
 import androidx.compose.ui.gesture.rawDragGestureFilter
 import androidx.compose.ui.gesture.rawPressStartGestureFilter
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.selection.AmbientSelectionRegistrar
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionRegistrarImpl
+import androidx.compose.ui.platform.SelectionTrackerAmbient
 import kotlin.math.max
 
 @Composable
@@ -56,7 +57,7 @@
 }
 
 @Composable
-internal fun DesktopSelectionContainer(content: @Composable () -> Unit) {
+fun DesktopSelectionContainer(content: @Composable () -> Unit) {
     val selection = remember { mutableStateOf<Selection?>(null) }
     DesktopSelectionContainer(
         selection = selection.value,
@@ -91,7 +92,7 @@
 }
 
 @Composable
-fun DesktopSelectionContainer(
+internal fun DesktopSelectionContainer(
     selection: Selection?,
     onSelectionChange: (Selection?) -> Unit,
     content: @Composable () -> Unit
@@ -99,10 +100,10 @@
     val registrarImpl = remember { SelectionRegistrarImpl() }
     val manager = remember { DesktopSelectionManager(registrarImpl) }
 
-    val managerTracker = SelectionManagerTrackerAmbient.current
+    val selectionTracker = SelectionTrackerAmbient.current
 
     manager.onSelectionChange = {
-        managerTracker.recentManager = manager
+        selectionTracker.getSelectedText = { manager.getSelectedText() }
         onSelectionChange(it)
     }
     manager.selection = selection
@@ -116,7 +117,7 @@
         }
     }
 
-    Providers(AmbientSelectionRegistrar provides registrarImpl) {
+    Providers(LocalSelectionRegistrar provides registrarImpl) {
         Wrap(modifier) {
             content()
         }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionManager.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionManager.kt
similarity index 92%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionManager.kt
rename to compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionManager.kt
index ea143f0..3e6dfae 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionManager.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionManager.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,18 +14,16 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+@file:Suppress("DEPRECATION")
+
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.DragObserver
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.selection.Selectable
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionRegistrarImpl
-import androidx.compose.ui.selection.getCurrentSelectedText
-import androidx.compose.ui.selection.merge
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.platform.ClipboardManager
 
 @OptIn(ExperimentalTextApi::class)
 internal class DesktopSelectionManager(private val selectionRegistrar: SelectionRegistrarImpl) {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionRegistrar.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionRegistrar.kt
similarity index 92%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionRegistrar.kt
rename to compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionRegistrar.kt
index 393c831..1072d25 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionRegistrar.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionRegistrar.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,15 +14,13 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.selection.Selectable
-import androidx.compose.ui.selection.SelectionRegistrar
 import androidx.compose.ui.text.ExperimentalTextApi
 
-// based on androidx.compose.ui.selection.SelectionRegistrarImpl
+// based on androidx.compose.foundation.text.selection.SelectionRegistrarImpl
 @OptIn(ExperimentalTextApi::class)
 internal class DesktopSelectionRegistrar : SelectionRegistrar {
     internal var sorted: Boolean = false
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt
index c0ba66b..0fb20da 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt
@@ -38,8 +38,8 @@
 import androidx.compose.ui.input.pointer.PointerInputScope
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.materialize
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientViewConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
@@ -96,8 +96,8 @@
         withRunningRecomposer { recomposer ->
             compose(recomposer) {
                 Providers(
-                    AmbientDensity provides Density(1f),
-                    AmbientViewConfiguration provides TestViewConfiguration()
+                    LocalDensity provides Density(1f),
+                    LocalViewConfiguration provides TestViewConfiguration()
                 ) {
                     pointerInputFilter = currentComposer
                         .materialize(Modifier.pointerInput(gestureDetector)) as
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt
index cd6e838..a178037 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt
@@ -14,14 +14,16 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION") // LongPressDragObserver
+
 package androidx.compose.foundation.text
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.LongPressDragObserver
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.selection.Selectable
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionRegistrar
+import androidx.compose.foundation.text.selection.Selectable
+import androidx.compose.foundation.text.selection.Selection
+import androidx.compose.foundation.text.selection.SelectionRegistrar
 import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.TextDelegate
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/InlineAnswer.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/InlineAnswer.kt
similarity index 90%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/InlineAnswer.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/InlineAnswer.kt
index 2d6b068..2692681 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/InlineAnswer.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/InlineAnswer.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import org.mockito.invocation.InvocationOnMock
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/MockCoordinates.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockCoordinates.kt
similarity index 96%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/MockCoordinates.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockCoordinates.kt
index 3cc9e60..22da226 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/MockCoordinates.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockCoordinates.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.layout.AlignmentLine
 import androidx.compose.ui.geometry.Offset
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/MockSelectable.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockSelectable.kt
similarity index 94%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/MockSelectable.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockSelectable.kt
index baa520a..367453e 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/MockSelectable.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockSelectable.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
@@ -23,7 +23,7 @@
 import androidx.compose.ui.text.ExperimentalTextApi
 
 @OptIn(ExperimentalTextApi::class)
-class MockSelectable(
+internal class MockSelectable(
     var getSelectionValue: Selection? = null,
     var getHandlePositionValue: Offset = Offset.Zero,
     var getLayoutCoordinatesValue: LayoutCoordinates? = null,
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionManagerDragTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt
similarity index 98%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionManagerDragTest.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt
index d545ed7..d7f9363 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionManagerDragTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionManagerTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
similarity index 98%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionManagerTest.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
index 1e4b91a..5b79010 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionRegistrarImplTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt
similarity index 98%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionRegistrarImplTest.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt
index 22fce62..db97818 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionRegistrarImplTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrarImplTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt
similarity index 98%
rename from compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionTest.kt
rename to compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt
index 6afcab9..c913e94 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/selection/SelectionTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.selection
+package androidx.compose.foundation.text.selection
 
 import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.TextRange
diff --git a/compose/integration-tests/benchmark/build.gradle b/compose/integration-tests/benchmark/build.gradle
index e7b63d0..382dea9 100644
--- a/compose/integration-tests/benchmark/build.gradle
+++ b/compose/integration-tests/benchmark/build.gradle
@@ -29,7 +29,7 @@
     kotlinPlugin project(":compose:compiler:compiler")
 
     implementation project(":benchmark:benchmark-junit4")
-    implementation project(":benchmark:benchmark-perfetto")
+    implementation project(":benchmark:benchmark-macro-junit4")
     implementation project(":compose:foundation:foundation-layout")
     implementation project(":compose:integration-tests")
     implementation project(":compose:runtime:runtime")
diff --git a/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt b/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
index 696e0be..e552c40 100644
--- a/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
+++ b/compose/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/lazy/LazyListScrollingBenchmark.kt
@@ -243,7 +243,7 @@
                 }
             }
         ) { _, _ ->
-            val size = size.toIntPx()
+            val size = size.roundToPx()
             layout(size, size) {}
         }
     }
diff --git a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
index c5aadaf..4ae98d7 100644
--- a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
+++ b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
@@ -238,10 +238,10 @@
         if (measurable == null) {
             layout(constraints.minWidth, constraints.minHeight) { }
         } else {
-            val paddingLeft = padding.start.toIntPx()
-            val paddingTop = padding.top.toIntPx()
-            val paddingRight = padding.end.toIntPx()
-            val paddingBottom = padding.bottom.toIntPx()
+            val paddingLeft = padding.start.roundToPx()
+            val paddingTop = padding.top.roundToPx()
+            val paddingRight = padding.end.roundToPx()
+            val paddingBottom = padding.bottom.roundToPx()
             val horizontalPadding = (paddingLeft + paddingRight)
             val verticalPadding = (paddingTop + paddingBottom)
 
diff --git a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/VectorBenchmarkWithTracing.kt b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/VectorBenchmarkWithTracing.kt
index d4e1688..aed3bfc 100644
--- a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/VectorBenchmarkWithTracing.kt
+++ b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/VectorBenchmarkWithTracing.kt
@@ -16,7 +16,7 @@
 
 package androidx.ui.benchmark.test
 
-import androidx.benchmark.perfetto.PerfettoRule
+import androidx.benchmark.macro.junit4.PerfettoRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import org.junit.Rule
diff --git a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt
index 4aee2ae..e234cd3 100644
--- a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt
+++ b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/autofill/AndroidAutofillBenchmark.kt
@@ -26,8 +26,8 @@
 import androidx.compose.ui.autofill.AutofillTree
 import androidx.compose.ui.autofill.AutofillType
 import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.platform.AmbientAutofillTree
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalAutofillTree
+import androidx.compose.ui.platform.LocalView
 import androidx.test.annotation.UiThreadTest
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -55,8 +55,8 @@
     @Before
     fun setup() {
         composeTestRule.setContent {
-            autofillTree = AmbientAutofillTree.current
-            composeView = AmbientView.current
+            autofillTree = LocalAutofillTree.current
+            composeView = LocalView.current
         }
     }
 
diff --git a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/pointerinput/ComposeTapIntegrationBenchmark.kt b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/pointerinput/ComposeTapIntegrationBenchmark.kt
index f0e13d8..4b892f3 100644
--- a/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/pointerinput/ComposeTapIntegrationBenchmark.kt
+++ b/compose/integration-tests/benchmark/src/androidTest/java/androidx/ui/pointerinput/ComposeTapIntegrationBenchmark.kt
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.tapGestureFilter
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.unit.dp
 import androidx.test.annotation.UiThreadTest
@@ -93,7 +93,7 @@
 
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     itemHeightDp = ItemHeightPx.toDp()
                 }
                 App()
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 4136fb9..e5d7d45 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
@@ -50,7 +50,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
@@ -178,7 +178,7 @@
 private object AppBarIcons {
     @Composable
     fun Back(onClick: () -> Unit) {
-        val icon = when (AmbientLayoutDirection.current) {
+        val icon = when (LocalLayoutDirection.current) {
             LayoutDirection.Ltr -> Icons.Filled.ArrowBack
             LayoutDirection.Rtl -> Icons.Filled.ArrowForward
         }
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 412a4a3..4e37cde 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
@@ -26,11 +26,11 @@
 import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.integration.demos.common.Demo
-import androidx.compose.material.AmbientContentColor
-import androidx.compose.material.AmbientTextStyle
 import androidx.compose.material.Icon
 import androidx.compose.material.IconButton
 import androidx.compose.material.ListItem
+import androidx.compose.material.LocalContentColor
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
 import androidx.compose.material.TopAppBar
@@ -115,8 +115,8 @@
         modifier = modifier.focusRequester(focusRequester),
         value = filterText,
         onValueChange = onFilter,
-        textStyle = AmbientTextStyle.current,
-        cursorColor = AmbientContentColor.current
+        textStyle = LocalTextStyle.current,
+        cursorColor = LocalContentColor.current
     )
     DisposableEffect(focusRequester) {
         focusRequester.requestFocus()
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt
index 589bddd..d43c673 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt
@@ -73,9 +73,9 @@
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asImageBitmap
 import androidx.compose.ui.platform.AbstractComposeView
-import androidx.compose.ui.platform.AmbientConfiguration
-import androidx.compose.ui.platform.AmbientContext
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.dimensionResource
@@ -242,7 +242,7 @@
 private object InteropSnippet8 {
     @Composable
     fun rememberCustomView(): CustomView {
-        val context = AmbientContext.current
+        val context = LocalContext.current
         return remember { CustomView(context).apply { /*...*/ } }
     }
 }
@@ -441,7 +441,7 @@
     private object InteropSnippet1 {
         @Composable
         fun rememberCustomView(): CustomView {
-            val context = AmbientContext.current
+            val context = LocalContext.current
             return remember { CustomView(context).apply { /*...*/ } }
         }
     }
@@ -532,7 +532,7 @@
     private object InteropSnippet6 {
         @Composable
         fun MyComposable() {
-            val isPortrait = AmbientConfiguration.current.orientation == ORIENTATION_PORTRAIT
+            val isPortrait = LocalConfiguration.current.orientation == ORIENTATION_PORTRAIT
             if (isPortrait) {
                 /* Portrait-displayed content */
             } else {
@@ -675,7 +675,7 @@
             onSystemEvent: (intent: Intent?) -> Unit
         ) {
             // Grab the current context in this part of the UI tree
-            val context = AmbientContext.current
+            val context = LocalContext.current
 
             // Safely use the latest onSystemEvent lambda passed to the function
             val currentOnSystemEvent by rememberUpdatedState(onSystemEvent)
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt
index 39e8cbd..7b68eb8 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Layout.kt
@@ -275,7 +275,7 @@
         val firstBaseline = placeable[FirstBaseline]
 
         // Height of the composable with padding - first baseline
-        val placeableY = firstBaselineToTop.toIntPx() - firstBaseline
+        val placeableY = firstBaselineToTop.roundToPx() - firstBaseline
         val height = placeable.height + placeableY
         layout(placeable.width, height) {
             // Where the composable gets placed
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
index 18ac649..6dc9a73 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
@@ -32,7 +32,7 @@
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.core.app.TaskStackBuilder
 import androidx.core.net.toUri
@@ -139,7 +139,7 @@
 @Composable
 private fun NavigationSnippet10() {
     val id = "exampleId"
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val deepLinkIntent = Intent(
         Intent.ACTION_VIEW,
         "https://example.com/$id".toUri(),
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Theming.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Theming.kt
index c21ca48..0dfeb5a 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Theming.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Theming.kt
@@ -24,11 +24,11 @@
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.shape.CutCornerShape
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.AmbientContentAlpha
 import androidx.compose.material.Button
 import androidx.compose.material.ButtonDefaults
 import androidx.compose.material.Colors
 import androidx.compose.material.ContentAlpha
+import androidx.compose.material.LocalContentAlpha
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Shapes
 import androidx.compose.material.Surface
@@ -141,12 +141,12 @@
 }
 
 @Composable private fun ThemingSnippet7() {
-    // By default, both Icon & Text use the combination of AmbientContentColor &
-    // AmbientContentAlpha. De-emphasize content by setting content alpha
-    Providers(AmbientContentAlpha provides ContentAlpha.medium) {
+    // By default, both Icon & Text use the combination of LocalContentColor &
+    // LocalContentAlpha. De-emphasize content by setting content alpha
+    Providers(LocalContentAlpha provides ContentAlpha.medium) {
         Text(/*...*/)
     }
-    Providers(AmbientContentAlpha provides ContentAlpha.disabled) {
+    Providers(LocalContentAlpha provides ContentAlpha.disabled) {
         Icon(/*...*/)
         Text(/*...*/)
     }
diff --git a/compose/integration-tests/macrobenchmark/build.gradle b/compose/integration-tests/macrobenchmark/build.gradle
index 1cf4c30..a72e284 100644
--- a/compose/integration-tests/macrobenchmark/build.gradle
+++ b/compose/integration-tests/macrobenchmark/build.gradle
@@ -34,7 +34,7 @@
 
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
-    androidTestImplementation(project(":benchmark:benchmark-macro"))
+    androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/ProcessSpeedProfileValidation.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/ProcessSpeedProfileValidation.kt
index aee26dd..8f6ef50 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/ProcessSpeedProfileValidation.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/ProcessSpeedProfileValidation.kt
@@ -17,9 +17,9 @@
 package androidx.compose.integration.macrobenchmark
 
 import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.StartupTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import org.junit.Rule
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
index 34cf7f4..1a35bf5 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
@@ -16,8 +16,8 @@
 
 package androidx.compose.integration.macrobenchmark
 
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/StartupUtils.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/StartupUtils.kt
index fddc7fa..025cb84 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/StartupUtils.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/StartupUtils.kt
@@ -18,9 +18,9 @@
 
 import android.content.Intent
 import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.StartupTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 
 const val TargetPackage = "androidx.compose.integration.macrobenchmark.target"
 
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
index 0d92fdc..9ebb6ed 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
@@ -16,8 +16,8 @@
 
 package androidx.compose.integration.macrobenchmark
 
-import androidx.benchmark.macro.MacrobenchmarkRule
 import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
diff --git a/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ImageVectorTest.kt b/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ImageVectorTest.kt
index 3e0c8b2..aa37e05 100644
--- a/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ImageVectorTest.kt
+++ b/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ImageVectorTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.asAndroidBitmap
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.res.vectorResource
 import androidx.compose.ui.test.captureToImage
@@ -91,7 +91,7 @@
         val testTag = "testTag"
         var insetRectSize: Int = 0
         rule.setContent {
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 insetRectSize = (10f * this.density).roundToInt()
             }
             val imageVector =
diff --git a/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt b/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
index 3fbead4..3417cd8 100644
--- a/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
+++ b/compose/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.testutils.ComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
@@ -155,7 +155,8 @@
 
 /**
  * Test case using an immutable [TestTheme], that will cause a new value to be assigned to the
- * ambient every time we change this object, causing everything consuming this ambient to recompose.
+ * CompositionLocal every time we change this object, causing everything consuming this
+ * CompositionLocal to recompose.
  */
 private class ImmutableThemeTestCase : ThemeTestCase() {
     @Composable
@@ -172,7 +173,7 @@
     primaryTracker: CompositionTracker,
     secondaryTracker: CompositionTracker
 ) {
-    Providers(AmbientTestTheme provides theme) {
+    Providers(LocalTestTheme provides theme) {
         CheapPrimaryColorConsumer(primaryTracker)
         ExpensiveSecondaryColorConsumer(secondaryTracker)
         CheapPrimaryColorConsumer(primaryTracker)
@@ -181,7 +182,7 @@
 
 @Composable
 private fun CheapPrimaryColorConsumer(compositionTracker: CompositionTracker) {
-    val primary = AmbientTestTheme.current.primary
+    val primary = LocalTestTheme.current.primary
     // Consume color variable to avoid any optimizations
     println("Color $primary")
     compositionTracker.compositions++
@@ -189,7 +190,7 @@
 
 @Composable
 private fun ExpensiveSecondaryColorConsumer(compositionTracker: CompositionTracker) {
-    val secondary = AmbientTestTheme.current.secondary
+    val secondary = LocalTestTheme.current.secondary
     // simulate some (relatively) expensive work
     Thread.sleep(1)
     // Consume color variable to avoid any optimizations
@@ -198,10 +199,10 @@
 }
 
 /**
- * Immutable as we want to ensure that we always skip recomposition unless the ambient value
- * inside the function changes.
+ * Immutable as we want to ensure that we always skip recomposition unless the CompositionLocal
+ * value inside the function changes.
  */
 @Immutable
 private class CompositionTracker(var compositions: Int = 0)
 
-private val AmbientTestTheme = staticAmbientOf<TestTheme>()
\ No newline at end of file
+private val LocalTestTheme = staticCompositionLocalOf<TestTheme>()
\ No newline at end of file
diff --git a/compose/integration-tests/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt b/compose/integration-tests/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt
index 330eb94..ee62674 100644
--- a/compose/integration-tests/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt
+++ b/compose/integration-tests/src/main/java/androidx/ui/integration/test/foundation/NestedScrollerTestCase.kt
@@ -38,7 +38,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import kotlinx.coroutines.runBlocking
 import kotlin.random.Random
 
@@ -72,7 +72,7 @@
         val playStoreColor = Color(red = 0x00, green = 0x00, blue = 0x80)
         val content: @Composable RowScope.() -> Unit = {
             repeat(6) {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Column(Modifier.fillMaxHeight()) {
                         val color = remember {
                             val red = Random.nextInt(256)
diff --git a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt
index 7ad8cb3..231031d 100644
--- a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt
+++ b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt
@@ -34,8 +34,8 @@
 import androidx.compose.ui.graphics.vector.VectorGroup
 import androidx.compose.ui.graphics.vector.VectorPath
 import androidx.compose.ui.graphics.vector.rememberVectorPainter
-import androidx.compose.ui.platform.AmbientContext
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.res.vectorResource
@@ -207,7 +207,7 @@
  */
 @Composable
 private fun String.toImageVector(): ImageVector {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val resId = context.resources.getIdentifier(this, "drawable", context.packageName)
     return vectorResource(resId)
 }
@@ -281,7 +281,7 @@
         // against in CI, on some devices using DP here causes there to be anti-aliasing issues.
         // Using ipx directly ensures that we will always have a consistent layout / drawing
         // story, so anti-aliasing should be identical.
-        val layoutSize = with(AmbientDensity.current) {
+        val layoutSize = with(LocalDensity.current) {
             Modifier.preferredSize(72.toDp())
         }
         Row(Modifier.align(Alignment.Center)) {
diff --git a/compose/material/material-ripple/api/current.txt b/compose/material/material-ripple/api/current.txt
index a56a57c..8c398f6 100644
--- a/compose/material/material-ripple/api/current.txt
+++ b/compose/material/material-ripple/api/current.txt
@@ -27,7 +27,8 @@
   }
 
   public final class RippleThemeKt {
-    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.material.ripple.RippleTheme> getAmbientRippleTheme();
+    method @Deprecated @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getAmbientRippleTheme();
+    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
 }
diff --git a/compose/material/material-ripple/api/public_plus_experimental_current.txt b/compose/material/material-ripple/api/public_plus_experimental_current.txt
index a56a57c..8c398f6 100644
--- a/compose/material/material-ripple/api/public_plus_experimental_current.txt
+++ b/compose/material/material-ripple/api/public_plus_experimental_current.txt
@@ -27,7 +27,8 @@
   }
 
   public final class RippleThemeKt {
-    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.material.ripple.RippleTheme> getAmbientRippleTheme();
+    method @Deprecated @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getAmbientRippleTheme();
+    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
 }
diff --git a/compose/material/material-ripple/api/restricted_current.txt b/compose/material/material-ripple/api/restricted_current.txt
index a56a57c..8c398f6 100644
--- a/compose/material/material-ripple/api/restricted_current.txt
+++ b/compose/material/material-ripple/api/restricted_current.txt
@@ -27,7 +27,8 @@
   }
 
   public final class RippleThemeKt {
-    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.material.ripple.RippleTheme> getAmbientRippleTheme();
+    method @Deprecated @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getAmbientRippleTheme();
+    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
 }
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
index 37928a0..82c2e09 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
@@ -58,7 +58,7 @@
  * If you are using MaterialTheme in your hierarchy, a Ripple will be used as the default
  * [Indication] inside components such as [androidx.compose.foundation.clickable] and
  * [androidx.compose.foundation.indication]. You can also manually provide Ripples through
- * [androidx.compose.foundation.AmbientIndication] for the same effect if you are not using
+ * [androidx.compose.foundation.LocalIndication] for the same effect if you are not using
  * MaterialTheme.
  *
  * You can also explicitly create a Ripple and provide it to components in order to change the
@@ -81,7 +81,7 @@
     radius: Dp = Dp.Unspecified,
     color: Color = Color.Unspecified
 ): Indication {
-    val theme = AmbientRippleTheme.current
+    val theme = LocalRippleTheme.current
     val scope = rememberCoroutineScope()
     val resolvedColor = color.takeOrElse { theme.defaultColor() }
     val colorState = remember { mutableStateOf(resolvedColor, structuralEqualityPolicy()) }
@@ -103,7 +103,7 @@
  * If you are using MaterialTheme in your hierarchy, a Ripple will be used as the default
  * [Indication] inside components such as [androidx.compose.foundation.clickable] and
  * [androidx.compose.foundation.indication]. You can also manually provide Ripples through
- * [androidx.compose.foundation.AmbientIndication] for the same effect if you are not using
+ * [androidx.compose.foundation.LocalIndication] for the same effect if you are not using
  * MaterialTheme.
  *
  * You can also explicitly create a Ripple and provide it to components in order to change the
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt
index 3688864..e0b0f51 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/RippleTheme.kt
@@ -19,14 +19,14 @@
 import androidx.compose.foundation.Interaction
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.ProvidableAmbient
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.ProvidableCompositionLocal
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.luminance
 
 /**
  * Defines the appearance for Ripples. You can define a new theme and apply it using
- * [AmbientRippleTheme]. See [defaultRippleColor] and [defaultRippleAlpha] for default values
+ * [LocalRippleTheme]. See [defaultRippleColor] and [defaultRippleAlpha] for default values
  * that can be used when creating your own [RippleTheme].
  *
  * @see rememberRipple
@@ -114,14 +114,32 @@
 }
 
 /**
- * Ambient used for providing [RippleTheme] down the tree.
+ * CompositionLocal used for providing [RippleTheme] down the tree.
  *
  * See [RippleTheme.defaultRippleColor] and [RippleTheme.defaultRippleAlpha] functions for the
  * default implementations for color and alpha.
  */
 @get:ExperimentalRippleApi
 @ExperimentalRippleApi
-public val AmbientRippleTheme: ProvidableAmbient<RippleTheme> = staticAmbientOf { DebugRippleTheme }
+@Deprecated(
+    "Renamed to LocalRippleTheme",
+    replaceWith = ReplaceWith(
+        "LocalRippleTheme",
+        "androidx.compose.material.ripple.LocalRippleTheme"
+    )
+)
+public val AmbientRippleTheme: ProvidableCompositionLocal<RippleTheme> get() = LocalRippleTheme
+
+/**
+ * CompositionLocal used for providing [RippleTheme] down the tree.
+ *
+ * See [RippleTheme.defaultRippleColor] and [RippleTheme.defaultRippleAlpha] functions for the
+ * default implementations for color and alpha.
+ */
+@get:ExperimentalRippleApi
+@ExperimentalRippleApi
+public val LocalRippleTheme: ProvidableCompositionLocal<RippleTheme> =
+    staticCompositionLocalOf { DebugRippleTheme }
 
 @Suppress("unused")
 @OptIn(ExperimentalRippleApi::class)
diff --git a/compose/material/material/api/current.txt b/compose/material/material/api/current.txt
index c46ac2a..1fbe055 100644
--- a/compose/material/material/api/current.txt
+++ b/compose/material/material/api/current.txt
@@ -234,11 +234,13 @@
   }
 
   public final class ContentAlphaKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.lang.Float> getAmbientContentAlpha();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float>! getAmbientContentAlpha();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
   }
 
   public final class ContentColorKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.graphics.Color> getAmbientContentColor();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color>! getAmbientContentColor();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
   }
 
   public enum DismissDirection {
@@ -314,7 +316,8 @@
 
   public final class ElevationKt {
     method public static suspend Object? animateElevation-_EXKJ8o(androidx.compose.animation.core.Animatable<androidx.compose.ui.unit.Dp,?>, optional androidx.compose.foundation.Interaction? from, optional androidx.compose.foundation.Interaction? to, float target, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.Dp> getAmbientAbsoluteElevation();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp>! getAmbientAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
   }
 
   public interface ElevationOverlay {
@@ -322,7 +325,8 @@
   }
 
   public final class ElevationOverlayKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.material.ElevationOverlay> getAmbientElevationOverlay();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getAmbientElevationOverlay();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
@@ -391,7 +395,7 @@
   }
 
   public final class MenuKt {
-    method @androidx.compose.runtime.Composable public static void DropdownMenu-k5nJks8(kotlin.jvm.functions.Function0<kotlin.Unit> toggle, boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier toggleModifier, optional long dropdownOffset, optional androidx.compose.ui.Modifier dropdownModifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> dropdownContent);
+    method @androidx.compose.runtime.Composable public static void DropdownMenu-YJGdngw(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.InteractionState interactionState, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
@@ -410,6 +414,8 @@
 
   @androidx.compose.material.ExperimentalMaterialApi public final class ModalBottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.ModalBottomSheetValue> {
     ctor public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, androidx.compose.animation.core.AnimationClockObservable clock, androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public void expand(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onExpand);
+    method public void halfExpand(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onHalfExpand);
     method public void hide(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onHidden);
     method public boolean isVisible();
     method public void show(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onShown);
@@ -701,7 +707,8 @@
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text-TPAwlIA(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional androidx.compose.ui.text.style.TextOverflow overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
     method @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional androidx.compose.ui.text.style.TextOverflow overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.text.TextStyle> getAmbientTextStyle();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle>! getAmbientTextStyle();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
   }
 
   @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
diff --git a/compose/material/material/api/public_plus_experimental_current.txt b/compose/material/material/api/public_plus_experimental_current.txt
index c46ac2a..1fbe055 100644
--- a/compose/material/material/api/public_plus_experimental_current.txt
+++ b/compose/material/material/api/public_plus_experimental_current.txt
@@ -234,11 +234,13 @@
   }
 
   public final class ContentAlphaKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.lang.Float> getAmbientContentAlpha();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float>! getAmbientContentAlpha();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
   }
 
   public final class ContentColorKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.graphics.Color> getAmbientContentColor();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color>! getAmbientContentColor();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
   }
 
   public enum DismissDirection {
@@ -314,7 +316,8 @@
 
   public final class ElevationKt {
     method public static suspend Object? animateElevation-_EXKJ8o(androidx.compose.animation.core.Animatable<androidx.compose.ui.unit.Dp,?>, optional androidx.compose.foundation.Interaction? from, optional androidx.compose.foundation.Interaction? to, float target, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.Dp> getAmbientAbsoluteElevation();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp>! getAmbientAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
   }
 
   public interface ElevationOverlay {
@@ -322,7 +325,8 @@
   }
 
   public final class ElevationOverlayKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.material.ElevationOverlay> getAmbientElevationOverlay();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getAmbientElevationOverlay();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
@@ -391,7 +395,7 @@
   }
 
   public final class MenuKt {
-    method @androidx.compose.runtime.Composable public static void DropdownMenu-k5nJks8(kotlin.jvm.functions.Function0<kotlin.Unit> toggle, boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier toggleModifier, optional long dropdownOffset, optional androidx.compose.ui.Modifier dropdownModifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> dropdownContent);
+    method @androidx.compose.runtime.Composable public static void DropdownMenu-YJGdngw(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.InteractionState interactionState, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
@@ -410,6 +414,8 @@
 
   @androidx.compose.material.ExperimentalMaterialApi public final class ModalBottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.ModalBottomSheetValue> {
     ctor public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, androidx.compose.animation.core.AnimationClockObservable clock, androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public void expand(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onExpand);
+    method public void halfExpand(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onHalfExpand);
     method public void hide(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onHidden);
     method public boolean isVisible();
     method public void show(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onShown);
@@ -701,7 +707,8 @@
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text-TPAwlIA(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional androidx.compose.ui.text.style.TextOverflow overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
     method @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional androidx.compose.ui.text.style.TextOverflow overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.text.TextStyle> getAmbientTextStyle();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle>! getAmbientTextStyle();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
   }
 
   @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
diff --git a/compose/material/material/api/restricted_current.txt b/compose/material/material/api/restricted_current.txt
index c46ac2a..1fbe055 100644
--- a/compose/material/material/api/restricted_current.txt
+++ b/compose/material/material/api/restricted_current.txt
@@ -234,11 +234,13 @@
   }
 
   public final class ContentAlphaKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.lang.Float> getAmbientContentAlpha();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float>! getAmbientContentAlpha();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
   }
 
   public final class ContentColorKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.graphics.Color> getAmbientContentColor();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color>! getAmbientContentColor();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
   }
 
   public enum DismissDirection {
@@ -314,7 +316,8 @@
 
   public final class ElevationKt {
     method public static suspend Object? animateElevation-_EXKJ8o(androidx.compose.animation.core.Animatable<androidx.compose.ui.unit.Dp,?>, optional androidx.compose.foundation.Interaction? from, optional androidx.compose.foundation.Interaction? to, float target, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.Dp> getAmbientAbsoluteElevation();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp>! getAmbientAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
   }
 
   public interface ElevationOverlay {
@@ -322,7 +325,8 @@
   }
 
   public final class ElevationOverlayKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.material.ElevationOverlay> getAmbientElevationOverlay();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getAmbientElevationOverlay();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
@@ -391,7 +395,7 @@
   }
 
   public final class MenuKt {
-    method @androidx.compose.runtime.Composable public static void DropdownMenu-k5nJks8(kotlin.jvm.functions.Function0<kotlin.Unit> toggle, boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier toggleModifier, optional long dropdownOffset, optional androidx.compose.ui.Modifier dropdownModifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> dropdownContent);
+    method @androidx.compose.runtime.Composable public static void DropdownMenu-YJGdngw(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.InteractionState interactionState, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
@@ -410,6 +414,8 @@
 
   @androidx.compose.material.ExperimentalMaterialApi public final class ModalBottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.ModalBottomSheetValue> {
     ctor public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, androidx.compose.animation.core.AnimationClockObservable clock, androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public void expand(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onExpand);
+    method public void halfExpand(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onHalfExpand);
     method public void hide(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onHidden);
     method public boolean isVisible();
     method public void show(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onShown);
@@ -701,7 +707,8 @@
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text-TPAwlIA(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional androidx.compose.ui.text.style.TextOverflow overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
     method @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional androidx.compose.ui.text.style.TextOverflow overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.text.TextStyle> getAmbientTextStyle();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle>! getAmbientTextStyle();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
   }
 
   @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
index 91d0050..db9ea13 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
@@ -24,6 +24,7 @@
 import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectDragGestures
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.Column
@@ -39,7 +40,7 @@
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.foundation.shape.GenericShape
-import androidx.compose.material.AmbientTextStyle
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.material.TopAppBar
@@ -54,8 +55,6 @@
 import androidx.compose.ui.geometry.CornerRadius
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.RoundRect
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ImageBitmap
@@ -65,7 +64,8 @@
 import androidx.compose.ui.graphics.isSpecified
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.graphics.toPixelMap
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -99,9 +99,10 @@
         val colorWheel = remember(diameter) { ColorWheel(diameter) }
 
         var isDragging by remember { mutableStateOf(false) }
-        val inputModifier = Modifier.simplePointerInput(
-            position = position,
-            onPositionChange = { newPosition ->
+        val inputModifier = Modifier.pointerInput {
+            detectDragGestures { change, _ ->
+                isDragging = true
+                val newPosition = change.position
                 // Work out if the new position is inside the circle we are drawing, and has a
                 // valid color associated to it. If not, keep the current position
                 val newColor = colorWheel.colorForPosition(newPosition)
@@ -109,9 +110,8 @@
                     position = newPosition
                     onColorChange(newColor)
                 }
-            },
-            onDragStateChange = { isDragging = it }
-        )
+            }
+        }
 
         Box(Modifier.fillMaxSize()) {
             Image(modifier = inputModifier, contentDescription = null, bitmap = colorWheel.image)
@@ -123,49 +123,12 @@
     }
 }
 
-// TODO: b/152046065 dragging has the wrong semantics here, and it's possible to continue dragging
-// outside the bounds of the layout. Use a higher level, simple input wrapper when it's available
-// to just get the current position of the pointer, without needing to care about drag behavior /
-// relative positions.
-/**
- * [dragGestureFilter] that only cares about raw positions, where [position] is the position of
- * the current / last input event, [onPositionChange] is called with the new position when the
- * pointer moves, and [onDragStateChange] is called when dragging starts / stops.
- */
-private fun Modifier.simplePointerInput(
-    position: Offset,
-    onPositionChange: (Offset) -> Unit,
-    onDragStateChange: (Boolean) -> Unit
-): Modifier {
-    val observer = object : DragObserver {
-        override fun onStart(downPosition: Offset) {
-            onDragStateChange(true)
-            onPositionChange(downPosition)
-        }
-
-        override fun onDrag(dragDistance: Offset): Offset {
-            onPositionChange(position + dragDistance)
-            return dragDistance
-        }
-
-        override fun onCancel() {
-            onDragStateChange(false)
-        }
-
-        override fun onStop(velocity: Offset) {
-            onDragStateChange(false)
-        }
-    }
-
-    return dragGestureFilter(observer, startDragImmediately = true)
-}
-
 /**
  * Magnifier displayed on top of [position] with the currently selected [color].
  */
 @Composable
 private fun Magnifier(visible: Boolean, position: Offset, color: Color) {
-    val offset = with(AmbientDensity.current) {
+    val offset = with(LocalDensity.current) {
         Modifier.offset(
             position.x.toDp() - MagnifierWidth / 2,
             // Align with the center of the selection circle
@@ -244,7 +207,7 @@
             Box(Modifier.weight(0.25f).fillMaxHeight().background(color))
             // Add `#` and drop alpha characters
             val text = "#" + Integer.toHexString(color.toArgb()).toUpperCase(Locale.ROOT).drop(2)
-            val textStyle = AmbientTextStyle.current.copy(textAlign = TextAlign.Center)
+            val textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center)
             Text(
                 text = text,
                 modifier = Modifier.weight(0.75f).padding(top = 10.dp, bottom = 20.dp),
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
index eee99c4..caf5517 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
@@ -76,21 +76,19 @@
 
     var expanded by remember { mutableStateOf(false) }
 
-    val iconButton = @Composable {
+    Box(modifier) {
         IconButton(onClick = { expanded = true }) {
             Icon(Icons.Default.MoreVert, null)
         }
-    }
-    DropdownMenu(
-        expanded = expanded,
-        onDismissRequest = { expanded = false },
-        toggle = iconButton,
-        dropdownOffset = DpOffset(24.dp, 0.dp),
-        toggleModifier = modifier
-    ) {
-        options.forEach {
-            DropdownMenuItem(onClick = {}) {
-                Text(it)
+        DropdownMenu(
+            expanded = expanded,
+            onDismissRequest = { expanded = false },
+            offset = DpOffset(24.dp, 0.dp),
+        ) {
+            options.forEach {
+                DropdownMenuItem(onClick = {}) {
+                    Text(it)
+                }
             }
         }
     }
diff --git a/compose/material/material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyAnimatedCircle.kt b/compose/material/material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyAnimatedCircle.kt
index 585e9d5..4fe42e6 100644
--- a/compose/material/material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyAnimatedCircle.kt
+++ b/compose/material/material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyAnimatedCircle.kt
@@ -32,7 +32,7 @@
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
 private const val DividerLengthInDegrees = 1.8f
@@ -45,7 +45,7 @@
     proportions: List<Float>,
     colors: List<Color>
 ) {
-    val stroke = Stroke(5.dp.value * AmbientDensity.current.density)
+    val stroke = Stroke(5.dp.value * LocalDensity.current.density)
     // Start animating when added to the tree
     val states = remember { MutableTransitionState(0).apply { targetState = 1 } }
     val transition = updateTransition(states)
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ContentAlphaSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ContentAlphaSamples.kt
index cfc3ef12..b9a4d1c 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ContentAlphaSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ContentAlphaSamples.kt
@@ -18,8 +18,8 @@
 
 import androidx.annotation.Sampled
 import androidx.compose.foundation.layout.Column
-import androidx.compose.material.AmbientContentAlpha
 import androidx.compose.material.ContentAlpha
+import androidx.compose.material.LocalContentAlpha
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
@@ -34,16 +34,16 @@
             "No content alpha applied - uses the default content alpha set by MaterialTheme - " +
                 "87% alpha"
         )
-        Providers(AmbientContentAlpha provides 1.00f) {
+        Providers(LocalContentAlpha provides 1.00f) {
             Text("1.00f alpha applied - 100% alpha")
         }
-        Providers(AmbientContentAlpha provides ContentAlpha.high) {
+        Providers(LocalContentAlpha provides ContentAlpha.high) {
             Text("High content alpha applied - 87% alpha")
         }
-        Providers(AmbientContentAlpha provides ContentAlpha.medium) {
+        Providers(LocalContentAlpha provides ContentAlpha.medium) {
             Text("Medium content alpha applied - 60% alpha")
         }
-        Providers(AmbientContentAlpha provides ContentAlpha.disabled) {
+        Providers(LocalContentAlpha provides ContentAlpha.disabled) {
             Text("Disabled content alpha applied - 38% alpha")
         }
     }
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ElevationSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ElevationSamples.kt
index 6b0bb22..066fa1c 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ElevationSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ElevationSamples.kt
@@ -17,7 +17,7 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.material.AmbientAbsoluteElevation
+import androidx.compose.material.LocalAbsoluteElevation
 import androidx.compose.material.Surface
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.unit.dp
@@ -28,10 +28,10 @@
 fun AbsoluteElevationSample() {
     Surface(elevation = 4.dp) {
         // This will equal 4.dp
-        val elevation = AmbientAbsoluteElevation.current
+        val elevation = LocalAbsoluteElevation.current
         Surface(elevation = 2.dp) {
             // This will equal 6.dp (4 + 2)
-            val elevation = AmbientAbsoluteElevation.current
+            val elevation = LocalAbsoluteElevation.current
         }
     }
 }
\ No newline at end of file
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
index 61a4171..a181467 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
@@ -21,12 +21,12 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.selection.toggleable
-import androidx.compose.material.AmbientContentColor
 import androidx.compose.material.Checkbox
 import androidx.compose.material.Divider
 import androidx.compose.material.ExperimentalMaterialApi
 import androidx.compose.material.Icon
 import androidx.compose.material.ListItem
+import androidx.compose.material.LocalContentColor
 import androidx.compose.material.Switch
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
@@ -105,7 +105,7 @@
                 Image(
                     icon24x24,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -116,7 +116,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -127,7 +127,7 @@
                 Image(
                     icon56x56,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -138,7 +138,7 @@
                 Image(
                     icon56x56,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             },
             modifier = Modifier.clickable { }
@@ -155,7 +155,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             },
             trailing = { Icon(vectorIcon, contentDescription = "Localized description") }
@@ -186,7 +186,7 @@
                 Image(
                     icon24x24,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -198,7 +198,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -211,7 +211,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -254,7 +254,7 @@
                 Image(
                     icon24x24,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -294,7 +294,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -305,7 +305,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -316,7 +316,7 @@
                 Image(
                     icon24x24,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -350,7 +350,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
@@ -362,7 +362,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             },
             modifier = Modifier.clickable { }
@@ -400,7 +400,7 @@
                 Image(
                     icon40x40,
                     contentDescription = null,
-                    colorFilter = ColorFilter.tint(AmbientContentColor.current)
+                    colorFilter = ColorFilter.tint(LocalContentColor.current)
                 )
             }
         )
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
index 433bfbc..bf6f420 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
@@ -17,6 +17,7 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.material.Divider
@@ -40,26 +41,24 @@
 fun MenuSample() {
     var expanded by remember { mutableStateOf(false) }
 
-    val iconButton = @Composable {
+    Box(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)) {
         IconButton(onClick = { expanded = true }) {
             Icon(Icons.Default.MoreVert, contentDescription = "Localized description")
         }
-    }
-    DropdownMenu(
-        expanded = expanded,
-        onDismissRequest = { expanded = false },
-        toggle = iconButton,
-        toggleModifier = Modifier.fillMaxSize().wrapContentSize(Alignment.TopStart)
-    ) {
-        DropdownMenuItem(onClick = { /* Handle refresh! */ }) {
-            Text("Refresh")
-        }
-        DropdownMenuItem(onClick = { /* Handle settings! */ }) {
-            Text("Settings")
-        }
-        Divider()
-        DropdownMenuItem(onClick = { /* Handle send feedback! */ }) {
-            Text("Send Feedback")
+        DropdownMenu(
+            expanded = expanded,
+            onDismissRequest = { expanded = false }
+        ) {
+            DropdownMenuItem(onClick = { /* Handle refresh! */ }) {
+                Text("Refresh")
+            }
+            DropdownMenuItem(onClick = { /* Handle settings! */ }) {
+                Text("Settings")
+            }
+            Divider()
+            DropdownMenuItem(onClick = { /* Handle send feedback! */ }) {
+                Text("Send Feedback")
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt
index 1ca2897..f00c727 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/SwipeableSamples.kt
@@ -32,7 +32,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -48,7 +48,7 @@
     val squareSize = 50.dp
 
     val swipeableState = rememberSwipeableState("A")
-    val sizePx = with(AmbientDensity.current) { (width - squareSize).toPx() }
+    val sizePx = with(LocalDensity.current) { (width - squareSize).toPx() }
     val anchors = mapOf(0f to "A", sizePx / 2 to "B", sizePx to "C")
 
     Box(
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AlertDialogTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AlertDialogTest.kt
index 375d93d..5ef6c01 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AlertDialogTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AlertDialogTest.kt
@@ -51,7 +51,7 @@
                 onDismissRequest = {},
                 modifier = Modifier.border(10.dp, Color.Blue),
                 text = {
-                    contentColor = AmbientContentColor.current
+                    contentColor = LocalContentColor.current
                     Text("Text")
                 },
                 confirmButton = {},
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt
index 39baeaf..993d1b3 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt
@@ -153,7 +153,7 @@
                 TopAppBar(
                     title = {
                         Text("App Bar Title")
-                        textStyle = AmbientTextStyle.current
+                        textStyle = LocalTextStyle.current
                         h6Style = MaterialTheme.typography.h6
                     }
                 )
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt
index 16bd4c2..7e7edbf 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BackdropScaffoldTest.kt
@@ -27,11 +27,16 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onParent
 import androidx.compose.ui.test.performGesture
+import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.test.swipeDown
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -86,6 +91,32 @@
     }
 
     @Test
+    @LargeTest
+    fun backdropScaffold_testCollapseAction_whenConcealed() {
+        val scaffoldState = BackdropScaffoldState(Concealed, clock = clock)
+        rule.setContent {
+            BackdropScaffold(
+                scaffoldState = scaffoldState,
+                peekHeight = peekHeight,
+                headerHeight = headerHeight,
+                appBar = { Box(Modifier.preferredHeight(peekHeight)) },
+                backLayerContent = { Box(Modifier.preferredHeight(contentHeight)) },
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
+            )
+        }
+
+        rule.onNodeWithTag(frontLayer).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
+            .performSemanticsAction(SemanticsActions.Collapse)
+
+        advanceClock()
+
+        rule.onNodeWithTag(frontLayer)
+            .assertTopPositionInRootIsEqualTo(peekHeight + contentHeight)
+    }
+
+    @Test
     fun backdropScaffold_testOffset_whenRevealed() {
         rule.setContent {
             BackdropScaffold(
@@ -103,6 +134,32 @@
     }
 
     @Test
+    @LargeTest
+    fun backdropScaffold_testExpandAction_whenRevealed() {
+        val scaffoldState = BackdropScaffoldState(Revealed, clock = clock)
+        rule.setContent {
+            BackdropScaffold(
+                scaffoldState = scaffoldState,
+                peekHeight = peekHeight,
+                headerHeight = headerHeight,
+                appBar = { Box(Modifier.preferredHeight(peekHeight)) },
+                backLayerContent = { Box(Modifier.preferredHeight(contentHeight)) },
+                frontLayerContent = { Box(Modifier.fillMaxSize().testTag(frontLayer)) }
+            )
+        }
+
+        rule.onNodeWithTag(frontLayer).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
+            .performSemanticsAction(SemanticsActions.Expand)
+
+        advanceClock()
+
+        rule.onNodeWithTag(frontLayer)
+            .assertTopPositionInRootIsEqualTo(peekHeight)
+    }
+
+    @Test
     fun backdropScaffold_testOffset_whenRevealed_backContentTooLarge() {
         rule.setContent {
             BackdropScaffold(
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationTest.kt
index bb53b5a..f1d3fec 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationTest.kt
@@ -156,7 +156,7 @@
             val totalWidth = parentCoords.size.width
 
             val expectedItemWidth = totalWidth / 4
-            val expectedItemHeight = 56.dp.toIntPx()
+            val expectedItemHeight = 56.dp.roundToPx()
 
             Truth.assertThat(itemCoords.size).isEqualTo(4)
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
index 9cc7ffc..31e8240 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
@@ -37,12 +37,17 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
 import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onParent
 import androidx.compose.ui.test.performGesture
+import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.test.swipeDown
 import androidx.compose.ui.test.swipeUp
 import androidx.compose.ui.unit.IntSize
@@ -120,6 +125,60 @@
     }
 
     @Test
+    fun bottomSheetScaffold_testExpandAction_whenCollapsed() {
+        val bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed, clock = clock)
+        rule.setContent {
+            BottomSheetScaffold(
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
+                sheetContent = {
+                    Box(Modifier.fillMaxWidth().height(300.dp).testTag(sheetContent))
+                },
+                sheetPeekHeight = peekHeight
+            ) {
+                Text("Content")
+            }
+        }
+
+        rule.onNodeWithTag(sheetContent).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
+            .performSemanticsAction(SemanticsActions.Expand)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetContent)
+            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - 300.dp)
+    }
+
+    @Test
+    fun bottomSheetScaffold_testCollapseAction_whenExpanded() {
+        val bottomSheetState = BottomSheetState(BottomSheetValue.Expanded, clock = clock)
+        rule.setContent {
+            BottomSheetScaffold(
+                scaffoldState =
+                    rememberBottomSheetScaffoldState(bottomSheetState = bottomSheetState),
+                sheetContent = {
+                    Box(Modifier.fillMaxWidth().height(300.dp).testTag(sheetContent))
+                },
+                sheetPeekHeight = peekHeight
+            ) {
+                Text("Content")
+            }
+        }
+
+        rule.onNodeWithTag(sheetContent).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
+            .performSemanticsAction(SemanticsActions.Collapse)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetContent)
+            .assertTopPositionInRootIsEqualTo(rule.rootHeight() - peekHeight)
+    }
+
+    @Test
     fun backdropScaffold_revealAndConceal_manually() {
         val bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed, clock = clock)
         rule.setContent {
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
index 9deab151..fa7b688 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
@@ -235,7 +235,7 @@
     fun containedButtonPropagateDefaultTextStyle() {
         rule.setMaterialContent {
             Button(onClick = {}) {
-                assertThat(AmbientTextStyle.current).isEqualTo(MaterialTheme.typography.button)
+                assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.button)
             }
         }
     }
@@ -244,7 +244,7 @@
     fun outlinedButtonPropagateDefaultTextStyle() {
         rule.setMaterialContent {
             OutlinedButton(onClick = {}) {
-                assertThat(AmbientTextStyle.current).isEqualTo(MaterialTheme.typography.button)
+                assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.button)
             }
         }
     }
@@ -253,7 +253,7 @@
     fun textButtonPropagateDefaultTextStyle() {
         rule.setMaterialContent {
             TextButton(onClick = {}) {
-                assertThat(AmbientTextStyle.current).isEqualTo(MaterialTheme.typography.button)
+                assertThat(LocalTextStyle.current).isEqualTo(MaterialTheme.typography.button)
             }
         }
     }
@@ -289,7 +289,7 @@
         rule.setMaterialContent {
             surface = MaterialTheme.colors.surface
             primary = MaterialTheme.colors.primary
-            Providers(AmbientShapes provides Shapes(small = shape)) {
+            Providers(LocalShapes provides Shapes(small = shape)) {
                 Button(modifier = Modifier.testTag("myButton"), onClick = {}, elevation = null) {
                     Box(Modifier.preferredSize(10.dp, 10.dp))
                 }
@@ -314,7 +314,7 @@
         rule.setMaterialContent {
             onPrimary = MaterialTheme.colors.onPrimary
             Button(onClick = {}) {
-                content = AmbientContentColor.current
+                content = LocalContentColor.current
             }
         }
 
@@ -328,7 +328,7 @@
         rule.setMaterialContent {
             primary = MaterialTheme.colors.primary
             OutlinedButton(onClick = {}) {
-                content = AmbientContentColor.current
+                content = LocalContentColor.current
             }
         }
 
@@ -342,7 +342,7 @@
         rule.setMaterialContent {
             primary = MaterialTheme.colors.primary
             TextButton(onClick = {}) {
-                content = AmbientContentColor.current
+                content = LocalContentColor.current
             }
         }
 
@@ -485,7 +485,7 @@
             onSurface = MaterialTheme.colors.onSurface
             disabledAlpha = ContentAlpha.disabled
             Button(onClick = {}, enabled = false) {
-                content = AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
+                content = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
             }
         }
 
@@ -501,7 +501,7 @@
             onSurface = MaterialTheme.colors.onSurface
             disabledAlpha = ContentAlpha.disabled
             OutlinedButton(onClick = {}, enabled = false) {
-                content = AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
+                content = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
             }
         }
 
@@ -517,7 +517,7 @@
             onSurface = MaterialTheme.colors.onSurface
             disabledAlpha = ContentAlpha.disabled
             TextButton(onClick = {}, enabled = false) {
-                content = AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
+                content = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
             }
         }
 
@@ -545,8 +545,8 @@
             assertThat(contentBounds.width).isLessThan(buttonBounds.width)
             assertThat(contentBounds.height).isLessThan(buttonBounds.height)
             with(rule.density) {
-                assertThat(contentBounds.width).isEqualTo(2.dp.toIntPx().toFloat())
-                assertThat(contentBounds.height).isEqualTo(2.dp.toIntPx().toFloat())
+                assertThat(contentBounds.width).isEqualTo(2.dp.roundToPx().toFloat())
+                assertThat(contentBounds.height).isEqualTo(2.dp.roundToPx().toFloat())
             }
             assertWithinOnePixel(buttonBounds.center, contentBounds.center)
         }
@@ -650,7 +650,7 @@
             val topLeft = childCoordinates!!.localToWindow(Offset.Zero).x -
                 parentCoordinates!!.localToWindow(Offset.Zero).x
             val currentPadding = with(rule.density) {
-                padding.toIntPx().toFloat()
+                padding.roundToPx().toFloat()
             }
             assertThat(currentPadding).isEqualTo(topLeft)
         }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
index 113d69e..bc3836c 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
@@ -56,7 +56,7 @@
             Surface(color = background) {
                 Box {
                     cardColor = MaterialTheme.colors.surface
-                    Providers(AmbientShapes provides Shapes(medium = shape)) {
+                    Providers(LocalShapes provides Shapes(medium = shape)) {
                         Card(
                             modifier = Modifier
                                 .semantics(mergeDescendants = true) {}
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ContentAlphaTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ContentAlphaTest.kt
index e6fbd29..f9b5fb2 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ContentAlphaTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ContentAlphaTest.kt
@@ -57,7 +57,7 @@
                 Surface {
                     val onSurface = MaterialTheme.colors.onSurface
 
-                    assertThat(AmbientContentColor.current).isEqualTo(onSurface)
+                    assertThat(LocalContentColor.current).isEqualTo(onSurface)
                 }
             }
         }
@@ -68,8 +68,8 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface {
-                    Providers(AmbientContentAlpha provides ContentAlpha.high) {
-                        assertThat(AmbientContentAlpha.current)
+                    Providers(LocalContentAlpha provides ContentAlpha.high) {
+                        assertThat(LocalContentAlpha.current)
                             .isEqualTo(ReducedContrastHighContentAlpha)
                     }
                 }
@@ -82,8 +82,8 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface {
-                    Providers(AmbientContentAlpha provides ContentAlpha.medium) {
-                        assertThat(AmbientContentAlpha.current)
+                    Providers(LocalContentAlpha provides ContentAlpha.medium) {
+                        assertThat(LocalContentAlpha.current)
                             .isEqualTo(ReducedContrastMediumContentAlpha)
                     }
                 }
@@ -96,8 +96,8 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface {
-                    Providers(AmbientContentAlpha provides ContentAlpha.disabled) {
-                        assertThat(AmbientContentAlpha.current)
+                    Providers(LocalContentAlpha provides ContentAlpha.disabled) {
+                        assertThat(LocalContentAlpha.current)
                             .isEqualTo(ReducedContrastDisabledContentAlpha)
                     }
                 }
@@ -112,7 +112,7 @@
                 Surface(color = colors.primary) {
                     val onPrimary = MaterialTheme.colors.onPrimary
 
-                    assertThat(AmbientContentColor.current).isEqualTo(onPrimary)
+                    assertThat(LocalContentColor.current).isEqualTo(onPrimary)
                 }
             }
         }
@@ -123,8 +123,8 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface(color = colors.primary) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.high) {
-                        assertThat(AmbientContentAlpha.current)
+                    Providers(LocalContentAlpha provides ContentAlpha.high) {
+                        assertThat(LocalContentAlpha.current)
                             .isEqualTo(HighContrastHighContentAlpha)
                     }
                 }
@@ -137,8 +137,8 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface(color = colors.primary) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.medium) {
-                        assertThat(AmbientContentAlpha.current)
+                    Providers(LocalContentAlpha provides ContentAlpha.medium) {
+                        assertThat(LocalContentAlpha.current)
                             .isEqualTo(HighContrastMediumContentAlpha)
                     }
                 }
@@ -151,8 +151,8 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface(color = colors.primary) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.disabled) {
-                        assertThat(AmbientContentAlpha.current)
+                    Providers(LocalContentAlpha provides ContentAlpha.disabled) {
+                        assertThat(LocalContentAlpha.current)
                             .isEqualTo(HighContrastDisabledContentAlpha)
                     }
                 }
@@ -165,7 +165,7 @@
         rule.setContent {
             MaterialTheme(colors) {
                 Surface(contentColor = Color.Yellow) {
-                    assertThat(AmbientContentColor.current).isEqualTo(Color.Yellow)
+                    assertThat(LocalContentColor.current).isEqualTo(Color.Yellow)
                 }
             }
         }
@@ -177,13 +177,13 @@
             MaterialTheme(colors) {
                 val contentColor = Color(0.9f, 0.9f, 0.9f)
                 Surface(contentColor = contentColor) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.high) {
+                    Providers(LocalContentAlpha provides ContentAlpha.high) {
                         val expectedAlpha = if (colors.isLight) {
                             HighContrastHighContentAlpha
                         } else {
                             ReducedContrastHighContentAlpha
                         }
-                        assertThat(AmbientContentAlpha.current).isEqualTo(expectedAlpha)
+                        assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
             }
@@ -196,13 +196,13 @@
             MaterialTheme(colors) {
                 val contentColor = Color(0.9f, 0.9f, 0.9f)
                 Surface(contentColor = contentColor) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.medium) {
+                    Providers(LocalContentAlpha provides ContentAlpha.medium) {
                         val expectedAlpha = if (colors.isLight) {
                             HighContrastMediumContentAlpha
                         } else {
                             ReducedContrastMediumContentAlpha
                         }
-                        assertThat(AmbientContentAlpha.current).isEqualTo(expectedAlpha)
+                        assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
             }
@@ -215,13 +215,13 @@
             MaterialTheme(colors) {
                 val contentColor = Color(0.9f, 0.9f, 0.9f)
                 Surface(contentColor = contentColor) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.disabled) {
+                    Providers(LocalContentAlpha provides ContentAlpha.disabled) {
                         val expectedAlpha = if (colors.isLight) {
                             HighContrastDisabledContentAlpha
                         } else {
                             ReducedContrastDisabledContentAlpha
                         }
-                        assertThat(AmbientContentAlpha.current).isEqualTo(expectedAlpha)
+                        assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
             }
@@ -234,13 +234,13 @@
             MaterialTheme(colors) {
                 val contentColor = Color(0.1f, 0.1f, 0.1f)
                 Surface(contentColor = contentColor) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.high) {
+                    Providers(LocalContentAlpha provides ContentAlpha.high) {
                         val expectedAlpha = if (colors.isLight) {
                             ReducedContrastHighContentAlpha
                         } else {
                             HighContrastHighContentAlpha
                         }
-                        assertThat(AmbientContentAlpha.current).isEqualTo(expectedAlpha)
+                        assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
             }
@@ -253,13 +253,13 @@
             MaterialTheme(colors) {
                 val contentColor = Color(0.1f, 0.1f, 0.1f)
                 Surface(contentColor = contentColor) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.medium) {
+                    Providers(LocalContentAlpha provides ContentAlpha.medium) {
                         val expectedAlpha = if (colors.isLight) {
                             ReducedContrastMediumContentAlpha
                         } else {
                             HighContrastMediumContentAlpha
                         }
-                        assertThat(AmbientContentAlpha.current).isEqualTo(expectedAlpha)
+                        assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
             }
@@ -272,13 +272,13 @@
             MaterialTheme(colors) {
                 val contentColor = Color(0.1f, 0.1f, 0.1f)
                 Surface(contentColor = contentColor) {
-                    Providers(AmbientContentAlpha provides ContentAlpha.disabled) {
+                    Providers(LocalContentAlpha provides ContentAlpha.disabled) {
                         val expectedAlpha = if (colors.isLight) {
                             ReducedContrastDisabledContentAlpha
                         } else {
                             HighContrastDisabledContentAlpha
                         }
-                        assertThat(AmbientContentAlpha.current).isEqualTo(expectedAlpha)
+                        assertThat(LocalContentAlpha.current).isEqualTo(expectedAlpha)
                     }
                 }
             }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/DrawerTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/DrawerTest.kt
index 2389196..94dca3c 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/DrawerTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/DrawerTest.kt
@@ -24,7 +24,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
 import androidx.compose.ui.test.SemanticsMatcher
@@ -435,7 +435,7 @@
         rule.setMaterialContent {
             drawerState = rememberDrawerState(DrawerValue.Closed)
             // emulate click on the screen
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(Modifier.testTag("Drawer")) {
                     ModalDrawerLayout(
                         drawerState = drawerState,
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt
index 829ad05..270f0fc 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ElevationOverlayTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.compositeOver
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -158,7 +158,7 @@
 
         rule.setContent {
             // Turn off overlay behavior
-            Providers(AmbientElevationOverlay provides null) {
+            Providers(LocalElevationOverlay provides null) {
                 TestSurface(elevation!!, colors)
             }
         }
@@ -183,7 +183,7 @@
         }
 
         rule.setContent {
-            Providers(AmbientElevationOverlay provides customOverlay) {
+            Providers(LocalElevationOverlay provides customOverlay) {
                 TestSurface(elevation!!, lightColors())
             }
         }
@@ -210,7 +210,7 @@
     MaterialTheme(colors) {
         Box {
             Surface(elevation = elevation) {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     // Make the surface size small so we compare less pixels
                     Box(
                         Modifier.preferredSize(
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
index c00a8b0..4cd637a 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
@@ -178,7 +178,7 @@
             Box {
                 surface = MaterialTheme.colors.surface
                 fabColor = MaterialTheme.colors.secondary
-                Providers(AmbientShapes provides Shapes(small = themeShape)) {
+                Providers(LocalShapes provides Shapes(small = themeShape)) {
                     FloatingActionButton(
                         modifier = Modifier.testTag("myButton"),
                         onClick = {},
@@ -215,7 +215,7 @@
             Box {
                 surface = MaterialTheme.colors.surface
                 fabColor = MaterialTheme.colors.secondary
-                Providers(AmbientShapes provides Shapes(small = themeShape)) {
+                Providers(LocalShapes provides Shapes(small = themeShape)) {
                     ExtendedFloatingActionButton(
                         modifier = Modifier.testTag("myButton"),
                         onClick = {},
@@ -265,8 +265,8 @@
             assertThat(contentBounds.width).isLessThan(buttonBounds.width)
             assertThat(contentBounds.height).isLessThan(buttonBounds.height)
             with(rule.density) {
-                assertThat(contentBounds.width).isEqualTo(2.dp.toIntPx().toFloat())
-                assertThat(contentBounds.height).isEqualTo(2.dp.toIntPx().toFloat())
+                assertThat(contentBounds.width).isEqualTo(2.dp.roundToPx().toFloat())
+                assertThat(contentBounds.height).isEqualTo(2.dp.roundToPx().toFloat())
             }
             assertWithinOnePixel(buttonBounds.center, contentBounds.center)
         }
@@ -297,8 +297,8 @@
             assertThat(contentBounds.width).isLessThan(buttonBounds.width)
             assertThat(contentBounds.height).isLessThan(buttonBounds.height)
             with(rule.density) {
-                assertThat(contentBounds.width).isEqualTo(2.dp.toIntPx().toFloat())
-                assertThat(contentBounds.height).isEqualTo(2.dp.toIntPx().toFloat())
+                assertThat(contentBounds.width).isEqualTo(2.dp.roundToPx().toFloat())
+                assertThat(contentBounds.height).isEqualTo(2.dp.roundToPx().toFloat())
             }
             assertWithinOnePixel(buttonBounds.center, contentBounds.center)
         }
@@ -335,14 +335,14 @@
             val textBounds = textCoordinates!!.boundsInRoot()
             val iconBounds = iconCoordinates!!.boundsInRoot()
             with(rule.density) {
-                assertThat(textBounds.width).isEqualTo(2.dp.toIntPx().toFloat())
-                assertThat(textBounds.height).isEqualTo(2.dp.toIntPx().toFloat())
-                assertThat(iconBounds.width).isEqualTo(10.dp.toIntPx().toFloat())
-                assertThat(iconBounds.height).isEqualTo(10.dp.toIntPx().toFloat())
+                assertThat(textBounds.width).isEqualTo(2.dp.roundToPx().toFloat())
+                assertThat(textBounds.height).isEqualTo(2.dp.roundToPx().toFloat())
+                assertThat(iconBounds.width).isEqualTo(10.dp.roundToPx().toFloat())
+                assertThat(iconBounds.height).isEqualTo(10.dp.roundToPx().toFloat())
 
                 assertWithinOnePixel(buttonBounds.center.y, iconBounds.center.y)
                 assertWithinOnePixel(buttonBounds.center.y, textBounds.center.y)
-                val halfPadding = 6.dp.toIntPx().toFloat()
+                val halfPadding = 6.dp.roundToPx().toFloat()
                 assertWithinOnePixel(
                     iconBounds.center.x + iconBounds.width / 2 + halfPadding,
                     textBounds.center.x - textBounds.width / 2 - halfPadding
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt
index ab97ef7..f32da1f 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt
@@ -28,7 +28,7 @@
 import androidx.compose.ui.graphics.painter.ColorPainter
 import androidx.compose.ui.graphics.painter.ImagePainter
 import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -90,8 +90,8 @@
         val height = 24.dp
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(AmbientDensity.current) {
-                    ImageBitmap(width.toIntPx(), height.toIntPx())
+                val image = with(LocalDensity.current) {
+                    ImageBitmap(width.roundToPx(), height.roundToPx())
                 }
 
                 Icon(image, null)
@@ -107,8 +107,8 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(AmbientDensity.current) {
-                    ImageBitmap(width.toIntPx(), height.toIntPx())
+                val image = with(LocalDensity.current) {
+                    ImageBitmap(width.roundToPx(), height.roundToPx())
                 }
 
                 Icon(image, null)
@@ -137,8 +137,8 @@
 
         rule
             .setMaterialContentForSizeAssertions {
-                val image = with(AmbientDensity.current) {
-                    ImageBitmap(width.toIntPx(), height.toIntPx())
+                val image = with(LocalDensity.current) {
+                    ImageBitmap(width.roundToPx(), height.roundToPx())
                 }
 
                 val imagePainter = ImagePainter(image)
@@ -156,11 +156,11 @@
         val testTag = "testTag"
         rule.setMaterialContentForSizeAssertions {
             val image: ImageBitmap
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 image = createBitmapWithColor(
                     this,
-                    width.toIntPx(),
-                    height.toIntPx(),
+                    width.roundToPx(),
+                    height.roundToPx(),
                     Color.Red
                 )
             }
@@ -179,11 +179,11 @@
         val testTag = "testTag"
         rule.setMaterialContentForSizeAssertions {
             val image: ImageBitmap
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 image = createBitmapWithColor(
                     this,
-                    width.toIntPx(),
-                    height.toIntPx(),
+                    width.roundToPx(),
+                    height.roundToPx(),
                     Color.Red
                 )
             }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ListItemTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ListItemTest.kt
index 087e32e..de7c9ef 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ListItemTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ListItemTest.kt
@@ -207,18 +207,18 @@
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx()
+                expectedLeftPadding.roundToPx()
                     .toFloat()
             )
             assertThat(textPosition.value!!.y).isEqualTo(
-                ((listItemHeight.toIntPx() - textSize.value!!.height) / 2f).roundToInt().toFloat()
+                ((listItemHeight.roundToPx() - textSize.value!!.height) / 2f).roundToInt().toFloat()
             )
             assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.toIntPx() - trailingSize.value!!.width -
-                    expectedRightPadding.toIntPx().toFloat()
+                ds.width.roundToPx() - trailingSize.value!!.width -
+                    expectedRightPadding.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.y).isEqualTo(
-                ((listItemHeight.toIntPx() - trailingSize.value!!.height) / 2f).roundToInt()
+                ((listItemHeight.roundToPx() - trailingSize.value!!.height) / 2f).roundToInt()
                     .toFloat()
             )
         }
@@ -244,18 +244,18 @@
         }
         rule.runOnIdleWithDensity {
             assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.y).isEqualTo(
-                ((listItemHeight.toIntPx() - iconSize.value!!.height) / 2f).roundToInt().toFloat()
+                ((listItemHeight.roundToPx() - iconSize.value!!.height) / 2f).roundToInt().toFloat()
             )
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() +
+                expectedLeftPadding.roundToPx().toFloat() +
                     iconSize.value!!.width +
-                    expectedTextLeftPadding.toIntPx().toFloat()
+                    expectedTextLeftPadding.roundToPx().toFloat()
             )
             assertThat(textPosition.value!!.y).isEqualTo(
-                ((listItemHeight.toIntPx() - textSize.value!!.height) / 2f).roundToInt().toFloat()
+                ((listItemHeight.roundToPx() - textSize.value!!.height) / 2f).roundToInt().toFloat()
             )
         }
     }
@@ -307,24 +307,24 @@
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat()
             )
             assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat()
             )
             assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat()
             )
             assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat() +
+                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.toIntPx() - trailingSize.value!!.width -
-                    expectedRightPadding.toIntPx().toFloat()
+                ds.width.roundToPx() - trailingSize.value!!.width -
+                    expectedRightPadding.roundToPx().toFloat()
             )
             assertThat(trailingBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat()
             )
         }
     }
@@ -372,26 +372,26 @@
         }
         rule.runOnIdleWithDensity {
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat()
             )
             assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() +
+                expectedLeftPadding.roundToPx().toFloat() +
                     iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat() +
+                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.toIntPx().toFloat()
+                expectedIconTopPadding.roundToPx().toFloat()
             )
         }
     }
@@ -447,33 +447,33 @@
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat()
             )
             assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() +
+                expectedLeftPadding.roundToPx().toFloat() +
                     iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat() +
+                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.toIntPx().toFloat()
+                expectedIconTopPadding.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.toIntPx() - trailingSize.value!!.width -
-                    expectedRightPadding.toIntPx().toFloat()
+                ds.width.roundToPx() - trailingSize.value!!.width -
+                    expectedRightPadding.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.y).isEqualTo(
-                ((listItemHeight.toIntPx() - trailingSize.value!!.height) / 2).toFloat()
+                ((listItemHeight.roundToPx() - trailingSize.value!!.height) / 2).toFloat()
             )
         }
     }
@@ -529,30 +529,30 @@
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(textBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat()
             )
             assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() + iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat() + iconSize.value!!.width +
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedTextBaseline.toIntPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.toIntPx().toFloat()
+                expectedTextBaseline.roundToPx().toFloat() +
+                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
             )
-            assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.toIntPx().toFloat())
+            assertThat(iconPosition.value!!.x).isEqualTo(expectedLeftPadding.roundToPx().toFloat())
             assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.toIntPx().toFloat()
+                expectedIconTopPadding.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.toIntPx() - trailingSize.value!!.width.toFloat() -
-                    expectedRightPadding.toIntPx().toFloat()
+                ds.width.roundToPx() - trailingSize.value!!.width.toFloat() -
+                    expectedRightPadding.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.toIntPx().toFloat()
+                expectedIconTopPadding.roundToPx().toFloat()
             )
         }
     }
@@ -634,44 +634,44 @@
         val ds = rule.onRoot().getUnclippedBoundsInRoot()
         rule.runOnIdleWithDensity {
             assertThat(textPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() +
+                expectedLeftPadding.roundToPx().toFloat() +
                     iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(textBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.toIntPx().toFloat() +
-                    expectedTextBaselineOffset.toIntPx().toFloat()
+                expectedOverlineBaseline.roundToPx().toFloat() +
+                    expectedTextBaselineOffset.roundToPx().toFloat()
             )
             assertThat(overlineTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() +
+                expectedLeftPadding.roundToPx().toFloat() +
                     iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(overlineTextBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.toIntPx().toFloat()
+                expectedOverlineBaseline.roundToPx().toFloat()
             )
             assertThat(secondaryTextPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat() +
+                expectedLeftPadding.roundToPx().toFloat() +
                     iconSize.value!!.width +
-                    expectedContentLeftPadding.toIntPx().toFloat()
+                    expectedContentLeftPadding.roundToPx().toFloat()
             )
             assertThat(secondaryTextBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.toIntPx().toFloat() +
-                    expectedTextBaselineOffset.toIntPx().toFloat() +
-                    expectedSecondaryTextBaselineOffset.toIntPx().toFloat()
+                expectedOverlineBaseline.roundToPx().toFloat() +
+                    expectedTextBaselineOffset.roundToPx().toFloat() +
+                    expectedSecondaryTextBaselineOffset.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.x).isEqualTo(
-                expectedLeftPadding.toIntPx().toFloat()
+                expectedLeftPadding.roundToPx().toFloat()
             )
             assertThat(iconPosition.value!!.y).isEqualTo(
-                expectedIconTopPadding.toIntPx().toFloat()
+                expectedIconTopPadding.roundToPx().toFloat()
             )
             assertThat(trailingPosition.value!!.x).isEqualTo(
-                ds.width.toIntPx() - trailingSize.value!!.width -
-                    expectedRightPadding.toIntPx().toFloat()
+                ds.width.roundToPx() - trailingSize.value!!.width -
+                    expectedRightPadding.roundToPx().toFloat()
             )
             assertThat(trailingBaseline.value!!).isEqualTo(
-                expectedOverlineBaseline.toIntPx().toFloat()
+                expectedOverlineBaseline.roundToPx().toFloat()
             )
         }
     }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
index 8b7a31b..e862134 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
@@ -27,8 +27,8 @@
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.ripple.AmbientRippleTheme
 import androidx.compose.material.ripple.ExperimentalRippleApi
+import androidx.compose.material.ripple.LocalRippleTheme
 import androidx.compose.material.ripple.RippleAlpha
 import androidx.compose.material.ripple.RippleTheme
 import androidx.compose.material.ripple.rememberRipple
@@ -436,7 +436,7 @@
 
         rule.setContent {
             MaterialTheme {
-                Providers(AmbientRippleTheme provides rippleTheme) {
+                Providers(LocalRippleTheme provides rippleTheme) {
                     Surface(contentColor = contentColor) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                             RippleBox(interactionState, rememberRipple())
@@ -475,7 +475,7 @@
 
         rule.setContent {
             MaterialTheme {
-                Providers(AmbientRippleTheme provides rippleTheme) {
+                Providers(LocalRippleTheme provides rippleTheme) {
                     Surface(contentColor = contentColor) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                             RippleBox(interactionState, rememberRipple())
@@ -514,7 +514,7 @@
 
         rule.setContent {
             MaterialTheme {
-                Providers(AmbientRippleTheme provides rippleTheme) {
+                Providers(LocalRippleTheme provides rippleTheme) {
                     Surface(contentColor = Color.Black) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                             RippleBox(interactionState, rememberRipple())
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt
index 4f967de..34a8431 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialTextSelectionColorsScreenshotTest.kt
@@ -24,8 +24,8 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.selection.SelectionContainer
-import androidx.compose.ui.selection.TextSelectionColors
+import androidx.compose.foundation.text.selection.SelectionContainer
+import androidx.compose.foundation.text.selection.TextSelectionColors
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.height
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MenuTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MenuTest.kt
index 664def2..701d676 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MenuTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MenuTest.kt
@@ -26,7 +26,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.hasAnyDescendant
@@ -36,7 +36,7 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -61,15 +61,14 @@
         var expanded by mutableStateOf(false)
 
         rule.setContent {
-            DropdownMenu(
-                expanded = expanded,
-                toggle = {
-                    Box(Modifier.size(20.dp).background(color = Color.Blue))
-                },
-                onDismissRequest = {}
-            ) {
-                DropdownMenuItem(modifier = Modifier.testTag("MenuContent"), onClick = {}) {
-                    Text("Option 1")
+            Box(Modifier.size(20.dp).background(color = Color.Blue)) {
+                DropdownMenu(
+                    expanded = expanded,
+                    onDismissRequest = {}
+                ) {
+                    DropdownMenuItem(modifier = Modifier.testTag("MenuContent"), onClick = {}) {
+                        Text("Option 1")
+                    }
                 }
             }
         }
@@ -102,16 +101,15 @@
     @Test
     fun menu_hasExpectedSize() {
         rule.setContent {
-            with(AmbientDensity.current) {
-                DropdownMenu(
-                    expanded = true,
-                    toggle = {
-                        Box(Modifier.size(20.toDp()).background(color = Color.Blue))
-                    },
-                    onDismissRequest = {}
-                ) {
-                    Box(Modifier.testTag("MenuContent1").preferredSize(70.toDp()))
-                    Box(Modifier.testTag("MenuContent2").preferredSize(130.toDp()))
+            with(LocalDensity.current) {
+                Box(Modifier.size(20.toDp()).background(color = Color.Blue)) {
+                    DropdownMenu(
+                        expanded = true,
+                        onDismissRequest = {}
+                    ) {
+                        Box(Modifier.testTag("MenuContent1").preferredSize(70.toDp()))
+                        Box(Modifier.testTag("MenuContent2").preferredSize(130.toDp()))
+                    }
                 }
             }
         }
@@ -124,7 +122,8 @@
         ).assertExists().fetchSemanticsNode()
         with(rule.density) {
             assertThat(node.size.width).isEqualTo(130)
-            assertThat(node.size.height).isEqualTo(DropdownMenuVerticalPadding.toIntPx() * 2 + 200)
+            assertThat(node.size.height)
+                .isEqualTo(DropdownMenuVerticalPadding.roundToPx() * 2 + 200)
         }
     }
 
@@ -144,7 +143,7 @@
             DpOffset(offsetX.dp, offsetY.dp),
             density
         ).calculatePosition(
-            IntBounds(anchorPosition, anchorSize),
+            IntRect(anchorPosition, anchorSize),
             windowSize,
             LayoutDirection.Ltr,
             popupSize
@@ -161,7 +160,7 @@
             DpOffset(offsetX.dp, offsetY.dp),
             density
         ).calculatePosition(
-            IntBounds(anchorPosition, anchorSize),
+            IntRect(anchorPosition, anchorSize),
             windowSize,
             LayoutDirection.Rtl,
             popupSize
@@ -192,7 +191,7 @@
             DpOffset(offsetX.dp, offsetY.dp),
             density
         ).calculatePosition(
-            IntBounds(anchorPosition, anchorSize),
+            IntRect(anchorPosition, anchorSize),
             windowSize,
             LayoutDirection.Ltr,
             popupSize
@@ -209,7 +208,7 @@
             DpOffset(offsetX.dp, offsetY.dp),
             density
         ).calculatePosition(
-            IntBounds(anchorPositionRtl, anchorSize),
+            IntRect(anchorPositionRtl, anchorSize),
             windowSize,
             LayoutDirection.Rtl,
             popupSize
@@ -235,13 +234,13 @@
 
         // The min margin above and below the menu, relative to the screen.
         val MenuVerticalMargin = 32.dp
-        val verticalMargin = with(density) { MenuVerticalMargin.toIntPx() }
+        val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
 
         val position = DropdownMenuPositionProvider(
             DpOffset(0.dp, 0.dp),
             density
         ).calculatePosition(
-            IntBounds(anchorPosition, anchorSize),
+            IntRect(anchorPosition, anchorSize),
             windowSize,
             LayoutDirection.Ltr,
             popupSize
@@ -264,8 +263,8 @@
         val offsetY = 40
         val popupSize = IntSize(50, 80)
 
-        var obtainedParentBounds = IntBounds(0, 0, 0, 0)
-        var obtainedMenuBounds = IntBounds(0, 0, 0, 0)
+        var obtainedParentBounds = IntRect(0, 0, 0, 0)
+        var obtainedMenuBounds = IntRect(0, 0, 0, 0)
         DropdownMenuPositionProvider(
             DpOffset(offsetX.dp, offsetY.dp),
             density
@@ -273,15 +272,15 @@
             obtainedParentBounds = parentBounds
             obtainedMenuBounds = menuBounds
         }.calculatePosition(
-            IntBounds(anchorPosition, anchorSize),
+            IntRect(anchorPosition, anchorSize),
             windowSize,
             LayoutDirection.Ltr,
             popupSize
         )
 
-        assertThat(obtainedParentBounds).isEqualTo(IntBounds(anchorPosition, anchorSize))
+        assertThat(obtainedParentBounds).isEqualTo(IntRect(anchorPosition, anchorSize))
         assertThat(obtainedMenuBounds).isEqualTo(
-            IntBounds(
+            IntRect(
                 anchorPosition.x + offsetX,
                 anchorPosition.y + anchorSize.height + offsetY,
                 anchorPosition.x + offsetX + popupSize.width,
@@ -302,18 +301,19 @@
             onSurface = MaterialTheme.colors.onSurface
             enabledContentAlpha = ContentAlpha.high
             disabledContentAlpha = ContentAlpha.disabled
-            DropdownMenu(
-                toggle = { Box(Modifier.size(20.dp)) },
-                onDismissRequest = {},
-                expanded = true
-            ) {
-                DropdownMenuItem(onClick = {}) {
-                    enabledContentColor = AmbientContentColor.current
-                        .copy(alpha = AmbientContentAlpha.current)
-                }
-                DropdownMenuItem(enabled = false, onClick = {}) {
-                    disabledContentColor = AmbientContentColor.current
-                        .copy(alpha = AmbientContentAlpha.current)
+            Box(Modifier.size(20.dp)) {
+                DropdownMenu(
+                    onDismissRequest = {},
+                    expanded = true
+                ) {
+                    DropdownMenuItem(onClick = {}) {
+                        enabledContentColor = LocalContentColor.current
+                            .copy(alpha = LocalContentAlpha.current)
+                    }
+                    DropdownMenuItem(enabled = false, onClick = {}) {
+                        disabledContentColor = LocalContentColor.current
+                            .copy(alpha = LocalContentAlpha.current)
+                    }
                 }
             }
         }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt
index 0858323..8623c59 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ModalBottomSheetTest.kt
@@ -23,10 +23,15 @@
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onParent
 import androidx.compose.ui.test.performGesture
+import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.test.swipeDown
 import androidx.compose.ui.test.swipeUp
 import androidx.compose.ui.unit.dp
@@ -105,6 +110,37 @@
     }
 
     @Test
+    fun modalBottomSheet_testDismissAction_whenExpanded() {
+        val sheetState = ModalBottomSheetState(ModalBottomSheetValue.Expanded, clock)
+        rule.setMaterialContent {
+            ModalBottomSheetLayout(
+                sheetState = sheetState,
+                content = {},
+                sheetContent = {
+                    Box(
+                        Modifier
+                            .fillMaxWidth()
+                            .preferredHeight(sheetHeight)
+                            .testTag(sheetTag)
+                    )
+                }
+            )
+        }
+
+        val height = rule.rootHeight()
+        rule.onNodeWithTag(sheetTag).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+            .performSemanticsAction(SemanticsActions.Dismiss)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetTag)
+            .assertTopPositionInRootIsEqualTo(height)
+    }
+
+    @Test
     fun modalBottomSheet_testOffset_tallBottomSheet_whenHidden() {
         rule.setMaterialContent {
             ModalBottomSheetLayout(
@@ -146,6 +182,66 @@
     }
 
     @Test
+    fun modalBottomSheet_testCollapseAction_tallBottomSheet_whenExpanded() {
+        val sheetState = ModalBottomSheetState(ModalBottomSheetValue.Expanded, clock)
+        rule.setMaterialContent {
+            ModalBottomSheetLayout(
+                sheetState = sheetState,
+                content = {},
+                sheetContent = {
+                    Box(
+                        Modifier
+                            .fillMaxSize()
+                            .testTag(sheetTag)
+                    )
+                }
+            )
+        }
+
+        val height = rule.rootHeight()
+        rule.onNodeWithTag(sheetTag).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+            .performSemanticsAction(SemanticsActions.Collapse)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetTag)
+            .assertTopPositionInRootIsEqualTo(height / 2)
+    }
+
+    @Test
+    fun modalBottomSheet_testDismissAction_tallBottomSheet_whenExpanded() {
+        val sheetState = ModalBottomSheetState(ModalBottomSheetValue.Expanded, clock)
+        rule.setMaterialContent {
+            ModalBottomSheetLayout(
+                sheetState = sheetState,
+                content = {},
+                sheetContent = {
+                    Box(
+                        Modifier
+                            .fillMaxSize()
+                            .testTag(sheetTag)
+                    )
+                }
+            )
+        }
+
+        val height = rule.rootHeight()
+        rule.onNodeWithTag(sheetTag).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+            .performSemanticsAction(SemanticsActions.Dismiss)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetTag)
+            .assertTopPositionInRootIsEqualTo(height)
+    }
+
+    @Test
     fun modalBottomSheet_testOffset_tallBottomSheet_whenHalfExpanded() {
         rule.setMaterialContent {
             ModalBottomSheetLayout(
@@ -167,6 +263,65 @@
     }
 
     @Test
+    fun modalBottomSheet_testExpandAction_tallBottomSheet_whenHalfExpanded() {
+        val sheetState = ModalBottomSheetState(ModalBottomSheetValue.HalfExpanded, clock)
+        rule.setMaterialContent {
+            ModalBottomSheetLayout(
+                sheetState = sheetState,
+                content = {},
+                sheetContent = {
+                    Box(
+                        Modifier
+                            .fillMaxSize()
+                            .testTag(sheetTag)
+                    )
+                }
+            )
+        }
+
+        rule.onNodeWithTag(sheetTag).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+            .performSemanticsAction(SemanticsActions.Expand)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetTag)
+            .assertTopPositionInRootIsEqualTo(0.dp)
+    }
+
+    @Test
+    fun modalBottomSheet_testDismissAction_tallBottomSheet_whenHalfExpanded() {
+        val sheetState = ModalBottomSheetState(ModalBottomSheetValue.HalfExpanded, clock)
+        rule.setMaterialContent {
+            ModalBottomSheetLayout(
+                sheetState = sheetState,
+                content = {},
+                sheetContent = {
+                    Box(
+                        Modifier
+                            .fillMaxSize()
+                            .testTag(sheetTag)
+                    )
+                }
+            )
+        }
+
+        val height = rule.rootHeight()
+        rule.onNodeWithTag(sheetTag).onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Collapse))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Expand))
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+            .performSemanticsAction(SemanticsActions.Dismiss)
+
+        advanceClock()
+
+        rule.onNodeWithTag(sheetTag)
+            .assertTopPositionInRootIsEqualTo(height)
+    }
+
+    @Test
     fun modalBottomSheet_showAndHide_manually() {
         val sheetState = ModalBottomSheetState(ModalBottomSheetValue.Hidden, clock)
         rule.setMaterialContent {
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt
index 9600b81..c0207f6 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldScreenshotTest.kt
@@ -30,7 +30,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.captureToImage
@@ -653,7 +653,7 @@
 
     val layoutDirection = if (rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
 
-    Providers(AmbientLayoutDirection provides layoutDirection) {
+    Providers(LocalLayoutDirection provides layoutDirection) {
         Box(
             Modifier
                 .fillMaxSize(0.5f)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldTest.kt
index d33dc24..cf5f2d4 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ScaffoldTest.kt
@@ -402,7 +402,7 @@
                 floatingActionButton = fab,
                 floatingActionButtonPosition = FabPosition.End,
                 bottomBar = {
-                    fabPlacement = AmbientFabPlacement.current
+                    fabPlacement = LocalFabPlacement.current
                 }
             ) {
                 Text("body")
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt
index 2fcc47f..8cd2d38 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt
@@ -20,8 +20,8 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.AmbientLayoutDirection
-import androidx.compose.ui.platform.AmbientViewConfiguration
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.ProgressBarRangeInfo
 import androidx.compose.ui.semantics.SemanticsActions
@@ -175,7 +175,7 @@
         var slop = 0f
 
         rule.setMaterialContent {
-            slop = AmbientViewConfiguration.current.touchSlop
+            slop = LocalViewConfiguration.current.touchSlop
             Slider(
                 modifier = Modifier.testTag(tag),
                 value = state.value,
@@ -236,8 +236,8 @@
         var slop = 0f
 
         rule.setMaterialContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
-                slop = AmbientViewConfiguration.current.touchSlop
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                slop = LocalViewConfiguration.current.touchSlop
                 Slider(
                     modifier = Modifier.testTag(tag),
                     value = state.value,
@@ -270,7 +270,7 @@
         val state = mutableStateOf(0f)
 
         rule.setMaterialContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Slider(
                     modifier = Modifier.testTag(tag),
                     value = state.value,
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarTest.kt
index 287c882..45b0d6b 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarTest.kt
@@ -342,7 +342,7 @@
                 // on top of surface
                 snackBarColor = MaterialTheme.colors.onSurface.copy(alpha = 0.8f)
                     .compositeOver(background)
-                Providers(AmbientShapes provides Shapes(medium = shape)) {
+                Providers(LocalShapes provides Shapes(medium = shape)) {
                     Snackbar(
                         modifier = Modifier
                             .semantics(mergeDescendants = true) {}
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt
index 7e6a086..19e6b98 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceContentColorTest.kt
@@ -37,7 +37,7 @@
         rule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.primary) {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(MaterialTheme.colors.onPrimary)
                 }
             }
@@ -49,7 +49,7 @@
         rule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.secondary) {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(MaterialTheme.colors.onSecondary)
                 }
             }
@@ -61,7 +61,7 @@
         rule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.background) {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(MaterialTheme.colors.onBackground)
                 }
             }
@@ -73,7 +73,7 @@
         rule.setContent {
             MaterialTheme {
                 Surface(color = MaterialTheme.colors.surface) {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(MaterialTheme.colors.onSurface)
                 }
             }
@@ -85,7 +85,7 @@
         rule.setContent {
             MaterialTheme {
                 Surface(color = Color.Yellow) {
-                    assertThat(AmbientContentColor.current).isEqualTo(Color.Black)
+                    assertThat(LocalContentColor.current).isEqualTo(Color.Black)
                 }
             }
         }
@@ -100,7 +100,7 @@
                     // This surface should inherit the parent contentColor, as yellow is not part
                     // of the theme
                     Surface(color = Color.Yellow) {
-                        assertThat(AmbientContentColor.current)
+                        assertThat(LocalContentColor.current)
                             .isEqualTo(MaterialTheme.colors.onSurface)
                     }
                 }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
index 59074a7..9fb4a61 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
@@ -80,14 +80,14 @@
     }
 
     @Test
-    fun absoluteElevationAmbientIsSet() {
+    fun absoluteElevationCompositionLocalIsSet() {
         var outerElevation: Dp? = null
         var innerElevation: Dp? = null
         rule.setMaterialContent {
             Surface(elevation = 2.dp) {
-                outerElevation = AmbientAbsoluteElevation.current
+                outerElevation = LocalAbsoluteElevation.current
                 Surface(elevation = 4.dp) {
-                    innerElevation = AmbientAbsoluteElevation.current
+                    innerElevation = LocalAbsoluteElevation.current
                 }
             }
         }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt
index c78d22d..018fc22 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeToDismissTest.kt
@@ -22,7 +22,7 @@
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -222,7 +222,7 @@
     fun swipeToDismiss_dismissBySwipe_toEnd_rtl() {
         val dismissState = DismissState(DismissValue.Default, clock)
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 SwipeToDismiss(
                     modifier = Modifier.testTag(swipeToDismissTag),
                     state = dismissState,
@@ -246,7 +246,7 @@
     fun swipeToDismiss_dismissBySwipe_toStart_rtl() {
         val dismissState = DismissState(DismissValue.Default, clock)
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 SwipeToDismiss(
                     modifier = Modifier.testTag(swipeToDismissTag),
                     state = dismissState,
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeableTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeableTest.kt
index c2ca766..f879050 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeableTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwipeableTest.kt
@@ -38,8 +38,8 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.nestedscroll.nestedScroll
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.platform.AmbientViewConfiguration
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
@@ -1136,7 +1136,7 @@
         val state = SwipeableState("A", clock)
         var slop = 0f
         setSwipeableContent {
-            slop = AmbientViewConfiguration.current.touchSlop
+            slop = LocalViewConfiguration.current.touchSlop
             Modifier.swipeable(
                 state = state,
                 anchors = mapOf(0f to "A", 100f to "B"),
@@ -1215,7 +1215,7 @@
         val state = SwipeableState("A", clock)
         var slop = 0f
         setSwipeableContent {
-            slop = AmbientViewConfiguration.current.touchSlop
+            slop = LocalViewConfiguration.current.touchSlop
             Modifier.swipeable(
                 state = state,
                 anchors = mapOf(0f to "A", 100f to "B"),
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index b73619e..15d9955 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -27,7 +27,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
@@ -84,7 +84,7 @@
     fun switchTest_checked_rtl() {
         rule.setMaterialContent {
             Box(wrapperModifier) {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Switch(checked = true, onCheckedChange = { })
                 }
             }
@@ -120,7 +120,7 @@
     fun switchTest_unchecked_rtl() {
         rule.setMaterialContent {
             Box(wrapperModifier) {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Switch(checked = false, onCheckedChange = { })
                 }
             }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
index 330f3ba..b61d926 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
@@ -22,7 +22,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertHasClickAction
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -187,7 +187,7 @@
         rule.setMaterialContent {
 
             // Box is needed because otherwise the control will be expanded to fill its parent
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box {
                     Switch(
                         modifier = Modifier.testTag(defaultSwitchTag),
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt
index d4bc695..6abdcc4 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldScreenshotTest.kt
@@ -20,16 +20,16 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.width
-import androidx.compose.material.AmbientContentColor
 import androidx.compose.material.GOLDEN_MATERIAL
+import androidx.compose.material.LocalContentColor
 import androidx.compose.material.OutlinedTextField
 import androidx.compose.material.Text
 import androidx.compose.material.setMaterialContent
 import androidx.compose.runtime.Providers
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.SemanticsNodeInteraction
@@ -127,7 +127,7 @@
     @Test
     fun outlinedTextField_focused_rtl() {
         rule.setMaterialContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TextFieldTag)) {
                     OutlinedTextField(
                         value = "",
@@ -183,7 +183,7 @@
     @Test
     fun outlinedTextField_textColor_fallbackToContentColor() {
         rule.setMaterialContent {
-            Providers(AmbientContentColor provides Color.Magenta) {
+            Providers(LocalContentColor provides Color.Magenta) {
                 OutlinedTextField(
                     value = "Hello, world!",
                     onValueChange = {},
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
index 238014e..9eb6f1da 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
@@ -24,9 +24,9 @@
 import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material.AmbientContentAlpha
-import androidx.compose.material.AmbientContentColor
-import androidx.compose.material.AmbientTextStyle
+import androidx.compose.material.LocalContentAlpha
+import androidx.compose.material.LocalContentColor
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.OutlinedTextField
 import androidx.compose.material.Text
@@ -48,7 +48,7 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientTextInputService
+import androidx.compose.ui.platform.LocalTextInputService
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.assertWidthIsEqualTo
@@ -221,12 +221,12 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             // label is centered in 56.dp default container, plus additional 8.dp padding on top
-            val minimumHeight = ExpectedMinimumTextFieldHeight.toIntPx()
+            val minimumHeight = ExpectedMinimumTextFieldHeight.roundToPx()
             assertThat(labelPosition.value?.y).isEqualTo(
-                ((minimumHeight - labelSize.value!!.height) / 2f).roundToInt() + 8.dp.toIntPx()
+                ((minimumHeight - labelSize.value!!.height) / 2f).roundToInt() + 8.dp.roundToPx()
             )
         }
     }
@@ -259,11 +259,11 @@
             assertThat(labelSize.value?.height).isGreaterThan(0)
             assertThat(labelSize.value?.width).isGreaterThan(0)
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             // label is aligned to the top with padding, plus additional 8.dp padding on top
             assertThat(labelPosition.value?.y).isEqualTo(
-                TextFieldPadding.toIntPx() + 8.dp.toIntPx()
+                TextFieldPadding.roundToPx() + 8.dp.roundToPx()
             )
         }
     }
@@ -300,7 +300,7 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(labelPosition.value?.y).isEqualTo(0)
         }
@@ -333,7 +333,7 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(labelPosition.value?.y).isEqualTo(0)
         }
@@ -372,12 +372,12 @@
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // placeholder's position
             assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             // placeholder is centered in 56.dp default container,
             // plus additional 8.dp padding on top
             assertThat(placeholderPosition.value?.y).isEqualTo(
-                TextFieldPadding.toIntPx() + 8.dp.toIntPx()
+                TextFieldPadding.roundToPx() + 8.dp.roundToPx()
             )
         }
     }
@@ -415,11 +415,11 @@
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // centered position
             assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             // placeholder is placed with fixed padding plus additional 8.dp padding on top
             assertThat(placeholderPosition.value?.y).isEqualTo(
-                TextFieldPadding.toIntPx() + 8.dp.toIntPx()
+                TextFieldPadding.roundToPx() + 8.dp.roundToPx()
             )
         }
     }
@@ -468,8 +468,8 @@
                 placeholder = {
                     Text("placeholder")
                     assertThat(
-                        AmbientContentColor.current.copy(
-                            alpha = AmbientContentAlpha.current
+                        LocalContentColor.current.copy(
+                            alpha = LocalContentAlpha.current
                         )
                     )
                         .isEqualTo(
@@ -477,7 +477,7 @@
                                 alpha = 0.6f
                             )
                         )
-                    assertThat(AmbientTextStyle.current)
+                    assertThat(LocalTextStyle.current)
                         .isEqualTo(MaterialTheme.typography.subtitle1)
                 }
             )
@@ -522,21 +522,21 @@
         }
 
         rule.runOnIdleWithDensity {
-            val minimumHeight = ExpectedMinimumTextFieldHeight.toIntPx()
+            val minimumHeight = ExpectedMinimumTextFieldHeight.roundToPx()
             // leading
-            assertThat(leadingSize.value).isEqualTo(IntSize(size.toIntPx(), size.toIntPx()))
-            assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.toIntPx().toFloat())
+            assertThat(leadingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+            assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.roundToPx().toFloat())
             assertThat(leadingPosition.value?.y).isEqualTo(
-                ((minimumHeight - leadingSize.value!!.height) / 2f).roundToInt() + 8.dp.toIntPx()
+                ((minimumHeight - leadingSize.value!!.height) / 2f).roundToInt() + 8.dp.roundToPx()
             )
             // trailing
-            assertThat(trailingSize.value).isEqualTo(IntSize(size.toIntPx(), size.toIntPx()))
+            assertThat(trailingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
             assertThat(trailingPosition.value?.x).isEqualTo(
-                (textFieldWidth.toIntPx() - IconPadding.toIntPx() - trailingSize.value!!.width)
+                (textFieldWidth.roundToPx() - IconPadding.roundToPx() - trailingSize.value!!.width)
                     .toFloat()
             )
             assertThat(trailingPosition.value?.y).isEqualTo(
-                ((minimumHeight - trailingSize.value!!.height) / 2f).roundToInt() + 8.dp.toIntPx()
+                ((minimumHeight - trailingSize.value!!.height) / 2f).roundToInt() + 8.dp.roundToPx()
             )
         }
     }
@@ -566,7 +566,7 @@
 
         rule.runOnIdleWithDensity {
             assertThat(labelPosition.value?.x).isEqualTo(
-                (ExpectedPadding.toIntPx() + IconPadding.toIntPx() + iconSize.toIntPx())
+                (ExpectedPadding.roundToPx() + IconPadding.roundToPx() + iconSize.roundToPx())
                     .toFloat()
             )
         }
@@ -596,7 +596,7 @@
 
         rule.runOnIdleWithDensity {
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
         }
     }
@@ -610,7 +610,7 @@
                 label = {},
                 isErrorValue = false,
                 leadingIcon = {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(
                             MaterialTheme.colors.onSurface.copy(
                                 IconColorAlpha
@@ -618,7 +618,7 @@
                         )
                 },
                 trailingIcon = {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(
                             MaterialTheme.colors.onSurface.copy(
                                 IconColorAlpha
@@ -638,7 +638,7 @@
                 label = {},
                 isErrorValue = true,
                 leadingIcon = {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(
                             MaterialTheme.colors.onSurface.copy(
                                 IconColorAlpha
@@ -646,7 +646,7 @@
                         )
                 },
                 trailingIcon = {
-                    assertThat(AmbientContentColor.current).isEqualTo(MaterialTheme.colors.error)
+                    assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colors.error)
                 }
             )
         }
@@ -658,7 +658,7 @@
         val textInputService = mock<TextInputService>()
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 var text = remember { mutableStateOf("") }
                 OutlinedTextField(
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt
index fec6fd4..42e842f 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldScreenshotTest.kt
@@ -20,16 +20,16 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.width
-import androidx.compose.material.AmbientContentColor
 import androidx.compose.material.GOLDEN_MATERIAL
+import androidx.compose.material.LocalContentColor
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.material.setMaterialContent
 import androidx.compose.runtime.Providers
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.SemanticsNodeInteraction
@@ -126,7 +126,7 @@
     @Test
     fun textField_focused_rtl() {
         rule.setMaterialContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Box(Modifier.semantics(mergeDescendants = true) {}.testTag(TextFieldTag)) {
                     TextField(
                         value = "",
@@ -178,7 +178,7 @@
     @Test
     fun textField_textColor_fallbackToContentColor() {
         rule.setMaterialContent {
-            Providers(AmbientContentColor provides Color.Green) {
+            Providers(LocalContentColor provides Color.Green) {
                 TextField(
                     value = "Hello, world!",
                     onValueChange = {},
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index bf96756..b11a528 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -30,9 +30,9 @@
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material.AmbientContentAlpha
-import androidx.compose.material.AmbientContentColor
-import androidx.compose.material.AmbientTextStyle
+import androidx.compose.material.LocalContentAlpha
+import androidx.compose.material.LocalContentColor
+import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
@@ -56,8 +56,8 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientTextInputService
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalTextInputService
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.assertHeightIsEqualTo
@@ -219,7 +219,7 @@
         val (focusRequester, parentFocusRequester) = FocusRequester.createRefs()
         lateinit var hostView: View
         rule.setMaterialContent {
-            hostView = AmbientView.current
+            hostView = LocalView.current
             Box {
                 TextField(
                     modifier = Modifier
@@ -250,7 +250,7 @@
         lateinit var softwareKeyboardController: SoftwareKeyboardController
         lateinit var hostView: View
         rule.setMaterialContent {
-            hostView = AmbientView.current
+            hostView = LocalView.current
             Box {
                 TextField(
                     modifier = Modifier
@@ -311,10 +311,10 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // centered position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(labelPosition.value?.y).isEqualTo(
-                ((ExpectedDefaultTextFieldHeight.toIntPx() - labelSize.value!!.height) / 2f)
+                ((ExpectedDefaultTextFieldHeight.roundToPx() - labelSize.value!!.height) / 2f)
                     .roundToInt().toFloat()
             )
         }
@@ -352,10 +352,10 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // centered position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(labelPosition.value?.y).isEqualTo(
-                TextFieldPadding.toIntPx()
+                TextFieldPadding.roundToPx()
             )
         }
     }
@@ -391,10 +391,10 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // centered position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(labelPosition.value?.y).isEqualTo(
-                TextFieldPadding.toIntPx()
+                TextFieldPadding.roundToPx()
             )
         }
     }
@@ -435,10 +435,10 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(baseline.value).isEqualTo(
-                ExpectedBaselineOffset.toIntPx().toFloat()
+                ExpectedBaselineOffset.roundToPx().toFloat()
             )
         }
     }
@@ -475,10 +475,10 @@
             assertThat(labelSize.value?.width).isGreaterThan(0)
             // label's top position
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(baseline.value).isEqualTo(
-                ExpectedBaselineOffset.toIntPx().toFloat()
+                ExpectedBaselineOffset.roundToPx().toFloat()
             )
         }
     }
@@ -518,11 +518,11 @@
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // placeholder's position
             assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(placeholderPosition.value?.y)
                 .isEqualTo(
-                    (ExpectedBaselineOffset.toIntPx() + TopPaddingFilledTextfield.toIntPx())
+                    (ExpectedBaselineOffset.roundToPx() + TopPaddingFilledTextfield.roundToPx())
                         .toFloat()
                 )
         }
@@ -559,14 +559,14 @@
         rule.runOnIdleWithDensity {
             // size
             assertThat(placeholderSize.value).isNotNull()
-            assertThat(placeholderSize.value?.height).isEqualTo(20.dp.toIntPx())
+            assertThat(placeholderSize.value?.height).isEqualTo(20.dp.roundToPx())
             assertThat(placeholderSize.value?.width).isGreaterThan(0)
             // centered position
             assertThat(placeholderPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
             assertThat(placeholderPosition.value?.y).isEqualTo(
-                TextFieldPadding.toIntPx()
+                TextFieldPadding.roundToPx()
             )
         }
     }
@@ -615,8 +615,8 @@
                 placeholder = {
                     Text("placeholder")
                     assertThat(
-                        AmbientContentColor.current.copy(
-                            alpha = AmbientContentAlpha.current
+                        LocalContentColor.current.copy(
+                            alpha = LocalContentAlpha.current
                         )
                     )
                         .isEqualTo(
@@ -624,7 +624,7 @@
                                 alpha = 0.6f
                             )
                         )
-                    assertThat(AmbientTextStyle.current)
+                    assertThat(LocalTextStyle.current)
                         .isEqualTo(MaterialTheme.typography.subtitle1)
                 }
             )
@@ -671,21 +671,21 @@
 
         rule.runOnIdleWithDensity {
             // leading
-            assertThat(leadingSize.value).isEqualTo(IntSize(size.toIntPx(), size.toIntPx()))
-            assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.toIntPx().toFloat())
+            assertThat(leadingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
+            assertThat(leadingPosition.value?.x).isEqualTo(IconPadding.roundToPx().toFloat())
             assertThat(leadingPosition.value?.y).isEqualTo(
-                ((textFieldHeight.toIntPx() - leadingSize.value!!.height) / 2f).roundToInt()
+                ((textFieldHeight.roundToPx() - leadingSize.value!!.height) / 2f).roundToInt()
                     .toFloat()
             )
             // trailing
-            assertThat(trailingSize.value).isEqualTo(IntSize(size.toIntPx(), size.toIntPx()))
+            assertThat(trailingSize.value).isEqualTo(IntSize(size.roundToPx(), size.roundToPx()))
             assertThat(trailingPosition.value?.x).isEqualTo(
-                (textFieldWidth.toIntPx() - IconPadding.toIntPx() - trailingSize.value!!.width)
+                (textFieldWidth.roundToPx() - IconPadding.roundToPx() - trailingSize.value!!.width)
                     .toFloat()
             )
             assertThat(trailingPosition.value?.y)
                 .isEqualTo(
-                    ((textFieldHeight.toIntPx() - trailingSize.value!!.height) / 2f)
+                    ((textFieldHeight.roundToPx() - trailingSize.value!!.height) / 2f)
                         .roundToInt().toFloat()
                 )
         }
@@ -718,7 +718,7 @@
 
         rule.runOnIdleWithDensity {
             assertThat(labelPosition.value?.x).isEqualTo(
-                (ExpectedPadding.toIntPx() + IconPadding.toIntPx() + iconSize.toIntPx())
+                (ExpectedPadding.roundToPx() + IconPadding.roundToPx() + iconSize.roundToPx())
                     .toFloat()
             )
         }
@@ -750,7 +750,7 @@
 
         rule.runOnIdleWithDensity {
             assertThat(labelPosition.value?.x).isEqualTo(
-                ExpectedPadding.toIntPx().toFloat()
+                ExpectedPadding.roundToPx().toFloat()
             )
         }
     }
@@ -764,7 +764,7 @@
                 label = {},
                 isErrorValue = false,
                 leadingIcon = {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(
                             MaterialTheme.colors.onSurface.copy(
                                 IconColorAlpha
@@ -772,7 +772,7 @@
                         )
                 },
                 trailingIcon = {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(
                             MaterialTheme.colors.onSurface.copy(
                                 IconColorAlpha
@@ -792,7 +792,7 @@
                 label = {},
                 isErrorValue = true,
                 leadingIcon = {
-                    assertThat(AmbientContentColor.current)
+                    assertThat(LocalContentColor.current)
                         .isEqualTo(
                             MaterialTheme.colors.onSurface.copy(
                                 IconColorAlpha
@@ -800,7 +800,7 @@
                         )
                 },
                 trailingIcon = {
-                    assertThat(AmbientContentColor.current).isEqualTo(MaterialTheme.colors.error)
+                    assertThat(LocalContentColor.current).isEqualTo(MaterialTheme.colors.error)
                 }
             )
         }
@@ -812,7 +812,7 @@
         val textInputService = mock<TextInputService>()
         rule.setContent {
             Providers(
-                AmbientTextInputService provides textInputService
+                LocalTextInputService provides textInputService
             ) {
                 val text = remember { mutableStateOf("") }
                 TextField(
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
index 593921c..8073544 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
@@ -159,7 +159,7 @@
                 AlertDialogBaselineLayout(
                     title = title?.let {
                         @Composable {
-                            Providers(AmbientContentAlpha provides ContentAlpha.high) {
+                            Providers(LocalContentAlpha provides ContentAlpha.high) {
                                 val textStyle = MaterialTheme.typography.subtitle1
                                 ProvideTextStyle(textStyle, title)
                             }
@@ -167,7 +167,7 @@
                     },
                     text = text?.let {
                         @Composable {
-                            Providers(AmbientContentAlpha provides ContentAlpha.medium) {
+                            Providers(LocalContentAlpha provides ContentAlpha.medium) {
                                 val textStyle = MaterialTheme.typography.body2
                                 ProvideTextStyle(textStyle, text)
                             }
@@ -222,7 +222,7 @@
             if (baseline == AlignmentLine.Unspecified) null else baseline
         } ?: 0
 
-        val titleOffset = TitleBaselineDistanceFromTop.toIntPx()
+        val titleOffset = TitleBaselineDistanceFromTop.roundToPx()
 
         // Place the title so that its first baseline is titleOffset from the top
         val titlePositionY = titleOffset - firstTitleBaseline
@@ -232,9 +232,9 @@
         } ?: 0
 
         val textOffset = if (titlePlaceable == null) {
-            TextBaselineDistanceFromTop.toIntPx()
+            TextBaselineDistanceFromTop.roundToPx()
         } else {
-            TextBaselineDistanceFromTitle.toIntPx()
+            TextBaselineDistanceFromTitle.roundToPx()
         }
 
         // Combined height of title and spacing above
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
index 70ad0fc..0aa591f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
@@ -58,6 +58,7 @@
  * @sample androidx.compose.material.samples.SimpleTopAppBar
  *
  * @param title The title to be displayed in the center of the TopAppBar
+ * @param modifier The [Modifier] to be applied to this TopAppBar
  * @param navigationIcon The navigation icon displayed at the start of the TopAppBar. This should
  * typically be an [IconButton] or [IconToggleButton].
  * @param actions The actions displayed at the end of the TopAppBar. This should typically be
@@ -65,7 +66,7 @@
  * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have
  * no color.
  * @param contentColor The preferred content color provided by this TopAppBar to its children.
- * Defaults to either the matching `onFoo` color for [backgroundColor], or if [backgroundColor]
+ * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor]
  * is not a color from the theme, this will keep the same value set above this TopAppBar.
  * @param elevation the elevation of this TopAppBar.
  */
@@ -85,7 +86,7 @@
         } else {
             Row(TitleIconModifier, verticalAlignment = Alignment.CenterVertically) {
                 Providers(
-                    AmbientContentAlpha provides ContentAlpha.high,
+                    LocalContentAlpha provides ContentAlpha.high,
                     content = navigationIcon
                 )
             }
@@ -96,11 +97,11 @@
             verticalAlignment = Alignment.CenterVertically
         ) {
             ProvideTextStyle(value = MaterialTheme.typography.h6) {
-                Providers(AmbientContentAlpha provides ContentAlpha.high, content = title)
+                Providers(LocalContentAlpha provides ContentAlpha.high, content = title)
             }
         }
 
-        Providers(AmbientContentAlpha provides ContentAlpha.medium) {
+        Providers(LocalContentAlpha provides ContentAlpha.medium) {
             Row(
                 Modifier.fillMaxHeight(),
                 horizontalArrangement = Arrangement.End,
@@ -118,10 +119,11 @@
  * This TopAppBar has no pre-defined slots for content, allowing you to customize the layout of
  * content inside.
  *
+ * @param modifier The [Modifier] to be applied to this TopAppBar
  * @param backgroundColor The background color for the TopAppBar. Use [Color.Transparent] to have
  * no color.
  * @param contentColor The preferred content color provided by this TopAppBar to its children.
- * Defaults to either the matching `onFoo` color for [backgroundColor], or if [backgroundColor] is
+ * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
  * not a color from the theme, this will keep the same value set above this TopAppBar.
  * @param elevation the elevation of this TopAppBar.
  * @param content the content of this TopAppBar.The default layout here is a [Row],
@@ -155,10 +157,11 @@
  *
  * @sample androidx.compose.material.samples.SimpleBottomAppBar
  *
+ * @param modifier The [Modifier] to be applied to this BottomAppBar
  * @param backgroundColor The background color for the BottomAppBar. Use [Color.Transparent] to
  * have no color.
  * @param contentColor The preferred content color provided by this BottomAppBar to its children.
- * Defaults to either the matching `onFoo` color for [backgroundColor], or if [backgroundColor] is
+ * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
  * not a color from the theme, this will keep the same value set above this BottomAppBar.
  * @param cutoutShape the shape of the cutout that will be added to the BottomAppBar - this
  * should typically be the same shape used inside the [FloatingActionButton], when [BottomAppBar]
@@ -177,7 +180,7 @@
     elevation: Dp = BottomAppBarElevation,
     content: @Composable RowScope.() -> Unit
 ) {
-    val fabPlacement = AmbientFabPlacement.current
+    val fabPlacement = LocalFabPlacement.current
     val shape = if (cutoutShape != null && fabPlacement?.isDocked == true) {
         BottomAppBarCutoutShape(cutoutShape, fabPlacement)
     } else {
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt
index 73b029c..17d9658 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BackdropScaffold.kt
@@ -47,8 +47,11 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.SubcomposeLayout
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.semantics.collapse
+import androidx.compose.ui.semantics.expand
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -182,7 +185,7 @@
 @ExperimentalMaterialApi
 fun rememberBackdropScaffoldState(
     initialValue: BackdropValue,
-    clock: AnimationClockObservable = AmbientAnimationClock.current,
+    clock: AnimationClockObservable = LocalAnimationClock.current,
     animationSpec: AnimationSpec<Float> = SwipeableDefaults.AnimationSpec,
     confirmStateChange: (BackdropValue) -> Boolean = { true },
     snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }
@@ -250,13 +253,13 @@
  * @param stickyFrontLayer Whether the front layer should stick to the height of the back layer.
  * @param backLayerBackgroundColor The background color of the back layer.
  * @param backLayerContentColor The preferred content color provided by the back layer to its
- * children. Defaults to the matching `onFoo` color for [backLayerBackgroundColor], or if that
+ * children. Defaults to the matching content color for [backLayerBackgroundColor], or if that
  * is not a color from the theme, this will keep the same content color set above the back layer.
  * @param frontLayerShape The shape of the front layer.
  * @param frontLayerElevation The elevation of the front layer.
  * @param frontLayerBackgroundColor The background color of the front layer.
  * @param frontLayerContentColor The preferred content color provided by the back front to its
- * children. Defaults to the matching `onFoo` color for [frontLayerBackgroundColor], or if that
+ * children. Defaults to the matching content color for [frontLayerBackgroundColor], or if that
  * is not a color from the theme, this will keep the same content color set above the front layer.
  * @param frontLayerScrimColor The color of the scrim applied to the front layer when the back
  * layer is revealed. If you set this to `Color.Transparent`, then a scrim will not be applied
@@ -290,8 +293,8 @@
     backLayerContent: @Composable () -> Unit,
     frontLayerContent: @Composable () -> Unit
 ) {
-    val peekHeightPx = with(AmbientDensity.current) { peekHeight.toPx() }
-    val headerHeightPx = with(AmbientDensity.current) { headerHeight.toPx() }
+    val peekHeightPx = with(LocalDensity.current) { peekHeight.toPx() }
+    val headerHeightPx = with(LocalDensity.current) { headerHeight.toPx() }
 
     val backLayer = @Composable {
         if (persistentAppBar) {
@@ -334,6 +337,13 @@
                     orientation = Orientation.Vertical,
                     enabled = gesturesEnabled
                 )
+                .semantics {
+                    if (scaffoldState.isConcealed) {
+                        collapse { scaffoldState.reveal(); true }
+                    } else {
+                        expand { scaffoldState.conceal(); true }
+                    }
+                }
 
             // Front layer
             Surface(
@@ -414,7 +424,7 @@
     val animationProgress by animateFloatAsState(
         targetValue = if (target == Revealed) 0f else 2f, animationSpec = TweenSpec()
     )
-    val animationSlideOffset = with(AmbientDensity.current) { AnimationSlideOffset.toPx() }
+    val animationSlideOffset = with(LocalDensity.current) { AnimationSlideOffset.toPx() }
 
     val appBarFloat = (animationProgress - 1).coerceIn(0f, 1f)
     val contentFloat = (1 - animationProgress).coerceIn(0f, 1f)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
index 5615682..885900b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
@@ -75,7 +75,7 @@
  * @param modifier optional [Modifier] for this BottomNavigation
  * @param backgroundColor The background color for this BottomNavigation
  * @param contentColor The preferred content color provided by this BottomNavigation to its
- * children. Defaults to either the matching `onFoo` color for [backgroundColor], or if
+ * children. Defaults to either the matching content color for [backgroundColor], or if
  * [backgroundColor] is not a color from the theme, this will keep the same value set above this
  * BottomNavigation.
  * @param elevation elevation for this BottomNavigation
@@ -146,7 +146,7 @@
     label: @Composable (() -> Unit)? = null,
     alwaysShowLabels: Boolean = true,
     interactionState: InteractionState = remember { InteractionState() },
-    selectedContentColor: Color = AmbientContentColor.current,
+    selectedContentColor: Color = LocalContentColor.current,
     unselectedContentColor: Color = selectedContentColor.copy(alpha = ContentAlpha.medium)
 ) {
     val styledLabel: @Composable (() -> Unit)? = label?.let {
@@ -191,15 +191,15 @@
 }
 
 /**
- * Transition that animates [AmbientContentColor] between [inactiveColor] and [activeColor], depending
+ * Transition that animates [LocalContentColor] between [inactiveColor] and [activeColor], depending
  * on [selected]. This component also provides the animation fraction as a parameter to [content],
  * to allow animating the position of the icon and the scale of the label alongside this color
  * animation.
  *
- * @param activeColor [AmbientContentColor] when this item is [selected]
- * @param inactiveColor [AmbientContentColor] when this item is not [selected]
+ * @param activeColor [LocalContentColor] when this item is [selected]
+ * @param inactiveColor [LocalContentColor] when this item is not [selected]
  * @param selected whether this item is selected
- * @param content the content of the [BottomNavigationItem] to animate [AmbientContentColor] for,
+ * @param content the content of the [BottomNavigationItem] to animate [LocalContentColor] for,
  * where the animationProgress is the current progress of the animation from 0f to 1f.
  */
 @Composable
@@ -217,8 +217,8 @@
     val color = lerp(inactiveColor, activeColor, animationProgress)
 
     Providers(
-        AmbientContentColor provides color.copy(alpha = 1f),
-        AmbientContentAlpha provides color.alpha,
+        LocalContentColor provides color.copy(alpha = 1f),
+        LocalContentAlpha provides color.alpha,
     ) {
         content(animationProgress)
     }
@@ -325,7 +325,7 @@
     // have a better strategy than overlapping the icon and label
     val baseline = labelPlaceable[LastBaseline]
 
-    val baselineOffset = CombinedItemTextBaseline.toIntPx()
+    val baselineOffset = CombinedItemTextBaseline.roundToPx()
 
     // Label should be [baselineOffset] from the bottom
     val labelY = height - baseline - baselineOffset
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
index 858ff45..d5c8f59 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
@@ -45,8 +45,11 @@
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.semantics.collapse
+import androidx.compose.ui.semantics.expand
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
@@ -172,7 +175,7 @@
     animationSpec: AnimationSpec<Float> = SwipeableDefaults.AnimationSpec,
     confirmStateChange: (BottomSheetValue) -> Boolean = { true }
 ): BottomSheetState {
-    val disposableClock = AmbientAnimationClock.current.asDisposableClock()
+    val disposableClock = LocalAnimationClock.current.asDisposableClock()
     return rememberSaveable(
         disposableClock,
         saver = BottomSheetState.Saver(
@@ -256,7 +259,7 @@
  * @param sheetElevation The elevation of the bottom sheet.
  * @param sheetBackgroundColor The background color of the bottom sheet.
  * @param sheetContentColor The preferred content color provided by the bottom sheet to its
- * children. Defaults to the matching `onFoo` color for [sheetBackgroundColor], or if that is
+ * children. Defaults to the matching content color for [sheetBackgroundColor], or if that is
  * not a color from the theme, this will keep the same content color set above the bottom sheet.
  * @param sheetPeekHeight The height of the bottom sheet when it is collapsed.
  * @param drawerContent The content of the drawer sheet.
@@ -265,7 +268,7 @@
  * @param drawerElevation The elevation of the drawer sheet.
  * @param drawerBackgroundColor The background color of the drawer sheet.
  * @param drawerContentColor The preferred content color provided by the drawer sheet to its
- * children. Defaults to the matching `onFoo` color for [drawerBackgroundColor], or if that is
+ * children. Defaults to the matching content color for [drawerBackgroundColor], or if that is
  * not a color from the theme, this will keep the same content color set above the drawer sheet.
  * @param drawerScrimColor The color of the scrim that is applied when the drawer is open.
  * @param bodyContent The main content of the screen. You should use the provided [PaddingValues]
@@ -301,7 +304,7 @@
 ) {
     BoxWithConstraints(modifier) {
         val fullHeight = constraints.maxHeight.toFloat()
-        val peekHeightPx = with(AmbientDensity.current) { sheetPeekHeight.toPx() }
+        val peekHeightPx = with(LocalDensity.current) { sheetPeekHeight.toPx() }
         var bottomSheetHeight by remember { mutableStateOf(fullHeight) }
 
         val swipeable = Modifier
@@ -316,6 +319,13 @@
                 enabled = sheetGesturesEnabled,
                 resistance = null
             )
+            .semantics {
+                if (scaffoldState.bottomSheetState.isCollapsed) {
+                    expand { scaffoldState.bottomSheetState.expand(); true }
+                } else {
+                    collapse { scaffoldState.bottomSheetState.collapse(); true }
+                }
+            }
 
         val child = @Composable {
             BottomSheetScaffoldStack(
@@ -410,7 +420,7 @@
 
             val fabOffsetX = when (floatingActionButtonPosition) {
                 FabPosition.Center -> (placeable.width - fabPlaceable.width) / 2
-                FabPosition.End -> placeable.width - fabPlaceable.width - FabEndSpacing.toIntPx()
+                FabPosition.End -> placeable.width - fabPlaceable.width - FabEndSpacing.roundToPx()
             }
             val fabOffsetY = sheetOffsetY - fabPlaceable.height / 2
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
index d812c41..8953539 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
@@ -122,7 +122,7 @@
             indication = null
         )
     ) {
-        Providers(AmbientContentAlpha provides contentColor.alpha) {
+        Providers(LocalContentAlpha provides contentColor.alpha) {
             ProvideTextStyle(
                 value = MaterialTheme.typography.button
             ) {
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt
index 33a2be1..90b5b1a 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Card.kt
@@ -34,7 +34,7 @@
  *  displayed if the [elevation] is greater than zero.
  * @param backgroundColor The background color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching `onFoo` color for [backgroundColor], or if [backgroundColor]
+ * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor]
  * is not a color from the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the card
  * @param elevation The z-coordinate at which to place this surface. This controls
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
index ddf8d43..b1c7b34 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
@@ -21,7 +21,7 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.takeOrElse
@@ -266,25 +266,25 @@
  * [backgroundColor] is [Colors.primary], this will return [Colors.onPrimary].
  *
  * If [backgroundColor] does not match a background color in the theme, this will return
- * the current value of [AmbientContentColor] as a best-effort color.
+ * the current value of [LocalContentColor] as a best-effort color.
  *
  * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
- * the theme's [Colors], then returns the current value of [AmbientContentColor].
+ * the theme's [Colors], then returns the current value of [LocalContentColor].
  *
  * @see Colors.contentColorFor
  */
 @Composable
 fun contentColorFor(backgroundColor: Color) =
-    MaterialTheme.colors.contentColorFor(backgroundColor).takeOrElse { AmbientContentColor.current }
+    MaterialTheme.colors.contentColorFor(backgroundColor).takeOrElse { LocalContentColor.current }
 
 /**
  * Updates the internal values of the given [Colors] with values from the [other] [Colors]. This
  * allows efficiently updating a subset of [Colors], without recomposing every composable that
- * consumes values from [AmbientColors].
+ * consumes values from [LocalColors].
  *
  * Because [Colors] is very wide-reaching, and used by many expensive composables in the
- * hierarchy, providing a new value to [AmbientColors] causes every composable consuming
- * [AmbientColors] to recompose, which is prohibitively expensive in cases such as animating one
+ * hierarchy, providing a new value to [LocalColors] causes every composable consuming
+ * [LocalColors] to recompose, which is prohibitively expensive in cases such as animating one
  * color in the theme. Instead, [Colors] is internally backed by [mutableStateOf], and this
  * function mutates the internal state of [this] to match values in [other]. This means that any
  * changes will mutate the internal state of [this], and only cause composables that are reading
@@ -307,11 +307,11 @@
 }
 
 /**
- * Ambient used to pass [Colors] down the tree.
+ * CompositionLocal used to pass [Colors] down the tree.
  *
  * Setting the value here is typically done as part of [MaterialTheme], which will
  * automatically handle efficiently updating any changed colors without causing unnecessary
  * recompositions, using [Colors.updateColorsFrom].
- * To retrieve the current value of this ambient, use [MaterialTheme.colors].
+ * To retrieve the current value of this CompositionLocal, use [MaterialTheme.colors].
  */
-internal val AmbientColors = staticAmbientOf { lightColors() }
+internal val LocalColors = staticCompositionLocalOf { lightColors() }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt
index 888d2f1..fe75875 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentAlpha.kt
@@ -17,13 +17,13 @@
 package androidx.compose.material
 
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.ui.graphics.luminance
 
 /**
  * Default alpha levels used by Material components.
  *
- * See [AmbientContentAlpha].
+ * See [LocalContentAlpha].
  */
 object ContentAlpha {
     /**
@@ -74,7 +74,7 @@
         /*@FloatRange(from = 0.0, to = 1.0)*/
         lowContrastAlpha: Float
     ): Float {
-        val contentColor = AmbientContentColor.current
+        val contentColor = LocalContentColor.current
         val lightTheme = MaterialTheme.colors.isLight
         return if (lightTheme) {
             if (contentColor.luminance() > 0.5) highContrastAlpha else lowContrastAlpha
@@ -85,8 +85,8 @@
 }
 
 /**
- * Ambient containing the preferred content alpha for a given position in the hierarchy. This
- * alpha is used for text and iconography ([Text] and [Icon]) to emphasize / de-emphasize
+ * CompositionLocal containing the preferred content alpha for a given position in the hierarchy.
+ * This alpha is used for text and iconography ([Text] and [Icon]) to emphasize / de-emphasize
  * different parts of a component. See the Material guide on
  * [Text Legibility](https://material.io/design/color/text-legibility.html) for more information on
  * alpha levels used by text and iconography.
@@ -98,7 +98,30 @@
  *
  * @sample androidx.compose.material.samples.ContentAlphaSample
  */
-val AmbientContentAlpha = ambientOf { 1f }
+@Deprecated(
+    "Renamed to LocalContentAlpha",
+    replaceWith = ReplaceWith(
+        "LocalContentAlpha",
+        "androidx.compose.material.LocalContentAlpha"
+    )
+)
+val AmbientContentAlpha get() = LocalContentAlpha
+
+/**
+ * CompositionLocal containing the preferred content alpha for a given position in the hierarchy.
+ * This alpha is used for text and iconography ([Text] and [Icon]) to emphasize / de-emphasize
+ * different parts of a component. See the Material guide on
+ * [Text Legibility](https://material.io/design/color/text-legibility.html) for more information on
+ * alpha levels used by text and iconography.
+ *
+ * See [ContentAlpha] for the default levels used by most Material components.
+ *
+ * [MaterialTheme] sets this to [ContentAlpha.high] by default, as this is the default alpha for
+ * body text.
+ *
+ * @sample androidx.compose.material.samples.ContentAlphaSample
+ */
+val LocalContentAlpha = compositionLocalOf { 1f }
 
 /**
  * Alpha levels for high luminance content in light theme, or low luminance content in dark theme.
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentColor.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentColor.kt
index 2b79586..8ce2990 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentColor.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ContentColor.kt
@@ -16,12 +16,12 @@
 
 package androidx.compose.material
 
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.ui.graphics.Color
 
 /**
- * Ambient containing the preferred content color for a given position in the hierarchy. This
- * typically represents the `on` color for a color in [Colors]. For example, if the background
+ * CompositionLocal containing the preferred content color for a given position in the hierarchy.
+ * This typically represents the `on` color for a color in [Colors]. For example, if the background
  * color is [Colors.surface], this color is typically set to [Colors.onSurface].
  *
  * This color should be used for any typography / iconography, to ensure that the color of these
@@ -30,4 +30,24 @@
  *
  * Defaults to [Color.Black] if no color has been explicitly set.
  */
-val AmbientContentColor = ambientOf { Color.Black }
+@Deprecated(
+    "Renamed to LocalContentColor",
+    replaceWith = ReplaceWith(
+        "LocalContentColor",
+        "androidx.compose.material.LocalContentColor"
+    )
+)
+val AmbientContentColor get() = LocalContentColor
+
+/**
+ * CompositionLocal containing the preferred content color for a given position in the hierarchy.
+ * This typically represents the `on` color for a color in [Colors]. For example, if the background
+ * color is [Colors.surface], this color is typically set to [Colors.onSurface].
+ *
+ * This color should be used for any typography / iconography, to ensure that the color of these
+ * adjusts when the background color changes. For example, on a dark background, text should be
+ * light, and on a light background, text should be dark.
+ *
+ * Defaults to [Color.Black] if no color has been explicitly set.
+ */
+val LocalContentColor = compositionLocalOf { Color.Black }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt
index 00d07b9..c30b65e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Drawer.kt
@@ -41,9 +41,9 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.semantics.dismiss
 import androidx.compose.ui.semantics.paneTitle
 import androidx.compose.ui.semantics.semantics
@@ -285,7 +285,7 @@
     initialValue: DrawerValue,
     confirmStateChange: (DrawerValue) -> Boolean = { true }
 ): DrawerState {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     return rememberSaveable(
         clock,
         saver = DrawerState.Saver(clock, confirmStateChange)
@@ -305,7 +305,7 @@
     initialValue: BottomDrawerValue,
     confirmStateChange: (BottomDrawerValue) -> Boolean = { true }
 ): BottomDrawerState {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     return rememberSaveable(
         clock,
         saver = BottomDrawerState.Saver(clock, confirmStateChange)
@@ -334,7 +334,7 @@
  * drawer sheet
  * @param drawerBackgroundColor background color to be used for the drawer sheet
  * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching `onFoo` color for [drawerBackgroundColor], or, if it is not a color from
+ * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
  * the theme, this will keep the same value set above this Surface.
  * @param scrimColor color of the scrim that obscures content when the drawer is open
  * @param bodyContent content of the rest of the UI
@@ -366,7 +366,7 @@
         val maxValue = 0f
 
         val anchors = mapOf(minValue to DrawerValue.Closed, maxValue to DrawerValue.Open)
-        val isRtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+        val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
         val blockClicks = if (drawerState.isOpen) {
             Modifier.pointerInput { detectTapGestures {} }
         } else {
@@ -394,7 +394,7 @@
                 color = scrimColor
             )
             Surface(
-                modifier = with(AmbientDensity.current) {
+                modifier = with(LocalDensity.current) {
                     Modifier
                         .preferredSizeIn(
                             minWidth = modalDrawerConstraints.minWidth.toDp(),
@@ -445,7 +445,7 @@
  * @param drawerContent composable that represents content inside the drawer
  * @param drawerBackgroundColor background color to be used for the drawer sheet
  * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching `onFoo` color for [drawerBackgroundColor], or, if it is not a color from
+ * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
  * the theme, this will keep the same value set above this Surface.
  * @param scrimColor color of the scrim that obscures content when the drawer is open
  * @param bodyContent content of the rest of the UI
@@ -525,7 +525,7 @@
                 color = scrimColor
             )
             Surface(
-                modifier = with(AmbientDensity.current) {
+                modifier = with(LocalDensity.current) {
                     Modifier.preferredSizeIn(
                         minWidth = modalDrawerConstraints.minWidth.toDp(),
                         minHeight = modalDrawerConstraints.minHeight.toDp(),
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt
index afb38dc..29e7c2c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Elevation.kt
@@ -22,7 +22,7 @@
 import androidx.compose.animation.core.FastOutSlowInEasing
 import androidx.compose.animation.core.TweenSpec
 import androidx.compose.foundation.Interaction
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
@@ -116,11 +116,28 @@
 )
 
 /**
- * Ambient containing the current absolute elevation provided by [Surface] components. This
+ * CompositionLocal containing the current absolute elevation provided by [Surface] components. This
  * absolute elevation is a sum of all the previous elevations. Absolute elevation is only
  * used for calculating elevation overlays in dark theme, and is *not* used for drawing the
  * shadow in a [Surface]. See [ElevationOverlay] for more information on elevation overlays.
  *
  * @sample androidx.compose.material.samples.AbsoluteElevationSample
  */
-val AmbientAbsoluteElevation = ambientOf { 0.dp }
+@Deprecated(
+    "Renamed to LocalAbsoluteElevation",
+    replaceWith = ReplaceWith(
+        "LocalAbsoluteElevation",
+        "androidx.compose.material.LocalAbsoluteElevation"
+    )
+)
+val AmbientAbsoluteElevation get() = LocalAbsoluteElevation
+
+/**
+ * CompositionLocal containing the current absolute elevation provided by [Surface] components. This
+ * absolute elevation is a sum of all the previous elevations. Absolute elevation is only
+ * used for calculating elevation overlays in dark theme, and is *not* used for drawing the
+ * shadow in a [Surface]. See [ElevationOverlay] for more information on elevation overlays.
+ *
+ * @sample androidx.compose.material.samples.AbsoluteElevationSample
+ */
+val LocalAbsoluteElevation = compositionLocalOf { 0.dp }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt
index 665ce3b..eab76f1 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ElevationOverlay.kt
@@ -16,11 +16,10 @@
 
 package androidx.compose.material
 
-import androidx.compose.runtime.Ambient
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.ProvidableAmbient
+import androidx.compose.runtime.ProvidableCompositionLocal
 import androidx.compose.runtime.ReadOnlyComposable
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.unit.Dp
@@ -28,14 +27,29 @@
 import kotlin.math.ln
 
 /**
- * [Ambient] containing the [ElevationOverlay] used by [Surface] components. Provide `null` to
- * turn off [ElevationOverlay]s for the children within this [Ambient].
+ * CompositionLocal containing the [ElevationOverlay] used by [Surface] components. Provide
+ * `null` to turn off [ElevationOverlay]s for the children within this CompositionLocal..
  *
  * @see ElevationOverlay
  */
-val AmbientElevationOverlay: ProvidableAmbient<ElevationOverlay?> = staticAmbientOf {
-    DefaultElevationOverlay
-}
+@Deprecated(
+    "Renamed to LocalElevationOverlay",
+    replaceWith = ReplaceWith(
+        "LocalElevationOverlay",
+        "androidx.compose.material.LocalElevationOverlay"
+    )
+)
+val AmbientElevationOverlay: ProvidableCompositionLocal<ElevationOverlay?>
+    get() = LocalElevationOverlay
+
+/**
+ * CompositionLocal containing the [ElevationOverlay] used by [Surface] components. Provide
+ * `null` to turn off [ElevationOverlay]s for the children within this CompositionLocal..
+ *
+ * @see ElevationOverlay
+ */
+val LocalElevationOverlay: ProvidableCompositionLocal<ElevationOverlay?> =
+    staticCompositionLocalOf { DefaultElevationOverlay }
 
 // TODO: make this a fun interface
 /**
@@ -48,7 +62,7 @@
  * the Material specification for
  * [Dark Theme](https://material.io/design/color/dark-theme.html#properties).
  *
- * See [AmbientElevationOverlay] to provide your own [ElevationOverlay]. You can provide `null`
+ * See [LocalElevationOverlay] to provide your own [ElevationOverlay]. You can provide `null`
  * to have no ElevationOverlay applied.
  */
 interface ElevationOverlay {
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
index d658936..f608625 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
@@ -95,7 +95,7 @@
         contentColor = contentColor,
         elevation = elevation.elevation(interactionState).value
     ) {
-        Providers(AmbientContentAlpha provides contentColor.alpha) {
+        Providers(LocalContentAlpha provides contentColor.alpha) {
             ProvideTextStyle(MaterialTheme.typography.button) {
                 Box(
                     modifier = Modifier
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt
index e050dc5..2eeb8a2 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Icon.kt
@@ -38,7 +38,7 @@
 import androidx.compose.ui.unit.dp
 
 /**
- * Icon component that draws [imageVector] using [tint], defaulting to [AmbientContentColor]. For a
+ * Icon component that draws [imageVector] using [tint], defaulting to [LocalContentColor]. For a
  * clickable icon, see [IconButton].
  *
  * @param imageVector [ImageVector] to draw inside this Icon
@@ -55,7 +55,7 @@
     imageVector: ImageVector,
     contentDescription: String?,
     modifier: Modifier = Modifier,
-    tint: Color = AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
+    tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
 ) {
     Icon(
         painter = rememberVectorPainter(imageVector),
@@ -66,7 +66,7 @@
 }
 
 /**
- * Icon component that draws [bitmap] using [tint], defaulting to [AmbientContentColor]. For a
+ * Icon component that draws [bitmap] using [tint], defaulting to [LocalContentColor]. For a
  * clickable icon, see [IconButton].
  *
  * @param bitmap [ImageBitmap] to draw inside this Icon
@@ -83,7 +83,7 @@
     bitmap: ImageBitmap,
     contentDescription: String?,
     modifier: Modifier = Modifier,
-    tint: Color = AmbientContentColor.current
+    tint: Color = LocalContentColor.current
 ) {
     val painter = remember(bitmap) { ImagePainter(bitmap) }
     Icon(
@@ -95,7 +95,7 @@
 }
 
 /**
- * Icon component that draws a [painter] using [tint], defaulting to [AmbientContentColor]. For a
+ * Icon component that draws a [painter] using [tint], defaulting to [LocalContentColor]. For a
  * clickable icon, see [IconButton].
  *
  * @param painter [Painter] to draw inside this Icon
@@ -112,7 +112,7 @@
     painter: Painter,
     contentDescription: String?,
     modifier: Modifier = Modifier,
-    tint: Color = AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
+    tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
 ) {
     // TODO: consider allowing developers to override the intrinsic size, and specify their own
     // size that this icon will be forced to take up.
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
index 40b52dc..eebfa54 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
@@ -360,7 +360,7 @@
             } else 0
             val topPadding = max(
                 0,
-                offsets[index].toIntPx() - placeable[FirstBaseline] - toPreviousBaseline
+                offsets[index].roundToPx() - placeable[FirstBaseline] - toPreviousBaseline
             )
             y[index] = topPadding + containerHeight
             containerHeight += topPadding + placeable.height
@@ -393,7 +393,7 @@
         val y: Int
         val containerHeight: Int
         if (baseline != AlignmentLine.Unspecified) {
-            y = offset.toIntPx() - baseline
+            y = offset.roundToPx() - baseline
             containerHeight = max(constraints.minHeight, y + placeable.height)
         } else {
             containerHeight = max(constraints.minHeight, placeable.height)
@@ -416,7 +416,7 @@
 ): @Composable (() -> Unit)? {
     if (icon == null) return null
     return {
-        Providers(AmbientContentAlpha provides contentAlpha) {
+        Providers(LocalContentAlpha provides contentAlpha) {
             ProvideTextStyle(textStyle, icon)
         }
     }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
index edd478b..aea6370 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
@@ -22,7 +22,7 @@
 import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.graphics.luminance
 import androidx.compose.ui.graphics.takeOrElse
-import androidx.compose.ui.selection.TextSelectionColors
+import androidx.compose.foundation.text.selection.TextSelectionColors
 import kotlin.math.max
 import kotlin.math.min
 
@@ -41,7 +41,7 @@
     // text shouldn't be selectable / is noted as disabled for accessibility purposes.
     val textColorWithLowestAlpha = colors.contentColorFor(backgroundColor)
         .takeOrElse {
-            AmbientContentColor.current
+            LocalContentColor.current
         }.copy(
             alpha = ContentAlpha.medium
         )
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt
index a3517a6..3ee4e75 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTheme.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.material
 
-import androidx.compose.foundation.AmbientIndication
 import androidx.compose.foundation.Indication
-import androidx.compose.material.ripple.AmbientRippleTheme
+import androidx.compose.foundation.LocalIndication
 import androidx.compose.material.ripple.ExperimentalRippleApi
+import androidx.compose.material.ripple.LocalRippleTheme
 import androidx.compose.material.ripple.RippleTheme
 import androidx.compose.material.ripple.rememberRipple
 import androidx.compose.runtime.Composable
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.ReadOnlyComposable
 import androidx.compose.runtime.remember
-import androidx.compose.ui.selection.AmbientTextSelectionColors
+import androidx.compose.foundation.text.selection.LocalTextSelectionColors
 
 /**
  * A MaterialTheme defines the styling principles from the Material design specification.
@@ -72,13 +72,13 @@
     }
     val selectionColors = rememberTextSelectionColors(rememberedColors)
     Providers(
-        AmbientColors provides rememberedColors,
-        AmbientContentAlpha provides ContentAlpha.high,
-        AmbientIndication provides indicationFactory,
-        AmbientRippleTheme provides MaterialRippleTheme,
-        AmbientShapes provides shapes,
-        AmbientTextSelectionColors provides selectionColors,
-        AmbientTypography provides typography
+        LocalColors provides rememberedColors,
+        LocalContentAlpha provides ContentAlpha.high,
+        LocalIndication provides indicationFactory,
+        LocalRippleTheme provides MaterialRippleTheme,
+        LocalShapes provides shapes,
+        LocalTextSelectionColors provides selectionColors,
+        LocalTypography provides typography
     ) {
         ProvideTextStyle(value = typography.body1, content = content)
     }
@@ -97,7 +97,7 @@
     val colors: Colors
         @Composable
         @ReadOnlyComposable
-        get() = AmbientColors.current
+        get() = LocalColors.current
 
     /**
      * Retrieves the current [Typography] at the call site's position in the hierarchy.
@@ -107,7 +107,7 @@
     val typography: Typography
         @Composable
         @ReadOnlyComposable
-        get() = AmbientTypography.current
+        get() = LocalTypography.current
 
     /**
      * Retrieves the current [Shapes] at the call site's position in the hierarchy.
@@ -115,7 +115,7 @@
     val shapes: Shapes
         @Composable
         @ReadOnlyComposable
-        get() = AmbientShapes.current
+        get() = LocalShapes.current
 }
 
 @OptIn(ExperimentalRippleApi::class)
@@ -123,13 +123,13 @@
 private object MaterialRippleTheme : RippleTheme {
     @Composable
     override fun defaultColor() = RippleTheme.defaultRippleColor(
-        contentColor = AmbientContentColor.current,
+        contentColor = LocalContentColor.current,
         lightTheme = MaterialTheme.colors.isLight
     )
 
     @Composable
     override fun rippleAlpha() = RippleTheme.defaultRippleAlpha(
-        contentColor = AmbientContentColor.current,
+        contentColor = LocalContentColor.current,
         lightTheme = MaterialTheme.colors.isLight
     )
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
index 50c6d03..81521fe 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
@@ -46,10 +46,10 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.DpOffset
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -64,128 +64,126 @@
 /**
  * A Material Design [dropdown menu](https://material.io/components/menus#dropdown-menu).
  *
- * The menu has a [toggle], which is the element generating the menu. For example, this can be
- * an icon which, when tapped, triggers the menu.
- * The content of the [DropdownMenu] can be [DropdownMenuItem]s, as well as custom content.
- * [DropdownMenuItem] can be used to achieve items as defined by the Material Design spec.
+ * A [DropdownMenu] behaves similarly to a [Popup], and will use the position of the parent layout
+ * to position itself on screen. Commonly a [DropdownMenu] will be placed in a [Box] with a sibling
+ * that will be used as the 'anchor'. Note that a [DropdownMenu] by itself will not take up any
+ * space in a layout, as the menu is displayed in a separate window, on top of other content.
+ *
+ * The [content] of a [DropdownMenu] will typically be [DropdownMenuItem]s, as well as custom
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
+ * specification for menus.
+ *
  * [onDismissRequest] will be called when the menu should close - for example when there is a
  * tap outside the menu, or when the back key is pressed.
- * The menu will do a best effort to be fully visible on screen. It will try to expand
- * horizontally, depending on layout direction, to the end of the [toggle], then to the start of
- * the [toggle], and then screen end-aligned. Vertically, it will try to expand to the bottom
- * of the [toggle], then from the top of the [toggle], and then screen top-aligned. A
- * [dropdownOffset] can be provided to adjust the positioning of the menu for cases when the
- * layout bounds of the [toggle] do not coincide with its visual bounds. Note the offset will be
- * applied in the direction in which the menu will decide to expand.
+ *
+ * [DropdownMenu] changes its positioning depending on the available space, always trying to be
+ * fully visible. It will try to expand horizontally, depending on layout direction, to the end of
+ * its parent, then to the start of its parent, and then screen end-aligned. Vertically, it will
+ * try to expand to the bottom of its parent, then from the top of its parent, and then screen
+ * top-aligned. An [offset] can be provided to adjust the positioning of the menu for cases when
+ * the layout bounds of its parent do not coincide with its visual bounds. Note the offset will
+ * be applied in the direction in which the menu will decide to expand.
  *
  * Example usage:
  * @sample androidx.compose.material.samples.MenuSample
  *
- * @param toggle The element generating the menu
- * @param expanded Whether the menu is currently open or dismissed
- * @param onDismissRequest Called when the menu should be dismiss
- * @param toggleModifier The modifier to be applied to the toggle
- * @param dropdownOffset Offset to be added to the position of the menu
- * @param dropdownModifier Modifier to be applied to the menu content
+ * @param expanded Whether the menu is currently open and visible to the user
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
+ * tapping outside the menu's bounds
+ * @param offset [DpOffset] to be added to the position of the menu
  */
 @Suppress("ModifierParameter")
 @Composable
 fun DropdownMenu(
-    toggle: @Composable () -> Unit,
     expanded: Boolean,
     onDismissRequest: () -> Unit,
-    toggleModifier: Modifier = Modifier,
-    dropdownOffset: DpOffset = DpOffset(0.dp, 0.dp),
-    dropdownModifier: Modifier = Modifier,
-    dropdownContent: @Composable ColumnScope.() -> Unit
+    modifier: Modifier = Modifier,
+    offset: DpOffset = DpOffset(0.dp, 0.dp),
+    content: @Composable ColumnScope.() -> Unit
 ) {
     val expandedStates = remember { MutableTransitionState(false) }
     expandedStates.targetState = expanded
 
-    Box(toggleModifier) {
-        toggle()
+    if (expandedStates.currentState || expandedStates.targetState) {
+        val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
+        val density = LocalDensity.current
+        val popupPositionProvider = DropdownMenuPositionProvider(
+            offset,
+            density
+        ) { parentBounds, menuBounds ->
+            transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+        }
 
-        if (expandedStates.currentState || expandedStates.targetState) {
-            val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
-            val density = AmbientDensity.current
-            val popupPositionProvider = DropdownMenuPositionProvider(
-                dropdownOffset,
-                density
-            ) { parentBounds, menuBounds ->
-                transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+        Popup(
+            isFocusable = true,
+            onDismissRequest = onDismissRequest,
+            popupPositionProvider = popupPositionProvider
+        ) {
+            // Menu open/close animation.
+            val transition = updateTransition(expandedStates, "DropDownMenu")
+
+            val scale by transition.animateFloat(
+                transitionSpec = {
+                    if (false isTransitioningTo true) {
+                        // Dismissed to expanded
+                        tween(
+                            durationMillis = InTransitionDuration,
+                            easing = LinearOutSlowInEasing
+                        )
+                    } else {
+                        // Expanded to dismissed.
+                        tween(
+                            durationMillis = 1,
+                            delayMillis = OutTransitionDuration - 1
+                        )
+                    }
+                }
+            ) {
+                if (it) {
+                    // Menu is expanded.
+                    1f
+                } else {
+                    // Menu is dismissed.
+                    0.8f
+                }
             }
 
-            Popup(
-                isFocusable = true,
-                onDismissRequest = onDismissRequest,
-                popupPositionProvider = popupPositionProvider
+            val alpha by transition.animateFloat(
+                transitionSpec = {
+                    if (false isTransitioningTo true) {
+                        // Dismissed to expanded
+                        tween(durationMillis = 30)
+                    } else {
+                        // Expanded to dismissed.
+                        tween(durationMillis = OutTransitionDuration)
+                    }
+                }
             ) {
-                // Menu open/close animation.
-                val transition = updateTransition(expandedStates, "DropDownMenu")
-
-                val scale by transition.animateFloat(
-                    transitionSpec = {
-                        if (false isTransitioningTo true) {
-                            // Dismissed to expanded
-                            tween(
-                                durationMillis = InTransitionDuration,
-                                easing = LinearOutSlowInEasing
-                            )
-                        } else {
-                            // Expanded to dismissed.
-                            tween(
-                                durationMillis = 1,
-                                delayMillis = OutTransitionDuration - 1
-                            )
-                        }
-                    }
-                ) {
-                    if (it) {
-                        // Menu is expanded.
-                        1f
-                    } else {
-                        // Menu is dismissed.
-                        0.8f
-                    }
+                if (it) {
+                    // Menu is expanded.
+                    1f
+                } else {
+                    // Menu is dismissed.
+                    0f
                 }
-
-                val alpha by transition.animateFloat(
-                    transitionSpec = {
-                        if (false isTransitioningTo true) {
-                            // Dismissed to expanded
-                            tween(durationMillis = 30)
-                        } else {
-                            // Expanded to dismissed.
-                            tween(durationMillis = OutTransitionDuration)
-                        }
-                    }
-                ) {
-                    if (it) {
-                        // Menu is expanded.
-                        1f
-                    } else {
-                        // Menu is dismissed.
-                        0f
-                    }
-                }
-                Card(
-                    modifier = Modifier.graphicsLayer {
-                        scaleX = scale
-                        scaleY = scale
-                        this.alpha = alpha
-                        transformOrigin = transformOriginState.value
-                    },
-                    elevation = MenuElevation
-                ) {
-                    @OptIn(ExperimentalLayout::class)
-                    Column(
-                        modifier = dropdownModifier
-                            .padding(vertical = DropdownMenuVerticalPadding)
-                            .preferredWidth(IntrinsicSize.Max)
-                            .verticalScroll(rememberScrollState()),
-                        content = dropdownContent
-                    )
-                }
+            }
+            Card(
+                modifier = Modifier.graphicsLayer {
+                    scaleX = scale
+                    scaleY = scale
+                    this.alpha = alpha
+                    transformOrigin = transformOriginState.value
+                },
+                elevation = MenuElevation
+            ) {
+                @OptIn(ExperimentalLayout::class)
+                Column(
+                    modifier = modifier
+                        .padding(vertical = DropdownMenuVerticalPadding)
+                        .preferredWidth(IntrinsicSize.Max)
+                        .verticalScroll(rememberScrollState()),
+                    content = content
+                )
             }
         }
     }
@@ -236,7 +234,7 @@
         val typography = MaterialTheme.typography
         ProvideTextStyle(typography.subtitle1) {
             val contentAlpha = if (enabled) ContentAlpha.high else ContentAlpha.disabled
-            Providers(AmbientContentAlpha provides contentAlpha, content = content)
+            Providers(LocalContentAlpha provides contentAlpha, content = content)
         }
     }
 }
@@ -255,8 +253,8 @@
 internal const val OutTransitionDuration = 75
 
 private fun calculateTransformOrigin(
-    parentBounds: IntBounds,
-    menuBounds: IntBounds
+    parentBounds: IntRect,
+    menuBounds: IntRect
 ): TransformOrigin {
     val pivotX = when {
         menuBounds.left >= parentBounds.right -> 0f
@@ -297,19 +295,19 @@
 internal data class DropdownMenuPositionProvider(
     val contentOffset: DpOffset,
     val density: Density,
-    val onPositionCalculated: (IntBounds, IntBounds) -> Unit = { _, _ -> }
+    val onPositionCalculated: (IntRect, IntRect) -> Unit = { _, _ -> }
 ) : PopupPositionProvider {
     override fun calculatePosition(
-        anchorBounds: IntBounds,
+        anchorBounds: IntRect,
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
     ): IntOffset {
         // The min margin above and below the menu, relative to the screen.
-        val verticalMargin = with(density) { MenuVerticalMargin.toIntPx() }
+        val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }
         // The content offset specified using the dropdown offset parameter.
-        val contentOffsetX = with(density) { contentOffset.x.toIntPx() }
-        val contentOffsetY = with(density) { contentOffset.y.toIntPx() }
+        val contentOffsetX = with(density) { contentOffset.x.roundToPx() }
+        val contentOffsetY = with(density) { contentOffset.y.roundToPx() }
 
         // Compute horizontal position.
         val toRight = anchorBounds.left + contentOffsetX
@@ -336,7 +334,7 @@
 
         onPositionCalculated(
             anchorBounds,
-            IntBounds(x, y, x + popupContentSize.width, y + popupContentSize.height)
+            IntRect(x, y, x + popupContentSize.width, y + popupContentSize.height)
         )
         return IntOffset(x, y)
     }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt
index 327a1ff..e90a886 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ModalBottomSheet.kt
@@ -42,7 +42,11 @@
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.SubcomposeLayout
-import androidx.compose.ui.platform.AmbientAnimationClock
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.semantics.collapse
+import androidx.compose.ui.semantics.dismiss
+import androidx.compose.ui.semantics.expand
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -98,13 +102,15 @@
     val isVisible: Boolean
         get() = value != ModalBottomSheetValue.Hidden
 
-    private val isHalfExpandedEnabled: Boolean
+    internal val isHalfExpandedEnabled: Boolean
         get() = anchors.values.contains(ModalBottomSheetValue.HalfExpanded)
 
     /**
-     * Show the bottom sheet, with an animation.
+     * Show the bottom sheet, with an animation. If half expand is enabled, the bottom sheet will
+     * be half expanded. Otherwise it will be fully expanded.
      *
      * @param onShown Optional callback invoked when the bottom sheet has been shown.
+     * @see expand
      */
     fun show(onShown: (() -> Unit)? = null) {
         val targetValue =
@@ -122,6 +128,44 @@
     }
 
     /**
+     * Half expand the bottom sheet if half expand is enabled, with an animation.
+     *
+     * @param onHalfExpand Optional callback invoked when the bottom sheet has been half-expanded.
+     */
+    fun halfExpand(onHalfExpand: (() -> Unit)? = null) {
+        if (!isHalfExpandedEnabled) {
+            return
+        }
+        animateTo(
+            targetValue = ModalBottomSheetValue.HalfExpanded,
+            onEnd = { endReason, _ ->
+                @Suppress("Deprecation")
+                if (endReason == AnimationEndReason.TargetReached) {
+                    onHalfExpand?.invoke()
+                }
+            }
+        )
+    }
+
+    /**
+     * Fully expand the bottom sheet, with an animation.
+     *
+     * @param onExpand Optional callback invoked when the bottom sheet has been expanded.
+     * @see show
+     */
+    fun expand(onExpand: (() -> Unit)? = null) {
+        animateTo(
+            targetValue = ModalBottomSheetValue.Expanded,
+            onEnd = { endReason, _ ->
+                @Suppress("Deprecation")
+                if (endReason == AnimationEndReason.TargetReached) {
+                    onExpand?.invoke()
+                }
+            }
+        )
+    }
+
+    /**
      * Hide the bottom sheet, with an animation.
      *
      * @param onHidden Optional callback invoked when the bottom sheet has been hidden.
@@ -164,7 +208,7 @@
 
 /**
  * Create a [ModalBottomSheetState] and [remember] it against the [clock]. If a clock is not
- * specified, the default animation clock will be used, as provided by [AnimationClockAmbient].
+ * specified, the default animation clock will be used, as provided by [LocalAnimationClock].
  *
  * @param initialValue The initial value of the state.
  * @param clock The animation clock that will be used to drive the animations.
@@ -175,7 +219,7 @@
 @ExperimentalMaterialApi
 fun rememberModalBottomSheetState(
     initialValue: ModalBottomSheetValue,
-    clock: AnimationClockObservable = AmbientAnimationClock.current,
+    clock: AnimationClockObservable = LocalAnimationClock.current,
     animationSpec: AnimationSpec<Float> = SwipeableDefaults.AnimationSpec,
     confirmStateChange: (ModalBottomSheetValue) -> Boolean = { true }
 ): ModalBottomSheetState {
@@ -213,7 +257,7 @@
  * @param sheetElevation The elevation of the bottom sheet.
  * @param sheetBackgroundColor The background color of the bottom sheet.
  * @param sheetContentColor The preferred content color provided by the bottom sheet to its
- * children. Defaults to the matching `onFoo` color for [sheetBackgroundColor], or if that is not
+ * children. Defaults to the matching content color for [sheetBackgroundColor], or if that is not
  * a color from the theme, this will keep the same content color set above the bottom sheet.
  * @param scrimColor The color of the scrim that is applied to the rest of the screen when the
  * bottom sheet is visible. If you set this to `Color.Transparent`, then a scrim will no longer be
@@ -240,7 +284,17 @@
             Modifier
                 .fillMaxWidth()
                 .nestedScroll(sheetState.nestedScrollConnection)
-                .offset { IntOffset(0, sheetState.offset.value.roundToInt()) },
+                .offset { IntOffset(0, sheetState.offset.value.roundToInt()) }
+                .semantics {
+                    if (sheetState.isVisible) {
+                        dismiss { sheetState.hide(); true }
+                        if (sheetState.value == ModalBottomSheetValue.HalfExpanded) {
+                            expand { sheetState.expand(); true }
+                        } else if (sheetState.isHalfExpandedEnabled) {
+                            collapse { sheetState.halfExpand(); true }
+                        }
+                    }
+                },
             shape = sheetShape,
             elevation = sheetElevation,
             color = sheetBackgroundColor,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
index 2f919c026..0f8d993 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
@@ -75,7 +75,7 @@
  * field can not be modified, however, a user can focus it and copy text from it. Read-only text
  * fields are usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [AmbientTextStyle] defined by the theme
+ * [LocalTextStyle] defined by the theme
  * @param label the optional label to be displayed inside the text field container. The default
  * text style for internal [Text] is [Typography.caption] when the text field is in focus and
  * [Typography.subtitle1] when the text field is not in focus
@@ -125,7 +125,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     readOnly: Boolean = false,
-    textStyle: TextStyle = AmbientTextStyle.current,
+    textStyle: TextStyle = LocalTextStyle.current,
     label: @Composable (() -> Unit)? = null,
     placeholder: @Composable (() -> Unit)? = null,
     leadingIcon: @Composable (() -> Unit)? = null,
@@ -200,7 +200,7 @@
  * field can not be modified, however, a user can focus it and copy text from it. Read-only text
  * fields are usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [AmbientTextStyle] defined by the theme
+ * [LocalTextStyle] defined by the theme
  * @param label the optional label to be displayed inside the text field container. The default
  * text style for internal [Text] is [Typography.caption] when the text field is in focus and
  * [Typography.subtitle1] when the text field is not in focus
@@ -250,7 +250,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     readOnly: Boolean = false,
-    textStyle: TextStyle = AmbientTextStyle.current,
+    textStyle: TextStyle = LocalTextStyle.current,
     label: @Composable (() -> Unit)? = null,
     placeholder: @Composable (() -> Unit)? = null,
     leadingIcon: @Composable (() -> Unit)? = null,
@@ -430,7 +430,7 @@
     ) { measurables, incomingConstraints ->
         // used to calculate the constraints for measuring elements that will be placed in a row
         var occupiedSpaceHorizontally = 0
-        val bottomPadding = TextFieldPadding.toIntPx()
+        val bottomPadding = TextFieldPadding.roundToPx()
 
         // measure leading icon
         val constraints =
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
index 5966f96..d662254 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
@@ -41,7 +41,7 @@
 import androidx.compose.ui.graphics.StrokeCap
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
@@ -220,7 +220,7 @@
     color: Color = MaterialTheme.colors.primary,
     strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth
 ) {
-    val stroke = with(AmbientDensity.current) {
+    val stroke = with(LocalDensity.current) {
         Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Butt)
     }
     Canvas(
@@ -249,7 +249,7 @@
     color: Color = MaterialTheme.colors.primary,
     strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth
 ) {
-    val stroke = with(AmbientDensity.current) {
+    val stroke = with(LocalDensity.current) {
         Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Square)
     }
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
index 3144396..910d3be 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
@@ -131,12 +131,12 @@
  * below the drawer sheet (if set)
  * @param drawerBackgroundColor background color to be used for the drawer sheet
  * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
- * either the matching `onFoo` color for [drawerBackgroundColor], or, if it is not a color from
+ * either the matching content color for [drawerBackgroundColor], or, if it is not a color from
  * the theme, this will keep the same value set above this Surface.
  * @param drawerScrimColor color of the scrim that obscures content when the drawer is open
  * @param backgroundColor background of the scaffold body
  * @param contentColor color of the content in scaffold body. Defaults to either the matching
- * `onFoo` color for [backgroundColor], or, if it is not a color from the theme, this will keep
+ * content color for [backgroundColor], or, if it is not a color from the theme, this will keep
  * the same value set above this Surface.
  * @param bodyContent content of your screen. The lambda receives an [PaddingValues] that should be
  * applied to the content root via Modifier.padding to properly offset top and bottom bars. If
@@ -251,9 +251,9 @@
             val fabLeftOffset = if (fabWidth != 0 && fabHeight != 0) {
                 if (fabPosition == FabPosition.End) {
                     if (layoutDirection == LayoutDirection.Ltr) {
-                        layoutWidth - FabSpacing.toIntPx() - fabWidth
+                        layoutWidth - FabSpacing.roundToPx() - fabWidth
                     } else {
-                        FabSpacing.toIntPx()
+                        FabSpacing.roundToPx()
                     }
                 } else {
                     (layoutWidth - fabWidth) / 2
@@ -275,7 +275,7 @@
 
             val bottomBarPlaceables = subcompose(ScaffoldLayoutContent.BottomBar) {
                 Providers(
-                    AmbientFabPlacement provides fabPlacement,
+                    LocalFabPlacement provides fabPlacement,
                     content = bottomBar
                 )
             }.fastMap { it.measure(looseConstraints) }
@@ -284,7 +284,7 @@
 
             val fabOffsetFromBottom = if (fabWidth != 0 && fabHeight != 0) {
                 if (bottomBarHeight == 0) {
-                    fabHeight + FabSpacing.toIntPx()
+                    fabHeight + FabSpacing.roundToPx()
                 } else {
                     if (isFabDocked) {
                         // Total height is the bottom bar height + half the FAB height
@@ -292,7 +292,7 @@
                     } else {
                         // Total height is the bottom bar height + the FAB height + the padding
                         // between the FAB and bottom bar
-                        bottomBarHeight + fabHeight + FabSpacing.toIntPx()
+                        bottomBarHeight + fabHeight + FabSpacing.roundToPx()
                     }
                 }
             } else {
@@ -357,9 +357,10 @@
 )
 
 /**
- * Ambient containing a [FabPlacement] that is read by [BottomAppBar] to calculate notch location.
+ * CompositionLocal containing a [FabPlacement] that is read by [BottomAppBar] to calculate notch
+ * location.
  */
-internal val AmbientFabPlacement = staticAmbientOf<FabPlacement?> { null }
+internal val LocalFabPlacement = staticCompositionLocalOf<FabPlacement?> { null }
 
 // FAB spacing above the bottom bar / bottom of the Scaffold
 private val FabSpacing = 16.dp
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt
index da5bb7b..2185a8b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Shapes.kt
@@ -19,7 +19,7 @@
 import androidx.compose.foundation.shape.CornerBasedShape
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.unit.dp
 
 /**
@@ -88,6 +88,6 @@
 }
 
 /**
- * Ambient used to specify the default shapes for the surfaces.
+ * CompositionLocal used to specify the default shapes for the surfaces.
  */
-internal val AmbientShapes = staticAmbientOf { Shapes() }
+internal val LocalShapes = staticCompositionLocalOf { Shapes() }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
index 1569c81..1de7725 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
@@ -58,9 +58,9 @@
 import androidx.compose.ui.graphics.PointMode
 import androidx.compose.ui.graphics.StrokeCap
 import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.setProgress
 import androidx.compose.ui.unit.LayoutDirection
@@ -126,7 +126,7 @@
     activeTickColor: Color = MaterialTheme.colors.onPrimary.copy(alpha = TickColorAlpha),
     inactiveTickColor: Color = activeTrackColor.copy(alpha = TickColorAlpha)
 ) {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     val position = remember(valueRange, steps) {
         SliderPosition(value, valueRange, steps, clock, onValueChange)
     }
@@ -135,7 +135,7 @@
     BoxWithConstraints(
         modifier.sliderSemantics(value, position, onValueChange, valueRange, steps)
     ) {
-        val isRtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+        val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
         val maxPx = constraints.maxWidth.toFloat()
         val minPx = 0f
         position.setBounds(minPx, maxPx)
@@ -223,7 +223,7 @@
     interactionState: InteractionState,
     modifier: Modifier
 ) {
-    val widthDp = with(AmbientDensity.current) {
+    val widthDp = with(LocalDensity.current) {
         width.toDp()
     }
     Box(modifier.then(DefaultSliderConstraints)) {
@@ -233,7 +233,7 @@
 
         val trackStrokeWidth: Float
         val thumbPx: Float
-        with(AmbientDensity.current) {
+        with(LocalDensity.current) {
             trackStrokeWidth = TrackHeight.toPx()
             thumbPx = ThumbRadius.toPx()
         }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
index 210ae2a..abe01d7 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
@@ -66,7 +66,7 @@
  * @param shape Defines the Snackbar's shape as well as its shadow
  * @param backgroundColor background color of the Snackbar
  * @param contentColor color of the content to use inside the snackbar. Defaults to
- * either the matching `onFoo` color for [backgroundColor], or, if it is not a color from
+ * either the matching content color for [backgroundColor], or, if it is not a color from
  * the theme, this will keep the same value set above this Surface.
  * @param elevation The z-coordinate at which to place the SnackBar. This controls the size
  * of the shadow below the SnackBar
@@ -91,7 +91,7 @@
         color = backgroundColor,
         contentColor = contentColor
     ) {
-        Providers(AmbientContentAlpha provides ContentAlpha.high) {
+        Providers(LocalContentAlpha provides ContentAlpha.high) {
             val textStyle = MaterialTheme.typography.body2
             ProvideTextStyle(value = textStyle) {
                 when {
@@ -134,7 +134,7 @@
  * @param shape Defines the Snackbar's shape as well as its shadow
  * @param backgroundColor background color of the Snackbar
  * @param contentColor color of the content to use inside the snackbar. Defaults to
- * either the matching `onFoo` color for [backgroundColor], or, if it is not a color from
+ * either the matching content color for [backgroundColor], or, if it is not a color from
  * the theme, this will keep the same value set above this Surface.
  * @param actionColor color of the action
  * @param elevation The z-coordinate at which to place the SnackBar. This controls the size
@@ -250,7 +250,7 @@
             } else {
                 SnackbarMinHeightTwoLines
             }
-        val containerHeight = max(minHeight.toIntPx(), textPlaceable.height)
+        val containerHeight = max(minHeight.roundToPx(), textPlaceable.height)
         layout(constraints.maxWidth, containerHeight) {
             val textPlaceY = (containerHeight - textPlaceable.height) / 2
             textPlaceable.placeRelative(0, textPlaceY)
@@ -300,7 +300,7 @@
     ) { measurables, constraints ->
         val buttonPlaceable = measurables.first { it.layoutId == actionTag }.measure(constraints)
         val textMaxWidth =
-            (constraints.maxWidth - buttonPlaceable.width - TextEndExtraSpacing.toIntPx())
+            (constraints.maxWidth - buttonPlaceable.width - TextEndExtraSpacing.roundToPx())
                 .coerceAtLeast(constraints.minWidth)
         val textPlaceable = measurables.first { it.layoutId == textTag }.measure(
             constraints.copy(minHeight = 0, maxWidth = textMaxWidth)
@@ -317,7 +317,7 @@
         val containerHeight: Int
         val buttonPlaceY: Int
         if (isOneLine) {
-            val minContainerHeight = SnackbarMinHeightOneLine.toIntPx()
+            val minContainerHeight = SnackbarMinHeightOneLine.roundToPx()
             val contentHeight = buttonPlaceable.height
             containerHeight = max(minContainerHeight, contentHeight)
             textPlaceY = (containerHeight - textPlaceable.height) / 2
@@ -330,9 +330,9 @@
                 }
             }
         } else {
-            val baselineOffset = HeightToFirstLine.toIntPx()
-            textPlaceY = baselineOffset - firstTextBaseline - SnackbarVerticalPadding.toIntPx()
-            val minContainerHeight = SnackbarMinHeightTwoLines.toIntPx()
+            val baselineOffset = HeightToFirstLine.roundToPx()
+            textPlaceY = baselineOffset - firstTextBaseline - SnackbarVerticalPadding.roundToPx()
+            val minContainerHeight = SnackbarMinHeightTwoLines.roundToPx()
             val contentHeight = textPlaceY + textPlaceable.height
             containerHeight = max(minContainerHeight, contentHeight)
             buttonPlaceY = (containerHeight - buttonPlaceable.height) / 2
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
index 9e0b99e..536e75b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
@@ -28,7 +28,7 @@
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -48,9 +48,9 @@
  * 3) Borders: If [shape] has a border, then it will also be drawn.
  *
  * 4) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [Colors.surface], the [ElevationOverlay] from [AmbientElevationOverlay] will be used to apply
+ * [Colors.surface], the [ElevationOverlay] from [LocalElevationOverlay] will be used to apply
  * an overlay - by default this will only occur in dark theme. The color of the overlay depends
- * on the [elevation] of this Surface, and the [AmbientAbsoluteElevation] set by any parent
+ * on the [elevation] of this Surface, and the [LocalAbsoluteElevation] set by any parent
  * surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its
  * ancestors, by summing the elevation of all previous Surfaces.
  *
@@ -58,7 +58,7 @@
  * this surface - this is used by the [Text] and [Icon] components as a default color.
  *
  * If no [contentColor] is set, this surface will try and match its background color to a color
- * defined in the theme [Colors], and return the corresponding `onFoo` color. For example,
+ * defined in the theme [Colors], and return the corresponding content color. For example,
  * if the [color] of this surface is [Colors.surface], [contentColor] will be set to
  * [Colors.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep
  * the same value set above this Surface.
@@ -68,14 +68,14 @@
  * To modify these default style values used by text, use [ProvideTextStyle] or explicitly
  * pass a new [TextStyle] to your text.
  *
- * To manually retrieve the content color inside a surface, use [AmbientContentColor].
+ * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
  * @param modifier Modifier to be applied to the layout corresponding to the surface
  * @param shape Defines the surface's shape as well its shadow. A shadow is only
  *  displayed if the [elevation] is greater than zero.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching `onFoo` color for [color], or if [color] is not a color from
+ * Defaults to either the matching content color for [color], or if [color] is not a color from
  * the theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
  * @param elevation The size of the shadow below the surface. Note that It will not affect z index
@@ -91,9 +91,9 @@
     elevation: Dp = 0.dp,
     content: @Composable () -> Unit
 ) {
-    val elevationPx = with(AmbientDensity.current) { elevation.toPx() }
-    val elevationOverlay = AmbientElevationOverlay.current
-    val absoluteElevation = AmbientAbsoluteElevation.current + elevation
+    val elevationPx = with(LocalDensity.current) { elevation.toPx() }
+    val elevationOverlay = LocalElevationOverlay.current
+    val absoluteElevation = LocalAbsoluteElevation.current + elevation
     val backgroundColor = if (color == MaterialTheme.colors.surface && elevationOverlay != null) {
         elevationOverlay.apply(color, absoluteElevation)
     } else {
@@ -110,8 +110,8 @@
         propagateMinConstraints = true
     ) {
         Providers(
-            AmbientContentColor provides contentColor,
-            AmbientAbsoluteElevation provides absoluteElevation,
+            LocalContentColor provides contentColor,
+            LocalAbsoluteElevation provides absoluteElevation,
             content = content
         )
     }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt
index a1449a4..afe8f8b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SwipeToDismiss.kt
@@ -37,8 +37,8 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.LayoutDirection
 import kotlin.math.roundToInt
@@ -169,7 +169,7 @@
     initialValue: DismissValue = Default,
     confirmStateChange: (DismissValue) -> Boolean = { true }
 ): DismissState {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     return rememberSaveable(
         clock,
         saver = DismissState.Saver(clock, confirmStateChange)
@@ -202,7 +202,7 @@
     dismissContent: @Composable RowScope.() -> Unit
 ) = BoxWithConstraints(modifier) {
     val width = constraints.maxWidth.toFloat()
-    val isRtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+    val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
 
     val anchors = mutableMapOf(0f to Default)
     if (StartToEnd in directions) anchors += width to DismissedToEnd
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
index 2d4f98a..0edf551 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
@@ -49,8 +49,8 @@
 import androidx.compose.ui.gesture.nestedscroll.NestedScrollConnection
 import androidx.compose.ui.gesture.nestedscroll.NestedScrollSource
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.platform.AmbientAnimationClock
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalAnimationClock
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
@@ -411,7 +411,7 @@
     animationSpec: AnimationSpec<Float> = AnimationSpec,
     confirmStateChange: (newValue: T) -> Boolean = { true }
 ): SwipeableState<T> {
-    val clock = AmbientAnimationClock.current.asDisposableClock()
+    val clock = LocalAnimationClock.current.asDisposableClock()
     return rememberSaveable(
         clock,
         saver = SwipeableState.Saver(
@@ -532,7 +532,7 @@
     require(anchors.values.distinct().count() == anchors.size) {
         "You cannot have two anchors mapped to the same state."
     }
-    val density = AmbientDensity.current
+    val density = LocalDensity.current
     DisposableEffect(anchors) {
         state.anchors = anchors
         state.thresholds = { a, b ->
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt
index 79e179e..13a27c6 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Switch.kt
@@ -46,8 +46,8 @@
 import androidx.compose.ui.graphics.StrokeCap
 import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.graphics.drawscope.DrawScope
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.LayoutDirection
@@ -82,9 +82,9 @@
     colors: SwitchColors = SwitchDefaults.colors()
 ) {
     val minBound = 0f
-    val maxBound = with(AmbientDensity.current) { ThumbPathLength.toPx() }
+    val maxBound = with(LocalDensity.current) { ThumbPathLength.toPx() }
     val swipeableState = rememberSwipeableStateFor(checked, onCheckedChange, AnimationSpec)
-    val isRtl = AmbientLayoutDirection.current == LayoutDirection.Rtl
+    val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
     Box(
         modifier
             .toggleable(
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
index cc0695a..35826a6 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
@@ -93,7 +93,7 @@
     text: @Composable (() -> Unit)? = null,
     icon: @Composable (() -> Unit)? = null,
     interactionState: InteractionState = remember { InteractionState() },
-    selectedContentColor: Color = AmbientContentColor.current,
+    selectedContentColor: Color = LocalContentColor.current,
     unselectedContentColor: Color = selectedContentColor.copy(alpha = ContentAlpha.medium)
 ) {
     val styledText: @Composable (() -> Unit)? = text?.let {
@@ -145,7 +145,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     interactionState: InteractionState = remember { InteractionState() },
-    selectedContentColor: Color = AmbientContentColor.current,
+    selectedContentColor: Color = LocalContentColor.current,
     unselectedContentColor: Color = selectedContentColor.copy(alpha = ContentAlpha.medium),
     content: @Composable ColumnScope.() -> Unit
 ) {
@@ -196,7 +196,7 @@
     fun Divider(
         modifier: Modifier = Modifier,
         thickness: Dp = DividerThickness,
-        color: Color = AmbientContentColor.current.copy(alpha = DividerOpacity)
+        color: Color = LocalContentColor.current.copy(alpha = DividerOpacity)
     ) {
         androidx.compose.material.Divider(modifier = modifier, thickness = thickness, color = color)
     }
@@ -213,7 +213,7 @@
     fun Indicator(
         modifier: Modifier = Modifier,
         height: Dp = IndicatorHeight,
-        color: Color = AmbientContentColor.current
+        color: Color = LocalContentColor.current
     ) {
         Box(
             modifier
@@ -274,7 +274,7 @@
 
 /**
  * Transition defining how the tint color for a tab animates, when a new tab is selected. This
- * component uses [AmbientContentColor] to provide an interpolated value between [activeColor]
+ * component uses [LocalContentColor] to provide an interpolated value between [activeColor]
  * and [inactiveColor] depending on the animation status.
  */
 @Composable
@@ -304,8 +304,8 @@
         if (it) activeColor else inactiveColor
     }
     Providers(
-        AmbientContentColor provides color.copy(alpha = 1f),
-        AmbientContentAlpha provides color.alpha,
+        LocalContentColor provides color.copy(alpha = 1f),
+        LocalContentAlpha provides color.alpha,
         content = content
     )
 }
@@ -350,7 +350,7 @@
             LargeTabHeight
         } else {
             SmallTabHeight
-        }.toIntPx()
+        }.roundToPx()
 
         val firstBaseline = textPlaceable?.get(FirstBaseline)
         val lastBaseline = textPlaceable?.get(LastBaseline)
@@ -410,7 +410,7 @@
 
     // Total offset between the last text baseline and the bottom of the Tab layout
     val totalOffset = with(density) {
-        baselineOffset.toIntPx() + TabRowDefaults.IndicatorHeight.toIntPx()
+        baselineOffset.roundToPx() + TabRowDefaults.IndicatorHeight.roundToPx()
     }
 
     val textPlaceableY = tabHeight - lastBaseline - totalOffset
@@ -439,13 +439,13 @@
 
     // Total offset between the last text baseline and the bottom of the Tab layout
     val textOffset = with(density) {
-        baselineOffset.toIntPx() + TabRowDefaults.IndicatorHeight.toIntPx()
+        baselineOffset.roundToPx() + TabRowDefaults.IndicatorHeight.roundToPx()
     }
 
     // How much space there is between the top of the icon (essentially the top of this layout)
     // and the top of the text layout's bounding box (not baseline)
     val iconOffset = with(density) {
-        iconPlaceable.height + IconDistanceFromBaseline.toIntPx() - firstBaseline
+        iconPlaceable.height + IconDistanceFromBaseline.roundToPx() - firstBaseline
     }
 
     val textPlaceableX = (tabWidth - textPlaceable.width) / 2
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
index 0479fdd..bd8eaad 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
@@ -105,7 +105,7 @@
  * @param backgroundColor The background color for the TabRow. Use [Color.Transparent] to have
  * no color.
  * @param contentColor The preferred content color provided by this TabRow to its children.
- * Defaults to either the matching `onFoo` color for [backgroundColor], or if [backgroundColor] is
+ * Defaults to either the matching content color for [backgroundColor], or if [backgroundColor] is
  * not a color from the theme, this will keep the same value set above this TabRow.
  * @param indicator the indicator that represents which tab is currently selected. By default this
  * will be a [TabRowDefaults.Indicator], using a [TabRowDefaults.tabIndicatorOffset]
@@ -181,7 +181,7 @@
  * @param backgroundColor The background color for the ScrollableTabRow. Use [Color.Transparent] to
  * have no color.
  * @param contentColor The preferred content color provided by this ScrollableTabRow to its
- * children. Defaults to either the matching `onFoo` color for [backgroundColor], or if
+ * children. Defaults to either the matching content color for [backgroundColor], or if
  * [backgroundColor] is not a color from the theme, this will keep the same value set above this
  * ScrollableTabRow.
  * @param edgePadding the padding between the starting and ending edge of ScrollableTabRow, and
@@ -231,8 +231,8 @@
                 .horizontalScroll(scrollState)
                 .clipToBounds()
         ) { constraints ->
-            val minTabWidth = ScrollableTabRowMinimumTabWidth.toIntPx()
-            val padding = edgePadding.toIntPx()
+            val minTabWidth = ScrollableTabRowMinimumTabWidth.roundToPx()
+            val padding = edgePadding.roundToPx()
             val tabConstraints = constraints.copy(minWidth = minTabWidth)
 
             val tabPlaceables = subcompose(TabSlots.Tabs, tabs)
@@ -333,7 +333,7 @@
     fun Divider(
         modifier: Modifier = Modifier,
         thickness: Dp = DividerThickness,
-        color: Color = AmbientContentColor.current.copy(alpha = DividerOpacity)
+        color: Color = LocalContentColor.current.copy(alpha = DividerOpacity)
     ) {
         androidx.compose.material.Divider(modifier = modifier, thickness = thickness, color = color)
     }
@@ -350,7 +350,7 @@
     fun Indicator(
         modifier: Modifier = Modifier,
         height: Dp = IndicatorHeight,
-        color: Color = AmbientContentColor.current
+        color: Color = LocalContentColor.current
     ) {
         Box(
             modifier
@@ -455,11 +455,11 @@
         edgeOffset: Int,
         tabPositions: List<TabPosition>
     ): Float = with(density) {
-        val totalTabRowWidth = tabPositions.last().right.toIntPx() + edgeOffset
+        val totalTabRowWidth = tabPositions.last().right.roundToPx() + edgeOffset
         val visibleWidth = totalTabRowWidth - scrollState.maxValue.toInt()
-        val tabOffset = left.toIntPx()
+        val tabOffset = left.roundToPx()
         val scrollerCenter = visibleWidth / 2
-        val tabWidth = width.toIntPx()
+        val tabWidth = width.roundToPx()
         val centeredTabOffset = tabOffset - (scrollerCenter - tabWidth / 2)
         // How much space we have to scroll. If the visible width is <= to the total width, then
         // we have no space to scroll as everything is always visible.
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
index d0b7854..32471d6 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
@@ -20,7 +20,7 @@
 import androidx.compose.foundation.text.InlineTextContent
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -40,8 +40,8 @@
 /**
  * High level element that displays text and provides semantics / accessibility information.
  *
- * The default [style] uses the [AmbientTextStyle] provided by the [MaterialTheme] / components. If
- * you are setting your own style, you may want to consider first retrieving [AmbientTextStyle],
+ * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
  * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
  * attributes you want to override.
  *
@@ -53,14 +53,14 @@
  * from [style] will be used instead.
  *
  * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
- * [AmbientContentColor] will be used with an alpha of [AmbientContentAlpha]- this allows this
+ * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this
  * [Text] or element containing this [Text] to adapt to different background colors and still
  * maintain contrast and accessibility.
  *
  * @param text The text to be displayed.
  * @param modifier [Modifier] to apply to this layout node.
  * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
- * this will be [AmbientContentColor].
+ * this will be [LocalContentColor].
  * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
  * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
  * See [TextStyle.fontStyle].
@@ -101,7 +101,7 @@
     softWrap: Boolean = true,
     maxLines: Int = Int.MAX_VALUE,
     onTextLayout: (TextLayoutResult) -> Unit = {},
-    style: TextStyle = AmbientTextStyle.current
+    style: TextStyle = LocalTextStyle.current
 ) {
     Text(
         AnnotatedString(text),
@@ -127,8 +127,8 @@
 /**
  * High level element that displays text and provides semantics / accessibility information.
  *
- * The default [style] uses the [AmbientTextStyle] provided by the [MaterialTheme] / components. If
- * you are setting your own style, you may want to consider first retrieving [AmbientTextStyle],
+ * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
  * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
  * attributes you want to override.
  *
@@ -140,14 +140,14 @@
  * from [style] will be used instead.
  *
  * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
- * [AmbientContentColor] will be used with an alpha of [AmbientContentAlpha]- this allows this
+ * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this
  * [Text] or element containing this [Text] to adapt to different background colors and still
  * maintain contrast and accessibility.
  *
  * @param text The text to be displayed.
  * @param modifier [Modifier] to apply to this layout node.
  * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
- * this will be [AmbientContentColor].
+ * this will be [LocalContentColor].
  * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
  * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
  * See [TextStyle.fontStyle].
@@ -191,11 +191,11 @@
     maxLines: Int = Int.MAX_VALUE,
     inlineContent: Map<String, InlineTextContent> = mapOf(),
     onTextLayout: (TextLayoutResult) -> Unit = {},
-    style: TextStyle = AmbientTextStyle.current
+    style: TextStyle = LocalTextStyle.current
 ) {
     val textColor = color.takeOrElse {
         style.color.takeOrElse {
-            AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
+            LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
         }
     }
     val mergedStyle = style.merge(
@@ -224,24 +224,40 @@
 }
 
 /**
- * Ambient containing the preferred [TextStyle] that will be used by [Text] components by default.
- * To set the value for this ambient, see [ProvideTextStyle] which will merge any missing
- * [TextStyle] properties with the existing [TextStyle] set in this ambient.
+ * CompositionLocal containing the preferred [TextStyle] that will be used by [Text] components by
+ * default. To set the value for this CompositionLocal, see [ProvideTextStyle] which will merge any
+ * missing [TextStyle] properties with the existing [TextStyle] set in this CompositionLocal.
  *
  * @see ProvideTextStyle
  */
-val AmbientTextStyle = ambientOf(structuralEqualityPolicy()) { TextStyle.Default }
+@Deprecated(
+    "Renamed to LocalTextStyle",
+    replaceWith = ReplaceWith(
+        "LocalTextStyle",
+        "androidx.compose.material.LocalTextStyle"
+    )
+)
+val AmbientTextStyle get() = LocalTextStyle
 
-// TODO: b/156598010 remove this and replace with fold definition on the backing Ambient
 /**
- * This function is used to set the current value of [AmbientTextStyle], merging the given style
+ * CompositionLocal containing the preferred [TextStyle] that will be used by [Text] components by
+ * default. To set the value for this CompositionLocal, see [ProvideTextStyle] which will merge any
+ * missing [TextStyle] properties with the existing [TextStyle] set in this CompositionLocal.
+ *
+ * @see ProvideTextStyle
+ */
+val LocalTextStyle = compositionLocalOf(structuralEqualityPolicy()) { TextStyle.Default }
+
+// TODO: b/156598010 remove this and replace with fold definition on the backing CompositionLocal
+/**
+ * This function is used to set the current value of [LocalTextStyle], merging the given style
  * with the current style values for any missing attributes. Any [Text] components included in
  * this component's [content] will be styled with this style unless styled explicitly.
  *
- * @see AmbientTextStyle
+ * @see LocalTextStyle
  */
 @Composable
 fun ProvideTextStyle(value: TextStyle, content: @Composable () -> Unit) {
-    val mergedStyle = AmbientTextStyle.current.merge(value)
-    Providers(AmbientTextStyle provides mergedStyle, content = content)
+    val mergedStyle = LocalTextStyle.current.merge(value)
+    Providers(LocalTextStyle provides mergedStyle, content = content)
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
index 81a2d4e..f243f16 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
@@ -102,7 +102,7 @@
  * field can not be modified, however, a user can focus it and copy text from it. Read-only text
  * fields are usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [AmbientTextStyle] defined by the theme
+ * [LocalTextStyle] defined by the theme
  * @param label the optional label to be displayed inside the text field container. The default
  * text style for internal [Text] is [Typography.caption] when the text field is in focus and
  * [Typography.subtitle1] when the text field is not in focus
@@ -154,7 +154,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     readOnly: Boolean = false,
-    textStyle: TextStyle = AmbientTextStyle.current,
+    textStyle: TextStyle = LocalTextStyle.current,
     label: @Composable (() -> Unit)? = null,
     placeholder: @Composable (() -> Unit)? = null,
     leadingIcon: @Composable (() -> Unit)? = null,
@@ -234,7 +234,7 @@
  * field can not be modified, however, a user can focus it and copy text from it. Read-only text
  * fields are usually used to display pre-filled forms that user can not edit
  * @param textStyle the style to be applied to the input text. The default [textStyle] uses the
- * [AmbientTextStyle] defined by the theme
+ * [LocalTextStyle] defined by the theme
  * @param label the optional label to be displayed inside the text field container. The default
  * text style for internal [Text] is [Typography.caption] when the text field is in focus and
  * [Typography.subtitle1] when the text field is not in focus
@@ -286,7 +286,7 @@
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
     readOnly: Boolean = false,
-    textStyle: TextStyle = AmbientTextStyle.current,
+    textStyle: TextStyle = LocalTextStyle.current,
     label: @Composable (() -> Unit)? = null,
     placeholder: @Composable (() -> Unit)? = null,
     leadingIcon: @Composable (() -> Unit)? = null,
@@ -451,10 +451,10 @@
             Box(Modifier.layoutId(TextFieldId).then(padding)) { textField() }
         }
     ) { measurables, incomingConstraints ->
-        val topBottomPadding = TextFieldPadding.toIntPx()
-        val baseLineOffset = FirstBaselineOffset.toIntPx()
-        val bottomPadding = LastBaselineOffset.toIntPx()
-        val topPadding = TextFieldTopPadding.toIntPx()
+        val topBottomPadding = TextFieldPadding.roundToPx()
+        val baseLineOffset = FirstBaselineOffset.roundToPx()
+        val bottomPadding = LastBaselineOffset.roundToPx()
+        val topPadding = TextFieldTopPadding.roundToPx()
         var occupiedSpaceHorizontally = 0
 
         // measure leading icon
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index 4dc2446..bae7721 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -96,8 +96,8 @@
     // TODO(soboleva): b/171305338 provide colors object and apply alpha there instead
     // If color is not provided via the text style, use content color as a default
     val textColor = textStyle.color.takeOrElse {
-        AmbientContentColor.current
-    }.copy(alpha = if (enabled) AmbientContentAlpha.current else ContentAlpha.disabled)
+        LocalContentColor.current
+    }.copy(alpha = if (enabled) LocalContentAlpha.current else ContentAlpha.disabled)
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
     val keyboardController: Ref<SoftwareKeyboardController> = remember { Ref() }
@@ -253,15 +253,15 @@
     content: @Composable () -> Unit
 ) {
     val colorAndEmphasis = @Composable {
-        Providers(AmbientContentColor provides contentColor) {
+        Providers(LocalContentColor provides contentColor) {
             if (contentAlpha != null) {
                 Providers(
-                    AmbientContentAlpha provides contentAlpha,
+                    LocalContentAlpha provides contentAlpha,
                     content = content
                 )
             } else {
                 Providers(
-                    AmbientContentAlpha provides contentColor.alpha,
+                    LocalContentAlpha provides contentColor.alpha,
                     content = content
                 )
             }
@@ -290,7 +290,7 @@
                 measurable: Measurable,
                 constraints: Constraints
             ): MeasureResult {
-                val horizontal = start.toIntPx() + end.toIntPx()
+                val horizontal = start.roundToPx() + end.roundToPx()
                 val placeable = measurable.measure(constraints.offset(-horizontal))
                 val width = if (placeable.nonZero) {
                     constraints.constrainWidth(placeable.width + horizontal)
@@ -298,7 +298,7 @@
                     0
                 }
                 return layout(width, placeable.height) {
-                    placeable.placeRelative(start.toIntPx(), 0)
+                    placeable.placeRelative(start.roundToPx(), 0)
                 }
             }
         }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt
index 9ea2aa7..2d7aa916 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Typography.kt
@@ -17,7 +17,7 @@
 package androidx.compose.material
 
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontWeight
@@ -277,12 +277,12 @@
 }
 
 /**
- * This Ambient holds on to the current definition of typography for this application as described
- * by the Material spec.  You can read the values in it when creating custom components that want
- * to use Material types, as well as override the values when you want to re-style a part of your
- * hierarchy. Material components related to text such as [Button] will use this Ambient
- * to set values with which to style children text components.
+ * This CompositionLocal holds on to the current definition of typography for this application as
+ * described by the Material spec. You can read the values in it when creating custom components
+ * that want to use Material types, as well as override the values when you want to re-style a
+ * part of your hierarchy. Material components related to text such as [Button] will use this
+ * CompositionLocal to set values with which to style children text components.
  *
- * To access values within this ambient, use [MaterialTheme.typography].
+ * To access values within this CompositionLocal, use [MaterialTheme.typography].
  */
-internal val AmbientTypography = staticAmbientOf { Typography() }
+internal val LocalTypography = staticCompositionLocalOf { Typography() }
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AmbientNamingDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AmbientNamingDetector.kt
deleted file mode 100644
index 91882fa..0000000
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/AmbientNamingDetector.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("UnstableApiUsage")
-
-package androidx.compose.runtime.lint
-
-import com.android.tools.lint.client.api.UElementHandler
-import com.android.tools.lint.detector.api.Category
-import com.android.tools.lint.detector.api.Detector
-import com.android.tools.lint.detector.api.Implementation
-import com.android.tools.lint.detector.api.Issue
-import com.android.tools.lint.detector.api.JavaContext
-import com.android.tools.lint.detector.api.LintFix
-import com.android.tools.lint.detector.api.Scope
-import com.android.tools.lint.detector.api.Severity
-import com.android.tools.lint.detector.api.SourceCodeScanner
-import com.intellij.psi.util.InheritanceUtil
-import org.jetbrains.uast.UElement
-import org.jetbrains.uast.UVariable
-import java.util.EnumSet
-import java.util.Locale
-
-/**
- * [Detector] that checks the naming of Ambient properties for consistency with guidelines.
- *
- * - `Ambient` should not be used as a noun (suffix) in the name of an Ambient property. It may
- * be used as an adjective (prefix) in lieu of a more descriptive adjective.
- */
-class AmbientNamingDetector : Detector(), SourceCodeScanner {
-    override fun getApplicableUastTypes() = listOf(UVariable::class.java)
-
-    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
-        override fun visitVariable(node: UVariable) {
-            val type = node.type
-            if (!InheritanceUtil.isInheritor(type, AmbientFqn)) return
-
-            val name = node.name
-            if (!name!!.endsWith(AmbientShortName)) return
-
-            val newName = AmbientShortName + name.replace(AmbientShortName, "")
-                .capitalize(Locale.getDefault())
-
-            // Kotlinc can't disambiguate overloads for report / getNameLocation otherwise
-            val uElementNode: UElement = node
-
-            context.report(
-                AmbientNaming,
-                uElementNode,
-                context.getNameLocation(uElementNode),
-                "`Ambient` should not be used as a noun when naming Ambient properties",
-                LintFix.create()
-                    .replace()
-                    .name("Use Ambient as an adjective (prefix)")
-                    .text(name)
-                    .with(newName)
-                    .autoFix()
-                    .build()
-            )
-        }
-    }
-
-    companion object {
-        val AmbientNaming = Issue.create(
-            "AmbientNaming",
-            "Incorrect naming for Ambient properties",
-            "`Ambient` should not be used as a anoun when naming Ambient properties. It may be " +
-                "used as an adjective in lieu of a more descriptive adjective. Otherwise Ambients" +
-                " follow standard property naming guidelines.",
-            Category.CORRECTNESS, 3, Severity.ERROR,
-            Implementation(
-                AmbientNamingDetector::class.java,
-                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
-            )
-        )
-    }
-}
-
-private const val AmbientFqn = "androidx.compose.runtime.Ambient"
-private val AmbientShortName get() = AmbientFqn.split(".").last()
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt
new file mode 100644
index 0000000..f9250bc
--- /dev/null
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/CompositionLocalNamingDetector.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.compose.runtime.lint
+
+import com.android.tools.lint.client.api.UElementHandler
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.intellij.psi.util.InheritanceUtil
+import org.jetbrains.kotlin.psi.KtParameter
+import org.jetbrains.kotlin.psi.KtProperty
+import org.jetbrains.uast.UElement
+import org.jetbrains.uast.UParameter
+import org.jetbrains.uast.UVariable
+import java.util.EnumSet
+
+/**
+ * [Detector] that checks the naming of CompositionLocal properties for consistency with guidelines.
+ *
+ * CompositionLocal properties should be prefixed with `Local` to make it clear that their value
+ * is local to the current composition.
+ */
+class CompositionLocalNamingDetector : Detector(), SourceCodeScanner {
+    override fun getApplicableUastTypes() = listOf(UVariable::class.java)
+
+    override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
+        override fun visitVariable(node: UVariable) {
+            // Ignore parameters of type CompositionLocal
+            if (node is UParameter) return
+            if (node.sourcePsi is KtParameter) return
+            // Ignore local properties
+            if ((node.sourcePsi as? KtProperty)?.isLocal == true) return
+
+            val type = node.type
+            if (!InheritanceUtil.isInheritor(type, CompositionLocalFqn)) return
+
+            val name = node.name
+            if (name!!.startsWith(CompositionLocalPrefix, ignoreCase = true)) return
+
+            // Kotlinc can't disambiguate overloads for report / getNameLocation otherwise
+            val uElementNode: UElement = node
+
+            context.report(
+                CompositionLocalNaming,
+                uElementNode,
+                context.getNameLocation(uElementNode),
+                "CompositionLocal properties should be prefixed with `Local`",
+            )
+        }
+    }
+
+    companion object {
+        val CompositionLocalNaming = Issue.create(
+            "CompositionLocalNaming",
+            "CompositionLocal properties should be prefixed with `Local`",
+            "CompositionLocal properties should be prefixed with `Local`. This helps make " +
+                "it clear at their use site that these values are local to the current " +
+                "composition. Typically the full name will be `Local` + the type of the " +
+                "CompositionLocal, for example val LocalFoo = compositionLocalOf { Foo() }.",
+            Category.CORRECTNESS, 3, Severity.WARNING,
+            Implementation(
+                CompositionLocalNamingDetector::class.java,
+                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+            )
+        )
+    }
+}
+
+private const val CompositionLocalFqn = "androidx.compose.runtime.CompositionLocal"
+private const val CompositionLocalPrefix = "Local"
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
index 6d5dcad..a860b1a 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
@@ -27,7 +27,7 @@
     override val api = 8
     override val minApi = CURRENT_API
     override val issues get() = listOf(
-        AmbientNamingDetector.AmbientNaming,
+        CompositionLocalNamingDetector.CompositionLocalNaming,
         ComposableLambdaParameterDetector.ComposableLambdaParameterNaming,
         ComposableLambdaParameterDetector.ComposableLambdaParameterPosition,
         ComposableNamingDetector.ComposableNaming,
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AmbientNamingDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AmbientNamingDetectorTest.kt
deleted file mode 100644
index 7290145..0000000
--- a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/AmbientNamingDetectorTest.kt
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("UnstableApiUsage")
-
-package androidx.compose.runtime.lint
-
-import com.android.tools.lint.checks.infrastructure.LintDetectorTest
-import com.android.tools.lint.detector.api.Detector
-import com.android.tools.lint.detector.api.Issue
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-/* ktlint-disable max-line-length */
-@RunWith(JUnit4::class)
-
-/**
- * Test for [AmbientNamingDetector].
- */
-class AmbientNamingDetectorTest : LintDetectorTest() {
-    override fun getDetector(): Detector = AmbientNamingDetector()
-
-    override fun getIssues(): MutableList<Issue> =
-        mutableListOf(AmbientNamingDetector.AmbientNaming)
-
-    // Simplified Ambient.kt stubs
-    private val ambientStub = kotlin(
-        """
-            package androidx.compose.runtime
-
-            sealed class Ambient<T> constructor(defaultFactory: (() -> T)? = null)
-
-            abstract class ProvidableAmbient<T> internal constructor(
-                defaultFactory: (() -> T)?
-            ) : Ambient<T>(defaultFactory)
-
-            internal class DynamicProvidableAmbient<T> constructor(
-                defaultFactory: (() -> T)?
-            ) : ProvidableAmbient<T>(defaultFactory)
-
-            internal class StaticProvidableAmbient<T>(
-                defaultFactory: (() -> T)?
-            ) : ProvidableAmbient<T>(defaultFactory)
-
-            fun <T> ambientOf(
-                defaultFactory: (() -> T)? = null
-            ): ProvidableAmbient<T> = DynamicProvidableAmbient(defaultFactory)
-
-            fun <T> staticAmbientOf(
-                defaultFactory: (() -> T)? = null
-            ): ProvidableAmbient<T> = StaticProvidableAmbient(defaultFactory)
-        """
-    )
-
-    @Test
-    fun ambientUsedAsNoun() {
-        lint().files(
-            kotlin(
-                """
-                package androidx.compose.runtime.foo
-
-                import androidx.compose.runtime.*
-
-                val FooAmbient = ambientOf { 5 }
-
-                object Test {
-                    val BarAmbient: Ambient<String?> = staticAmbientOf { null }
-                }
-
-                class Test2 {
-                    companion object {
-                        val BazAmbient: ProvidableAmbient<Int> = ambientOf()
-                    }
-                }
-            """
-            ),
-            ambientStub
-        )
-            .run()
-            .expect(
-                """
-src/androidx/compose/runtime/foo/Test.kt:6: Error: Ambient should not be used as a noun when naming Ambient properties [AmbientNaming]
-                val FooAmbient = ambientOf { 5 }
-                    ~~~~~~~~~~
-src/androidx/compose/runtime/foo/Test.kt:9: Error: Ambient should not be used as a noun when naming Ambient properties [AmbientNaming]
-                    val BarAmbient: Ambient<String?> = staticAmbientOf { null }
-                        ~~~~~~~~~~
-src/androidx/compose/runtime/foo/Test.kt:14: Error: Ambient should not be used as a noun when naming Ambient properties [AmbientNaming]
-                        val BazAmbient: ProvidableAmbient<Int> = ambientOf()
-                            ~~~~~~~~~~
-3 errors, 0 warnings
-            """
-            )
-            .expectFixDiffs(
-                """
-Fix for src/androidx/compose/runtime/foo/Test.kt line 6: Use Ambient as an adjective (prefix):
-@@ -6 +6
--                 val FooAmbient = ambientOf { 5 }
-+                 val AmbientFoo = ambientOf { 5 }
-Fix for src/androidx/compose/runtime/foo/Test.kt line 9: Use Ambient as an adjective (prefix):
-@@ -9 +9
--                     val BarAmbient: Ambient<String?> = staticAmbientOf { null }
-+                     val AmbientBar: Ambient<String?> = staticAmbientOf { null }
-Fix for src/androidx/compose/runtime/foo/Test.kt line 14: Use Ambient as an adjective (prefix):
-@@ -14 +14
--                         val BazAmbient: ProvidableAmbient<Int> = ambientOf()
-+                         val AmbientBaz: ProvidableAmbient<Int> = ambientOf()
-                """
-            )
-    }
-
-    @Test
-    fun ambientUsedAsAdjective() {
-        lint().files(
-            kotlin(
-                """
-                package androidx.compose.runtime.foo
-
-                import androidx.compose.runtime.*
-
-                val AmbientFoo = ambientOf { 5 }
-
-                object Test {
-                    val AmbientBar: Ambient<String?> = staticAmbientOf { null }
-                }
-
-                class Test2 {
-                    companion object {
-                        val AmbientBaz: ProvidableAmbient<Int> = ambientOf()
-                    }
-                }
-            """
-            ),
-            ambientStub
-        )
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun descriptiveAdjectives() {
-        lint().files(
-            kotlin(
-                """
-                package androidx.compose.runtime.foo
-
-                import androidx.compose.runtime.*
-
-                val ThemeFoo = ambientOf { 5 }
-
-                object Test {
-                    val ThemeBar: Ambient<String?> = staticAmbientOf { null }
-                }
-
-                class Test2 {
-                    companion object {
-                        val StyledBaz: ProvidableAmbient<Int> = ambientOf()
-                    }
-                }
-            """
-            ),
-            ambientStub
-        )
-            .run()
-            .expectClean()
-    }
-}
-/* ktlint-enable max-line-length */
diff --git a/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt
new file mode 100644
index 0000000..5e09544
--- /dev/null
+++ b/compose/runtime/runtime-lint/src/test/java/androidx/compose/runtime/lint/CompositionLocalNamingDetectorTest.kt
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.compose.runtime.lint
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/* ktlint-disable max-line-length */
+@RunWith(JUnit4::class)
+
+/**
+ * Test for [CompositionLocalNamingDetector].
+ */
+class CompositionLocalNamingDetectorTest : LintDetectorTest() {
+    override fun getDetector(): Detector = CompositionLocalNamingDetector()
+
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(CompositionLocalNamingDetector.CompositionLocalNaming)
+
+    // Simplified CompositionLocal.kt stubs
+    private val compositionLocalStub = kotlin(
+        """
+            package androidx.compose.runtime
+
+            sealed class CompositionLocal<T> constructor(defaultFactory: (() -> T)? = null)
+
+            abstract class ProvidableCompositionLocal<T> internal constructor(
+                defaultFactory: (() -> T)?
+            ) : CompositionLocal<T>(defaultFactory)
+
+            internal class DynamicProvidableCompositionLocal<T> constructor(
+                defaultFactory: (() -> T)?
+            ) : ProvidableCompositionLocal<T>(defaultFactory)
+
+            internal class StaticProvidableCompositionLocal<T>(
+                defaultFactory: (() -> T)?
+            ) : ProvidableCompositionLocal<T>(defaultFactory)
+
+            fun <T> compositionLocalOf(
+                defaultFactory: (() -> T)? = null
+            ): ProvidableCompositionLocal<T> = DynamicProvidableCompositionLocal(defaultFactory)
+
+            fun <T> staticCompositionLocalOf(
+                defaultFactory: (() -> T)? = null
+            ): ProvidableCompositionLocal<T> = StaticProvidableCompositionLocal(defaultFactory)
+        """
+    )
+
+    @Test
+    fun noLocalPrefix() {
+        lint().files(
+            kotlin(
+                """
+                package androidx.compose.runtime.foo
+
+                import androidx.compose.runtime.*
+
+                val FooCompositionLocal = compositionLocalOf { 5 }
+
+                object Test {
+                    val BarCompositionLocal: CompositionLocal<String?> = staticCompositionLocalOf {
+                        null
+                    }
+                }
+
+                class Test2 {
+                    companion object {
+                        val BazCompositionLocal: ProvidableCompositionLocal<Int> =
+                            compositionLocalOf()
+                    }
+                }
+            """
+            ),
+            compositionLocalStub
+        )
+            .run()
+            .expect(
+                """
+src/androidx/compose/runtime/foo/Test.kt:6: Warning: CompositionLocal properties should be prefixed with Local [CompositionLocalNaming]
+                val FooCompositionLocal = compositionLocalOf { 5 }
+                    ~~~~~~~~~~~~~~~~~~~
+src/androidx/compose/runtime/foo/Test.kt:9: Warning: CompositionLocal properties should be prefixed with Local [CompositionLocalNaming]
+                    val BarCompositionLocal: CompositionLocal<String?> = staticCompositionLocalOf {
+                        ~~~~~~~~~~~~~~~~~~~
+src/androidx/compose/runtime/foo/Test.kt:16: Warning: CompositionLocal properties should be prefixed with Local [CompositionLocalNaming]
+                        val BazCompositionLocal: ProvidableCompositionLocal<Int> =
+                            ~~~~~~~~~~~~~~~~~~~
+0 errors, 3 warnings
+            """
+            )
+    }
+
+    @Test
+    fun prefixedWithLocal() {
+        lint().files(
+            kotlin(
+                """
+                package androidx.compose.runtime.foo
+
+                import androidx.compose.runtime.*
+
+                val LocalFoo = compositionLocalOf { 5 }
+
+                object Test {
+                    val LocalBar: CompositionLocal<String?> = staticCompositionLocalOf { null }
+                }
+
+                class Test2 {
+                    companion object {
+                        val LocalBaz: ProvidableCompositionLocal<Int> = compositionLocalOf()
+                    }
+                }
+            """
+            ),
+            compositionLocalStub
+        )
+            .run()
+            .expectClean()
+    }
+}
+/* ktlint-enable max-line-length */
diff --git a/compose/runtime/runtime-livedata/api/current.txt b/compose/runtime/runtime-livedata/api/current.txt
index 33466b9..e004a29 100644
--- a/compose/runtime/runtime-livedata/api/current.txt
+++ b/compose/runtime/runtime-livedata/api/current.txt
@@ -2,7 +2,7 @@
 package androidx.compose.runtime.livedata {
 
   public final class LiveDataAdapterKt {
-    method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
     method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
   }
 
diff --git a/compose/runtime/runtime-livedata/api/public_plus_experimental_current.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_current.txt
index 33466b9..e004a29 100644
--- a/compose/runtime/runtime-livedata/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_current.txt
@@ -2,7 +2,7 @@
 package androidx.compose.runtime.livedata {
 
   public final class LiveDataAdapterKt {
-    method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
     method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
   }
 
diff --git a/compose/runtime/runtime-livedata/api/restricted_current.txt b/compose/runtime/runtime-livedata/api/restricted_current.txt
index 33466b9..e004a29 100644
--- a/compose/runtime/runtime-livedata/api/restricted_current.txt
+++ b/compose/runtime/runtime-livedata/api/restricted_current.txt
@@ -2,7 +2,7 @@
 package androidx.compose.runtime.livedata {
 
   public final class LiveDataAdapterKt {
-    method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
     method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
   }
 
diff --git a/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt b/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
index 46b3d0c..f752298 100644
--- a/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
+++ b/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.platform.AmbientLifecycleOwner
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
@@ -88,7 +88,7 @@
         var realValue: String? = null
         val lifecycleOwner = rule.runOnUiThread { RegistryOwner() }
         rule.setContent {
-            Providers(AmbientLifecycleOwner provides lifecycleOwner) {
+            Providers(LocalLifecycleOwner provides lifecycleOwner) {
                 realValue = liveData.observeAsState().value
             }
         }
@@ -112,7 +112,7 @@
         var emit by mutableStateOf(false)
         val lifecycleOwner = rule.runOnUiThread { RegistryOwner() }
         rule.setContent {
-            Providers(AmbientLifecycleOwner provides lifecycleOwner) {
+            Providers(LocalLifecycleOwner provides lifecycleOwner) {
                 if (emit) {
                     liveData.observeAsState()
                 }
@@ -138,7 +138,7 @@
         var realValue: String? = null
         val lifecycleOwner = rule.runOnUiThread { RegistryOwner() }
         rule.setContent {
-            Providers(AmbientLifecycleOwner provides lifecycleOwner) {
+            Providers(LocalLifecycleOwner provides lifecycleOwner) {
                 realValue = liveData.observeAsState().value
             }
         }
@@ -176,7 +176,7 @@
             }
         }
         rule.setContent {
-            Providers(AmbientLifecycleOwner provides lifecycleOwner) {
+            Providers(LocalLifecycleOwner provides lifecycleOwner) {
                 realValue = liveData.observeAsState(null).value
             }
         }
@@ -195,7 +195,7 @@
             }
         }
         rule.setContent {
-            Providers(AmbientLifecycleOwner provides lifecycleOwner) {
+            Providers(LocalLifecycleOwner provides lifecycleOwner) {
                 realValue = liveData.observeAsState().value!!
             }
         }
diff --git a/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt b/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
index 33678db..289a4d0 100644
--- a/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
+++ b/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
@@ -21,7 +21,7 @@
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.ui.platform.AmbientLifecycleOwner
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.LiveData
@@ -37,9 +37,8 @@
  *
  * @sample androidx.compose.runtime.livedata.samples.LiveDataSample
  */
-@Suppress("NOTHING_TO_INLINE")
 @Composable
-inline fun <T> LiveData<T>.observeAsState(): State<T?> = observeAsState(value)
+fun <T> LiveData<T>.observeAsState(): State<T?> = observeAsState(value)
 
 /**
  * Starts observing this [LiveData] and represents its values via [State]. Every time there would
@@ -53,7 +52,7 @@
  */
 @Composable
 fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
-    val lifecycleOwner = AmbientLifecycleOwner.current
+    val lifecycleOwner = LocalLifecycleOwner.current
     val state = remember { mutableStateOf(initial) }
     DisposableEffect(this, lifecycleOwner) {
         val observer = Observer<T> { state.value = it }
diff --git a/compose/runtime/runtime-saveable/api/current.txt b/compose/runtime/runtime-saveable/api/current.txt
index f7e8664..c0e7f38 100644
--- a/compose/runtime/runtime-saveable/api/current.txt
+++ b/compose/runtime/runtime-saveable/api/current.txt
@@ -36,7 +36,7 @@
 
   public final class SaveableStateRegistryKt {
     method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.runtime.saveable.SaveableStateRegistry> getAmbientSaveableStateRegistry();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
   }
 
   public interface Saver<Original, Saveable> {
@@ -61,7 +61,7 @@
     method @Deprecated public static <Original, Saveable> androidx.compose.runtime.savedinstancestate.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
     method @Deprecated public static androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry UiSavedStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
     method @Deprecated public static <T> androidx.compose.runtime.savedinstancestate.Saver<T,java.lang.Object> autoSaver();
-    method @Deprecated public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry> getAmbientUiSavedStateRegistry();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry> getAmbientUiSavedStateRegistry();
     method @Deprecated public static <Original, Saveable> androidx.compose.runtime.savedinstancestate.Saver<Original,?> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
     method @Deprecated public static <T> androidx.compose.runtime.savedinstancestate.Saver<T,?> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
     method @Deprecated @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.savedinstancestate.RestorableStateHolder<T> rememberRestorableStateHolder();
diff --git a/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt
index f7e8664..c0e7f38 100644
--- a/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt
@@ -36,7 +36,7 @@
 
   public final class SaveableStateRegistryKt {
     method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.runtime.saveable.SaveableStateRegistry> getAmbientSaveableStateRegistry();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
   }
 
   public interface Saver<Original, Saveable> {
@@ -61,7 +61,7 @@
     method @Deprecated public static <Original, Saveable> androidx.compose.runtime.savedinstancestate.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
     method @Deprecated public static androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry UiSavedStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
     method @Deprecated public static <T> androidx.compose.runtime.savedinstancestate.Saver<T,java.lang.Object> autoSaver();
-    method @Deprecated public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry> getAmbientUiSavedStateRegistry();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry> getAmbientUiSavedStateRegistry();
     method @Deprecated public static <Original, Saveable> androidx.compose.runtime.savedinstancestate.Saver<Original,?> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
     method @Deprecated public static <T> androidx.compose.runtime.savedinstancestate.Saver<T,?> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
     method @Deprecated @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.savedinstancestate.RestorableStateHolder<T> rememberRestorableStateHolder();
diff --git a/compose/runtime/runtime-saveable/api/restricted_current.txt b/compose/runtime/runtime-saveable/api/restricted_current.txt
index f7e8664..c0e7f38 100644
--- a/compose/runtime/runtime-saveable/api/restricted_current.txt
+++ b/compose/runtime/runtime-saveable/api/restricted_current.txt
@@ -36,7 +36,7 @@
 
   public final class SaveableStateRegistryKt {
     method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.runtime.saveable.SaveableStateRegistry> getAmbientSaveableStateRegistry();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
   }
 
   public interface Saver<Original, Saveable> {
@@ -61,7 +61,7 @@
     method @Deprecated public static <Original, Saveable> androidx.compose.runtime.savedinstancestate.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
     method @Deprecated public static androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry UiSavedStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
     method @Deprecated public static <T> androidx.compose.runtime.savedinstancestate.Saver<T,java.lang.Object> autoSaver();
-    method @Deprecated public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry> getAmbientUiSavedStateRegistry();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.savedinstancestate.UiSavedStateRegistry> getAmbientUiSavedStateRegistry();
     method @Deprecated public static <Original, Saveable> androidx.compose.runtime.savedinstancestate.Saver<Original,?> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
     method @Deprecated public static <T> androidx.compose.runtime.savedinstancestate.Saver<T,?> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.savedinstancestate.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
     method @Deprecated @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.savedinstancestate.RestorableStateHolder<T> rememberRestorableStateHolder();
diff --git a/compose/runtime/runtime-saveable/src/androidAndroidTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt b/compose/runtime/runtime-saveable/src/androidAndroidTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt
index 25bcd69..32f5e04 100644
--- a/compose/runtime/runtime-saveable/src/androidAndroidTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt
+++ b/compose/runtime/runtime-saveable/src/androidAndroidTest/kotlin/androidx/compose/runtime/saveable/RememberSaveableTest.kt
@@ -390,7 +390,7 @@
     content: @Composable () -> Unit
 ) {
     Providers(
-        AmbientSaveableStateRegistry provides wrap(AmbientSaveableStateRegistry.current!!),
+        LocalSaveableStateRegistry provides wrap(LocalSaveableStateRegistry.current!!),
         content = content
     )
 }
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt
index 2f53714..3847bb8 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/RememberSaveable.kt
@@ -77,7 +77,7 @@
     @Suppress("UNCHECKED_CAST")
     (saver as Saver<T, Any>)
 
-    val registry = AmbientSaveableStateRegistry.current
+    val registry = LocalSaveableStateRegistry.current
     // value is restored using the registry or created via [init] lambda
     val value = remember(*inputs) {
         // TODO not restore when the input values changed (use hashKeys?) b/152014032
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt
index 3c24c63..e69878c 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateHolder.kt
@@ -63,7 +63,7 @@
     ) {
         SaveableStateHolderImpl()
     }.apply {
-        parentSaveableStateRegistry = AmbientSaveableStateRegistry.current
+        parentSaveableStateRegistry = LocalSaveableStateRegistry.current
     }
 
 private class SaveableStateHolderImpl(
@@ -84,7 +84,7 @@
                 RegistryHolder(key)
             }
             Providers(
-                AmbientSaveableStateRegistry provides registryHolder.registry,
+                LocalSaveableStateRegistry provides registryHolder.registry,
                 content = content
             )
             DisposableEffect(key) {
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt
index 4821841..184d2d4 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/saveable/SaveableStateRegistry.kt
@@ -17,7 +17,7 @@
 package androidx.compose.runtime.saveable
 
 import androidx.compose.runtime.saveable.SaveableStateRegistry.Entry
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 
 /**
  * Allows components to save and restore their state using the saved instance state mechanism.
@@ -86,9 +86,9 @@
 ): SaveableStateRegistry = SaveableStateRegistryImpl(restoredValues, canBeSaved)
 
 /**
- * Ambient with a current [SaveableStateRegistry] instance.
+ * CompositionLocal with a current [SaveableStateRegistry] instance.
  */
-val AmbientSaveableStateRegistry = staticAmbientOf<SaveableStateRegistry?> { null }
+val LocalSaveableStateRegistry = staticCompositionLocalOf<SaveableStateRegistry?> { null }
 
 private class SaveableStateRegistryImpl(
     restored: Map<String, List<Any?>>?,
diff --git a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/Deprecated.kt b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/Deprecated.kt
index 43e210f..c3112db 100644
--- a/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/Deprecated.kt
+++ b/compose/runtime/runtime-saveable/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/Deprecated.kt
@@ -161,14 +161,15 @@
 )
 
 @Deprecated(
-    "It was renamed to AmbientSaveableStateRegistry and moved to" +
+    "It was renamed to LocalSaveableStateRegistry and moved to" +
         " androidx.compose.runtime.saveable package",
     ReplaceWith(
-        "AmbientSaveableStateRegistry",
-        "androidx.compose.runtime.saveable.AmbientSaveableStateRegistry"
+        "LocalSaveableStateRegistry",
+        "androidx.compose.runtime.saveable.LocalSaveableStateRegistry"
     ),
     level = DeprecationLevel.ERROR
 )
+@Suppress("CompositionLocalNaming")
 val AmbientUiSavedStateRegistry = staticAmbientOf<UiSavedStateRegistry?> {
     throw IllegalStateException(
         "It was renamed to SaveableStateRegistry and moved to androidx.compose.runtime.saveable" +
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 310927b..bf1b662 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -23,17 +23,6 @@
   public final class ActualJvmKt {
   }
 
-  @androidx.compose.runtime.Stable public abstract sealed class Ambient<T> {
-    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
-    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
-  }
-
-  public final class AmbientKt {
-    method @androidx.compose.runtime.Composable public static void Providers(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> androidx.compose.runtime.ProvidableAmbient<T> ambientOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
-    method public static <T> androidx.compose.runtime.ProvidableAmbient<T> staticAmbientOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
-  }
-
   public interface Applier<N> {
     method public void clear();
     method public void down(N? node);
@@ -102,7 +91,7 @@
     method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(long value);
     method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(double value);
     method @androidx.compose.runtime.InternalComposeApi public void collectParameterInformation();
-    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.Ambient<T> key);
+    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.CompositionLocal<T> key);
     method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
     method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
     method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
@@ -194,6 +183,19 @@
     method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionReference parent);
   }
 
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void Providers(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> ambientOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method @Deprecated public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticAmbientOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+  }
+
   public abstract class CompositionReference {
   }
 
@@ -342,17 +344,17 @@
     method public suspend Object? awaitDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDispose, kotlin.coroutines.Continuation<?> p);
   }
 
-  @androidx.compose.runtime.Stable public abstract class ProvidableAmbient<T> extends androidx.compose.runtime.Ambient<T> {
+  @androidx.compose.runtime.Stable public abstract class ProvidableCompositionLocal<T> extends androidx.compose.runtime.CompositionLocal<T> {
     method public final infix androidx.compose.runtime.ProvidedValue<T> provides(T? value);
     method public final infix androidx.compose.runtime.ProvidedValue<T> providesDefault(T? value);
   }
 
   public final class ProvidedValue<T> {
-    method public androidx.compose.runtime.Ambient<T> getAmbient();
     method public boolean getCanOverride();
+    method public androidx.compose.runtime.CompositionLocal<T> getCompositionLocal();
     method public T! getValue();
-    property public final androidx.compose.runtime.Ambient<T> ambient;
     property public final boolean canOverride;
+    property public final androidx.compose.runtime.CompositionLocal<T> compositionLocal;
     property public final T! value;
   }
 
@@ -662,7 +664,7 @@
     method public void close$metalava_module();
     method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
-    method public boolean getReadonly();
+    method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
     method public boolean hasPendingChanges();
@@ -675,21 +677,27 @@
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
     property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
-    property public boolean readonly;
+    property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
   }
 
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
   public abstract sealed class Snapshot {
     method public void dispose();
     method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
     method public int getId();
-    method public abstract boolean getReadonly();
+    method public abstract boolean getReadOnly();
+    method @Deprecated public final boolean getReadonly();
     method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public abstract boolean hasPendingChanges();
     method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
     property public int id;
-    property public abstract boolean readonly;
+    property public abstract boolean readOnly;
+    property @Deprecated public final boolean readonly;
     property public abstract androidx.compose.runtime.snapshots.Snapshot root;
     field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
   }
@@ -700,8 +708,8 @@
     method public void notifyObjectsInitialized();
     method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
     method @androidx.compose.runtime.InternalComposeApi public int openSnapshotCount();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
     method public void sendApplyNotifications();
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
@@ -770,7 +778,7 @@
     method public boolean contains(Object? element);
     method public boolean containsAll(java.util.Collection<?> elements);
     method public T! get(int index);
-    method public androidx.compose.runtime.snapshots.SnapshotStateList.StateListStateRecord<T> getFirstStateRecord();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
     method public int getSize();
     method public int indexOf(Object? element);
     method public boolean isEmpty();
@@ -786,15 +794,10 @@
     method public boolean retainAll(java.util.Collection<?> elements);
     method public T! set(int index, T? element);
     method public java.util.List<T> subList(int fromIndex, int toIndex);
-    property public androidx.compose.runtime.snapshots.SnapshotStateList.StateListStateRecord<T> firstStateRecord;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
     property public int size;
   }
 
-  public static final class SnapshotStateList.StateListStateRecord<T> extends androidx.compose.runtime.snapshots.StateRecord {
-    method public void assign(androidx.compose.runtime.snapshots.StateRecord value);
-    method public androidx.compose.runtime.snapshots.StateRecord create();
-  }
-
   public final class SnapshotStateListKt {
   }
 
@@ -805,7 +808,7 @@
     method public boolean containsValue(Object? value);
     method public V? get(Object? key);
     method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
-    method public androidx.compose.runtime.snapshots.SnapshotStateMap.StateMapStateRecord<K,V> getFirstStateRecord();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
     method public java.util.Set<K> getKeys();
     method public int getSize();
     method public java.util.Collection<V> getValues();
@@ -815,17 +818,12 @@
     method public void putAll(java.util.Map<? extends K,? extends V> from);
     method public V? remove(Object? key);
     property public java.util.Set<java.util.Map.Entry<K,V>> entries;
-    property public androidx.compose.runtime.snapshots.SnapshotStateMap.StateMapStateRecord<K,V> firstStateRecord;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
     property public java.util.Set<K> keys;
     property public int size;
     property public java.util.Collection<V> values;
   }
 
-  public static final class SnapshotStateMap.StateMapStateRecord<K, V> extends androidx.compose.runtime.snapshots.StateRecord {
-    method public void assign(androidx.compose.runtime.snapshots.StateRecord value);
-    method public androidx.compose.runtime.snapshots.StateRecord create();
-  }
-
   public final class SnapshotStateMapKt {
   }
 
@@ -859,7 +857,7 @@
 package androidx.compose.runtime.tooling {
 
   public final class InspectionTablesKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.util.Set<androidx.compose.runtime.CompositionData>> getInspectionTables();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.CompositionData>> getLocalInspectionTables();
   }
 
 }
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 310927b..bf1b662 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -23,17 +23,6 @@
   public final class ActualJvmKt {
   }
 
-  @androidx.compose.runtime.Stable public abstract sealed class Ambient<T> {
-    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
-    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
-  }
-
-  public final class AmbientKt {
-    method @androidx.compose.runtime.Composable public static void Providers(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> androidx.compose.runtime.ProvidableAmbient<T> ambientOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
-    method public static <T> androidx.compose.runtime.ProvidableAmbient<T> staticAmbientOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
-  }
-
   public interface Applier<N> {
     method public void clear();
     method public void down(N? node);
@@ -102,7 +91,7 @@
     method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(long value);
     method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(double value);
     method @androidx.compose.runtime.InternalComposeApi public void collectParameterInformation();
-    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.Ambient<T> key);
+    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.CompositionLocal<T> key);
     method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
     method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
     method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
@@ -194,6 +183,19 @@
     method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionReference parent);
   }
 
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void Providers(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> ambientOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method @Deprecated public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticAmbientOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+  }
+
   public abstract class CompositionReference {
   }
 
@@ -342,17 +344,17 @@
     method public suspend Object? awaitDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDispose, kotlin.coroutines.Continuation<?> p);
   }
 
-  @androidx.compose.runtime.Stable public abstract class ProvidableAmbient<T> extends androidx.compose.runtime.Ambient<T> {
+  @androidx.compose.runtime.Stable public abstract class ProvidableCompositionLocal<T> extends androidx.compose.runtime.CompositionLocal<T> {
     method public final infix androidx.compose.runtime.ProvidedValue<T> provides(T? value);
     method public final infix androidx.compose.runtime.ProvidedValue<T> providesDefault(T? value);
   }
 
   public final class ProvidedValue<T> {
-    method public androidx.compose.runtime.Ambient<T> getAmbient();
     method public boolean getCanOverride();
+    method public androidx.compose.runtime.CompositionLocal<T> getCompositionLocal();
     method public T! getValue();
-    property public final androidx.compose.runtime.Ambient<T> ambient;
     property public final boolean canOverride;
+    property public final androidx.compose.runtime.CompositionLocal<T> compositionLocal;
     property public final T! value;
   }
 
@@ -662,7 +664,7 @@
     method public void close$metalava_module();
     method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
-    method public boolean getReadonly();
+    method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
     method public boolean hasPendingChanges();
@@ -675,21 +677,27 @@
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
     property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
-    property public boolean readonly;
+    property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
   }
 
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
   public abstract sealed class Snapshot {
     method public void dispose();
     method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
     method public int getId();
-    method public abstract boolean getReadonly();
+    method public abstract boolean getReadOnly();
+    method @Deprecated public final boolean getReadonly();
     method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public abstract boolean hasPendingChanges();
     method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
     property public int id;
-    property public abstract boolean readonly;
+    property public abstract boolean readOnly;
+    property @Deprecated public final boolean readonly;
     property public abstract androidx.compose.runtime.snapshots.Snapshot root;
     field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
   }
@@ -700,8 +708,8 @@
     method public void notifyObjectsInitialized();
     method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
     method @androidx.compose.runtime.InternalComposeApi public int openSnapshotCount();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
     method public void sendApplyNotifications();
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
@@ -770,7 +778,7 @@
     method public boolean contains(Object? element);
     method public boolean containsAll(java.util.Collection<?> elements);
     method public T! get(int index);
-    method public androidx.compose.runtime.snapshots.SnapshotStateList.StateListStateRecord<T> getFirstStateRecord();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
     method public int getSize();
     method public int indexOf(Object? element);
     method public boolean isEmpty();
@@ -786,15 +794,10 @@
     method public boolean retainAll(java.util.Collection<?> elements);
     method public T! set(int index, T? element);
     method public java.util.List<T> subList(int fromIndex, int toIndex);
-    property public androidx.compose.runtime.snapshots.SnapshotStateList.StateListStateRecord<T> firstStateRecord;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
     property public int size;
   }
 
-  public static final class SnapshotStateList.StateListStateRecord<T> extends androidx.compose.runtime.snapshots.StateRecord {
-    method public void assign(androidx.compose.runtime.snapshots.StateRecord value);
-    method public androidx.compose.runtime.snapshots.StateRecord create();
-  }
-
   public final class SnapshotStateListKt {
   }
 
@@ -805,7 +808,7 @@
     method public boolean containsValue(Object? value);
     method public V? get(Object? key);
     method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
-    method public androidx.compose.runtime.snapshots.SnapshotStateMap.StateMapStateRecord<K,V> getFirstStateRecord();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
     method public java.util.Set<K> getKeys();
     method public int getSize();
     method public java.util.Collection<V> getValues();
@@ -815,17 +818,12 @@
     method public void putAll(java.util.Map<? extends K,? extends V> from);
     method public V? remove(Object? key);
     property public java.util.Set<java.util.Map.Entry<K,V>> entries;
-    property public androidx.compose.runtime.snapshots.SnapshotStateMap.StateMapStateRecord<K,V> firstStateRecord;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
     property public java.util.Set<K> keys;
     property public int size;
     property public java.util.Collection<V> values;
   }
 
-  public static final class SnapshotStateMap.StateMapStateRecord<K, V> extends androidx.compose.runtime.snapshots.StateRecord {
-    method public void assign(androidx.compose.runtime.snapshots.StateRecord value);
-    method public androidx.compose.runtime.snapshots.StateRecord create();
-  }
-
   public final class SnapshotStateMapKt {
   }
 
@@ -859,7 +857,7 @@
 package androidx.compose.runtime.tooling {
 
   public final class InspectionTablesKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.util.Set<androidx.compose.runtime.CompositionData>> getInspectionTables();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.CompositionData>> getLocalInspectionTables();
   }
 
 }
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index c04ee11..2e289d0 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -24,17 +24,6 @@
     method @kotlin.PublishedApi internal static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
   }
 
-  @androidx.compose.runtime.Stable public abstract sealed class Ambient<T> {
-    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
-    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
-  }
-
-  public final class AmbientKt {
-    method @androidx.compose.runtime.Composable public static void Providers(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static <T> androidx.compose.runtime.ProvidableAmbient<T> ambientOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
-    method public static <T> androidx.compose.runtime.ProvidableAmbient<T> staticAmbientOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
-  }
-
   public interface Applier<N> {
     method public void clear();
     method public void down(N? node);
@@ -104,7 +93,7 @@
     method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(long value);
     method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(double value);
     method @androidx.compose.runtime.InternalComposeApi public void collectParameterInformation();
-    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.Ambient<T> key);
+    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.CompositionLocal<T> key);
     method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
     method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
     method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
@@ -161,8 +150,8 @@
     method @androidx.compose.runtime.ComposeCompilerApi public static inline <T> T! cache(androidx.compose.runtime.Composer, boolean invalid, kotlin.jvm.functions.Function0<? extends T> block);
     method @androidx.compose.runtime.Composable public static int currentCompositeKeyHash();
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.Composer getCurrentComposer();
-    field @kotlin.PublishedApi internal static final androidx.compose.runtime.OpaqueKey ambientMap;
-    field @kotlin.PublishedApi internal static final int ambientMapKey = 202; // 0xca
+    field @kotlin.PublishedApi internal static final androidx.compose.runtime.OpaqueKey compositionLocalMap;
+    field @kotlin.PublishedApi internal static final int compositionLocalMapKey = 202; // 0xca
     field @kotlin.PublishedApi internal static final androidx.compose.runtime.OpaqueKey invocation;
     field @kotlin.PublishedApi internal static final int invocationKey = 200; // 0xc8
     field @kotlin.PublishedApi internal static final androidx.compose.runtime.OpaqueKey provider;
@@ -208,6 +197,19 @@
     method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionReference parent);
   }
 
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void Providers(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> ambientOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method @Deprecated public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticAmbientOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(optional kotlin.jvm.functions.Function0<? extends T>? defaultFactory);
+  }
+
   public abstract class CompositionReference {
   }
 
@@ -366,17 +368,17 @@
     method public suspend Object? awaitDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDispose, kotlin.coroutines.Continuation<?> p);
   }
 
-  @androidx.compose.runtime.Stable public abstract class ProvidableAmbient<T> extends androidx.compose.runtime.Ambient<T> {
+  @androidx.compose.runtime.Stable public abstract class ProvidableCompositionLocal<T> extends androidx.compose.runtime.CompositionLocal<T> {
     method public final infix androidx.compose.runtime.ProvidedValue<T> provides(T? value);
     method public final infix androidx.compose.runtime.ProvidedValue<T> providesDefault(T? value);
   }
 
   public final class ProvidedValue<T> {
-    method public androidx.compose.runtime.Ambient<T> getAmbient();
     method public boolean getCanOverride();
+    method public androidx.compose.runtime.CompositionLocal<T> getCompositionLocal();
     method public T! getValue();
-    property public final androidx.compose.runtime.Ambient<T> ambient;
     property public final boolean canOverride;
+    property public final androidx.compose.runtime.CompositionLocal<T> compositionLocal;
     property public final T! value;
   }
 
@@ -689,7 +691,7 @@
     method public void close$metalava_module();
     method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
-    method public boolean getReadonly();
+    method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
     method public boolean hasPendingChanges();
@@ -702,23 +704,29 @@
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
     property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
-    property public boolean readonly;
+    property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
   }
 
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
   public abstract sealed class Snapshot {
     method public void dispose();
     method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
     method public int getId();
-    method public abstract boolean getReadonly();
+    method public abstract boolean getReadOnly();
+    method @Deprecated public final boolean getReadonly();
     method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public abstract boolean hasPendingChanges();
     method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot? makeCurrent();
     method @kotlin.PublishedApi internal void restoreCurrent(androidx.compose.runtime.snapshots.Snapshot? snapshot);
     method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
     property public int id;
-    property public abstract boolean readonly;
+    property public abstract boolean readOnly;
+    property @Deprecated public final boolean readonly;
     property public abstract androidx.compose.runtime.snapshots.Snapshot root;
     field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
   }
@@ -729,8 +737,8 @@
     method public void notifyObjectsInitialized();
     method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
     method @androidx.compose.runtime.InternalComposeApi public int openSnapshotCount();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
     method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot? removeCurrent();
     method @kotlin.PublishedApi internal void restoreCurrent(androidx.compose.runtime.snapshots.Snapshot? previous);
     method public void sendApplyNotifications();
@@ -807,7 +815,7 @@
     method public boolean contains(Object? element);
     method public boolean containsAll(java.util.Collection<?> elements);
     method public T! get(int index);
-    method public androidx.compose.runtime.snapshots.SnapshotStateList.StateListStateRecord<T> getFirstStateRecord();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
     method public int getSize();
     method public int indexOf(Object? element);
     method public boolean isEmpty();
@@ -823,15 +831,10 @@
     method public boolean retainAll(java.util.Collection<?> elements);
     method public T! set(int index, T? element);
     method public java.util.List<T> subList(int fromIndex, int toIndex);
-    property public androidx.compose.runtime.snapshots.SnapshotStateList.StateListStateRecord<T> firstStateRecord;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
     property public int size;
   }
 
-  public static final class SnapshotStateList.StateListStateRecord<T> extends androidx.compose.runtime.snapshots.StateRecord {
-    method public void assign(androidx.compose.runtime.snapshots.StateRecord value);
-    method public androidx.compose.runtime.snapshots.StateRecord create();
-  }
-
   public final class SnapshotStateListKt {
   }
 
@@ -842,7 +845,7 @@
     method public boolean containsValue(Object? value);
     method public V? get(Object? key);
     method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
-    method public androidx.compose.runtime.snapshots.SnapshotStateMap.StateMapStateRecord<K,V> getFirstStateRecord();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
     method public java.util.Set<K> getKeys();
     method public int getSize();
     method public java.util.Collection<V> getValues();
@@ -852,17 +855,12 @@
     method public void putAll(java.util.Map<? extends K,? extends V> from);
     method public V? remove(Object? key);
     property public java.util.Set<java.util.Map.Entry<K,V>> entries;
-    property public androidx.compose.runtime.snapshots.SnapshotStateMap.StateMapStateRecord<K,V> firstStateRecord;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
     property public java.util.Set<K> keys;
     property public int size;
     property public java.util.Collection<V> values;
   }
 
-  public static final class SnapshotStateMap.StateMapStateRecord<K, V> extends androidx.compose.runtime.snapshots.StateRecord {
-    method public void assign(androidx.compose.runtime.snapshots.StateRecord value);
-    method public androidx.compose.runtime.snapshots.StateRecord create();
-  }
-
   public final class SnapshotStateMapKt {
   }
 
@@ -896,7 +894,7 @@
 package androidx.compose.runtime.tooling {
 
   public final class InspectionTablesKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.util.Set<androidx.compose.runtime.CompositionData>> getInspectionTables();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.CompositionData>> getLocalInspectionTables();
   }
 
 }
diff --git a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt
index 53326a6..fee0162 100644
--- a/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt
+++ b/compose/runtime/runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/runtime/benchmark/ComposeBenchmarkBase.kt
@@ -26,8 +26,6 @@
 import androidx.compose.runtime.Recomposer
 import androidx.compose.runtime.currentComposer
 import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.snapshots.SnapshotReadObserver
-import androidx.compose.runtime.snapshots.SnapshotWriteObserver
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.test.TestMonotonicFrameClock
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -92,12 +90,8 @@
 
         val composition = activeComposition
         require(composition != null) { "Composition was null" }
-        val readObserver: SnapshotReadObserver = {
-            composition.recordReadOf(it)
-        }
-        val writeObserver: SnapshotWriteObserver = {
-            composition.recordWriteOf(it)
-        }
+        val readObserver = { value: Any -> composition.recordReadOf(value) }
+        val writeObserver = { value: Any -> composition.recordWriteOf(value) }
         val unregisterApplyObserver = Snapshot.registerApplyObserver { changed, _ ->
             composition.recordModificationsOf(changed)
         }
@@ -116,7 +110,7 @@
                 }
             }
         } finally {
-            unregisterApplyObserver()
+            unregisterApplyObserver.dispose()
             activity.setContentView(emptyView)
         }
     }
@@ -191,8 +185,8 @@
 }
 
 fun ControlledComposition.performRecompose(
-    readObserver: SnapshotReadObserver,
-    writeObserver: SnapshotWriteObserver
+    readObserver: (Any) -> Unit,
+    writeObserver: (Any) -> Unit
 ): Boolean {
     val snapshot = Snapshot.takeMutableSnapshot(readObserver, writeObserver)
     val result = snapshot.enter {
diff --git a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt
index 736210d..d97f300 100644
--- a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AndroidSnapshotTests.kt
@@ -59,7 +59,7 @@
                     }
                 }
             } finally {
-                unregister()
+                unregister.dispose()
             }
         } finally {
             stop = true
diff --git a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
index 21005f4..ed0aa81 100644
--- a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
@@ -25,7 +25,7 @@
 import androidx.activity.ComponentActivity
 import androidx.compose.runtime.snapshots.Snapshot
 import androidx.compose.ui.node.UiApplier
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.setContent
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
@@ -138,7 +138,7 @@
     private fun initialComposition(composable: @Composable () -> Unit) {
         activity.show {
             Providers(
-                AmbientContext provides activity
+                LocalContext provides activity
             ) {
                 composable()
             }
diff --git a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AmbientTests.kt b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
similarity index 64%
rename from compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AmbientTests.kt
rename to compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
index c4c19d9..2faec93 100644
--- a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/AmbientTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/CompositionLocalTests.kt
@@ -31,25 +31,24 @@
 import kotlin.test.assertFalse
 import kotlin.test.assertTrue
 
-// Create a normal (dynamic) ambient with a string value
-val someTextAmbient = ambientOf { "Default" }
+// Create a normal (dynamic) CompositionLocal with a string value
+val someTextCompositionLocal = compositionLocalOf { "Default" }
 
-// Create a normal (dynamic) ambient with an int value
-val someIntAmbient = ambientOf { 1 }
+// Create a normal (dynamic) CompositionLocal with an int value
+val someIntCompositionLocal = compositionLocalOf { 1 }
 
-// Create a non-overridable ambient provider key
-private val someOtherIntProvider = ambientOf { 1 }
+// Create a non-overridable CompositionLocal provider key
+private val someOtherIntProvider = compositionLocalOf { 1 }
 
 // Make public the consumer key.
-val someOtherIntAmbient: Ambient<Int> =
-    someOtherIntProvider
+val someOtherIntCompositionLocal: CompositionLocal<Int> = someOtherIntProvider
 
-// Create a static ambient with an int value
-val someStaticInt = staticAmbientOf { 40 }
+// Create a static CompositionLocal with an int value
+val someStaticInt = staticCompositionLocalOf { 40 }
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class AmbientTests : BaseComposeTest() {
+class CompositionLocalTests : BaseComposeTest() {
 
     @Composable
     @Suppress("Deprecation")
@@ -58,65 +57,65 @@
     }
 
     @Composable
-    fun ReadStringAmbient(ambient: Ambient<String>, id: Int = 100) {
-        Text(value = ambient.current, id = id)
+    fun ReadStringCompositionLocal(compositionLocal: CompositionLocal<String>, id: Int = 100) {
+        Text(value = compositionLocal.current, id = id)
     }
 
     @get:Rule
     override val activityRule = makeTestActivityRule()
 
     @Test
-    fun testAmbientApi() {
+    fun testCompositionLocalApi() {
         compose {
-            assertEquals("Default", someTextAmbient.current)
-            assertEquals(1, someIntAmbient.current)
+            assertEquals("Default", someTextCompositionLocal.current)
+            assertEquals(1, someIntCompositionLocal.current)
             Providers(
-                someTextAmbient provides "Test1",
-                someIntAmbient provides 12,
+                someTextCompositionLocal provides "Test1",
+                someIntCompositionLocal provides 12,
                 someOtherIntProvider provides 42,
                 someStaticInt provides 50
             ) {
                 assertEquals(
                     "Test1",
-                    someTextAmbient.current
+                    someTextCompositionLocal.current
                 )
-                assertEquals(12, someIntAmbient.current)
+                assertEquals(12, someIntCompositionLocal.current)
                 assertEquals(
                     42,
-                    someOtherIntAmbient.current
+                    someOtherIntCompositionLocal.current
                 )
                 assertEquals(50, someStaticInt.current)
                 Providers(
-                    someTextAmbient provides "Test2",
+                    someTextCompositionLocal provides "Test2",
                     someStaticInt provides 60
                 ) {
                     assertEquals(
                         "Test2",
-                        someTextAmbient.current
+                        someTextCompositionLocal.current
                     )
                     assertEquals(
                         12,
-                        someIntAmbient.current
+                        someIntCompositionLocal.current
                     )
                     assertEquals(
                         42,
-                        someOtherIntAmbient.current
+                        someOtherIntCompositionLocal.current
                     )
                     assertEquals(60, someStaticInt.current)
                 }
                 assertEquals(
                     "Test1",
-                    someTextAmbient.current
+                    someTextCompositionLocal.current
                 )
-                assertEquals(12, someIntAmbient.current)
+                assertEquals(12, someIntCompositionLocal.current)
                 assertEquals(
                     42,
-                    someOtherIntAmbient.current
+                    someOtherIntCompositionLocal.current
                 )
                 assertEquals(50, someStaticInt.current)
             }
-            assertEquals("Default", someTextAmbient.current)
-            assertEquals(1, someIntAmbient.current)
+            assertEquals("Default", someTextCompositionLocal.current)
+            assertEquals(1, someIntCompositionLocal.current)
         }.then {
             // Force the composition to run
         }
@@ -131,10 +130,10 @@
         compose {
             invalidates.add(currentRecomposeScope)
             Providers(
-                someTextAmbient provides someText
+                someTextCompositionLocal provides someText
             ) {
-                ReadStringAmbient(
-                    ambient = someTextAmbient,
+                ReadStringCompositionLocal(
+                    compositionLocal = someTextCompositionLocal,
                     id = tvId
                 )
             }
@@ -153,15 +152,15 @@
         val tvId = 100
         val invalidates = mutableListOf<RecomposeScope>()
         fun doInvalidate() = invalidates.forEach { it.invalidate() }.also { invalidates.clear() }
-        val staticStringAmbient = staticAmbientOf { "Default" }
+        val staticStringCompositionLocal = staticCompositionLocalOf { "Default" }
         var someText = "Unmodified"
         compose {
             invalidates.add(currentRecomposeScope)
             Providers(
-                staticStringAmbient provides someText
+                staticStringCompositionLocal provides someText
             ) {
-                ReadStringAmbient(
-                    ambient = staticStringAmbient,
+                ReadStringCompositionLocal(
+                    compositionLocal = staticStringCompositionLocal,
                     id = tvId
                 )
             }
@@ -185,28 +184,28 @@
             invalidates.add(currentRecomposeScope)
 
             Providers(
-                someTextAmbient provides someText,
-                someIntAmbient provides 0
+                someTextCompositionLocal provides someText,
+                someIntCompositionLocal provides 0
             ) {
-                ReadStringAmbient(ambient = someTextAmbient, id = tvId)
+                ReadStringCompositionLocal(compositionLocal = someTextCompositionLocal, id = tvId)
 
                 subCompose {
                     assertEquals(
                         someText,
-                        someTextAmbient.current
+                        someTextCompositionLocal.current
                     )
-                    assertEquals(0, someIntAmbient.current)
+                    assertEquals(0, someIntCompositionLocal.current)
 
                     Providers(
-                        someIntAmbient provides 42
+                        someIntCompositionLocal provides 42
                     ) {
                         assertEquals(
                             someText,
-                            someTextAmbient.current
+                            someTextCompositionLocal.current
                         )
                         assertEquals(
                             42,
-                            someIntAmbient.current
+                            someIntCompositionLocal.current
                         )
                     }
                 }
@@ -226,34 +225,33 @@
         val tvId = 100
         val invalidates = mutableListOf<RecomposeScope>()
         fun doInvalidate() = invalidates.forEach { it.invalidate() }.also { invalidates.clear() }
-        val staticSomeTextAmbient =
-            staticAmbientOf { "Default" }
-        val staticSomeIntAmbient = staticAmbientOf { -1 }
+        val staticSomeTextCompositionLocal = staticCompositionLocalOf { "Default" }
+        val staticSomeIntCompositionLocal = staticCompositionLocalOf { -1 }
         var someText = "Unmodified"
         compose {
             invalidates.add(currentRecomposeScope)
 
             Providers(
-                staticSomeTextAmbient provides someText,
-                staticSomeIntAmbient provides 0
+                staticSomeTextCompositionLocal provides someText,
+                staticSomeIntCompositionLocal provides 0
             ) {
-                assertEquals(someText, staticSomeTextAmbient.current)
-                assertEquals(0, staticSomeIntAmbient.current)
+                assertEquals(someText, staticSomeTextCompositionLocal.current)
+                assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                ReadStringAmbient(
-                    ambient = staticSomeTextAmbient,
+                ReadStringCompositionLocal(
+                    compositionLocal = staticSomeTextCompositionLocal,
                     id = tvId
                 )
 
                 subCompose {
-                    assertEquals(someText, staticSomeTextAmbient.current)
-                    assertEquals(0, staticSomeIntAmbient.current)
+                    assertEquals(someText, staticSomeTextCompositionLocal.current)
+                    assertEquals(0, staticSomeIntCompositionLocal.current)
 
                     Providers(
-                        staticSomeIntAmbient provides 42
+                        staticSomeIntCompositionLocal provides 42
                     ) {
-                        assertEquals(someText, staticSomeTextAmbient.current)
-                        assertEquals(42, staticSomeIntAmbient.current)
+                        assertEquals(someText, staticSomeTextCompositionLocal.current)
+                        assertEquals(42, staticSomeIntCompositionLocal.current)
                     }
                 }
             }
@@ -278,31 +276,31 @@
             invalidates.add(currentRecomposeScope)
 
             Providers(
-                someTextAmbient provides someText,
-                someIntAmbient provides 0
+                someTextCompositionLocal provides someText,
+                someIntCompositionLocal provides 0
             ) {
-                ReadStringAmbient(
-                    ambient = someTextAmbient,
+                ReadStringCompositionLocal(
+                    compositionLocal = someTextCompositionLocal,
                     id = tvId
                 )
 
                 doSubCompose = deferredSubCompose {
                     assertEquals(
                         someText,
-                        someTextAmbient.current
+                        someTextCompositionLocal.current
                     )
-                    assertEquals(0, someIntAmbient.current)
+                    assertEquals(0, someIntCompositionLocal.current)
 
                     Providers(
-                        someIntAmbient provides 42
+                        someIntCompositionLocal provides 42
                     ) {
                         assertEquals(
                             someText,
-                            someTextAmbient.current
+                            someTextCompositionLocal.current
                         )
                         assertEquals(
                             42,
-                            someIntAmbient.current
+                            someIntCompositionLocal.current
                         )
                     }
                 }
@@ -327,34 +325,33 @@
         fun doInvalidate() = invalidates.forEach { it.invalidate() }.also { invalidates.clear() }
         var someText = "Unmodified"
         var doSubCompose: () -> Unit = { error("Sub-compose callback not set") }
-        val staticSomeTextAmbient =
-            staticAmbientOf { "Default" }
-        val staticSomeIntAmbient = staticAmbientOf { -1 }
+        val staticSomeTextCompositionLocal = staticCompositionLocalOf { "Default" }
+        val staticSomeIntCompositionLocal = staticCompositionLocalOf { -1 }
         compose {
             invalidates.add(currentRecomposeScope)
 
             Providers(
-                staticSomeTextAmbient provides someText,
-                staticSomeIntAmbient provides 0
+                staticSomeTextCompositionLocal provides someText,
+                staticSomeIntCompositionLocal provides 0
             ) {
-                assertEquals(someText, staticSomeTextAmbient.current)
-                assertEquals(0, staticSomeIntAmbient.current)
+                assertEquals(someText, staticSomeTextCompositionLocal.current)
+                assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                ReadStringAmbient(
-                    ambient = staticSomeTextAmbient,
+                ReadStringCompositionLocal(
+                    compositionLocal = staticSomeTextCompositionLocal,
                     id = tvId
                 )
 
                 doSubCompose = deferredSubCompose {
 
-                    assertEquals(someText, staticSomeTextAmbient.current)
-                    assertEquals(0, staticSomeIntAmbient.current)
+                    assertEquals(someText, staticSomeTextCompositionLocal.current)
+                    assertEquals(0, staticSomeIntCompositionLocal.current)
 
                     Providers(
-                        staticSomeIntAmbient provides 42
+                        staticSomeIntCompositionLocal provides 42
                     ) {
-                        assertEquals(someText, staticSomeTextAmbient.current)
-                        assertEquals(42, staticSomeIntAmbient.current)
+                        assertEquals(someText, staticSomeTextCompositionLocal.current)
+                        assertEquals(42, staticSomeIntCompositionLocal.current)
                     }
                 }
             }
@@ -379,28 +376,31 @@
         var someText = "Unmodified"
         var doSubCompose1: () -> Unit = { error("Sub-compose-1 callback not set") }
         var doSubCompose2: () -> Unit = { error("Sub-compose-2 callback not set") }
-        val staticSomeTextAmbient = staticAmbientOf { "Default" }
-        val staticSomeIntAmbient = staticAmbientOf { -1 }
+        val staticSomeTextCompositionLocal = staticCompositionLocalOf { "Default" }
+        val staticSomeIntCompositionLocal = staticCompositionLocalOf { -1 }
         compose {
             invalidates.add(currentRecomposeScope)
 
             Providers(
-                staticSomeTextAmbient provides someText,
-                staticSomeIntAmbient provides 0
+                staticSomeTextCompositionLocal provides someText,
+                staticSomeIntCompositionLocal provides 0
             ) {
-                assertEquals(someText, staticSomeTextAmbient.current)
-                assertEquals(0, staticSomeIntAmbient.current)
+                assertEquals(someText, staticSomeTextCompositionLocal.current)
+                assertEquals(0, staticSomeIntCompositionLocal.current)
 
-                ReadStringAmbient(ambient = staticSomeTextAmbient, id = tvId)
+                ReadStringCompositionLocal(
+                    compositionLocal = staticSomeTextCompositionLocal,
+                    id = tvId
+                )
 
                 doSubCompose1 = deferredSubCompose {
 
-                    assertEquals(someText, staticSomeTextAmbient.current)
-                    assertEquals(0, staticSomeIntAmbient.current)
+                    assertEquals(someText, staticSomeTextCompositionLocal.current)
+                    assertEquals(0, staticSomeIntCompositionLocal.current)
 
                     doSubCompose2 = deferredSubCompose {
-                        assertEquals(someText, staticSomeTextAmbient.current)
-                        assertEquals(0, staticSomeIntAmbient.current)
+                        assertEquals(someText, staticSomeTextCompositionLocal.current)
+                        assertEquals(0, staticSomeIntCompositionLocal.current)
                     }
                 }
             }
@@ -425,8 +425,7 @@
     fun insertShouldSeePreviouslyProvidedValues() {
         val invalidates = mutableListOf<RecomposeScope>()
         fun doInvalidate() = invalidates.forEach { it.invalidate() }.also { invalidates.clear() }
-        val someStaticString =
-            staticAmbientOf { "Default" }
+        val someStaticString = staticCompositionLocalOf { "Default" }
         var shouldRead = false
         compose {
             Providers(
@@ -435,7 +434,7 @@
                 Observe {
                     invalidates.add(currentRecomposeScope)
                     if (shouldRead)
-                        ReadStringAmbient(someStaticString)
+                        ReadStringCompositionLocal(someStaticString)
                 }
             }
         }.then {
@@ -451,22 +450,25 @@
     fun providingANewDataClassValueShouldNotRecompose() {
         val invalidates = mutableListOf<RecomposeScope>()
         fun doInvalidate() = invalidates.forEach { it.invalidate() }.also { invalidates.clear() }
-        val someDataAmbient = ambientOf(structuralEqualityPolicy()) { SomeData() }
+        val someDataCompositionLocal = compositionLocalOf(structuralEqualityPolicy()) { SomeData() }
         var composed = false
 
         @Composable
-        fun ReadSomeDataAmbient(ambient: Ambient<SomeData>, id: Int = 100) {
+        fun ReadSomeDataCompositionLocal(
+            compositionLocal: CompositionLocal<SomeData>,
+            id: Int = 100
+        ) {
             composed = true
-            Text(value = ambient.current.value, id = id)
+            Text(value = compositionLocal.current.value, id = id)
         }
 
         compose {
             Observe {
                 invalidates.add(currentRecomposeScope)
                 Providers(
-                    someDataAmbient provides SomeData("provided")
+                    someDataCompositionLocal provides SomeData("provided")
                 ) {
-                    ReadSomeDataAmbient(someDataAmbient)
+                    ReadSomeDataCompositionLocal(someDataCompositionLocal)
                 }
             }
         }.then {
diff --git a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
index c5adfe5..c7d4856 100644
--- a/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
+++ b/compose/runtime/runtime/integration-tests/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
@@ -548,10 +548,10 @@
     }
 
     @Test
-    fun testAmbient1() {
+    fun testCompositionLocal1() {
         val tv1Id = 100
 
-        val Foo = ambientOf<String>()
+        val Foo = compositionLocalOf<String>()
         var current by mutableStateOf("Hello World")
 
         @Composable
@@ -575,20 +575,20 @@
     }
 
     @Test
-    fun testAmbient2() {
-        val MyAmbient = ambientOf<Int> { throw Exception("not set") }
+    fun testCompositionLocal2() {
+        val MyCompositionLocal = compositionLocalOf<Int> { throw Exception("not set") }
 
         var scope: RecomposeScope? = null
-        var ambientValue = 1
+        var compositionLocalValue = 1
 
         @Composable fun SimpleComposable2() {
-            val value = MyAmbient.current
+            val value = MyCompositionLocal.current
             TextView(text = "$value")
         }
 
         @Composable fun SimpleComposable() {
             scope = currentRecomposeScope
-            Providers(MyAmbient provides ambientValue++) {
+            Providers(MyCompositionLocal provides compositionLocalValue++) {
                 SimpleComposable2()
                 Button(id = 123)
             }
@@ -616,22 +616,22 @@
     }
 
     @Test
-    fun testAmbient_RecomposeScope() {
-        val MyAmbient = ambientOf<Int> { throw Exception("not set") }
+    fun testCompositionLocal_RecomposeScope() {
+        val MyCompositionLocal = compositionLocalOf<Int> { throw Exception("not set") }
 
         var scope: RecomposeScope? = null
         var componentComposed = false
-        var ambientValue = 1
+        var compositionLocalValue = 1
 
         @Composable fun SimpleComposable2() {
             componentComposed = true
-            val value = MyAmbient.current
+            val value = MyCompositionLocal.current
             TextView(text = "$value")
         }
 
         @Composable fun SimpleComposable() {
             scope = currentRecomposeScope
-            Providers(MyAmbient provides ambientValue++) {
+            Providers(MyCompositionLocal provides compositionLocalValue++) {
                 SimpleComposable2()
                 Button(id = 123)
             }
diff --git a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/AmbientSamples.kt b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt
similarity index 79%
rename from compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/AmbientSamples.kt
rename to compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt
index 869d610..e9c0fc3 100644
--- a/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/AmbientSamples.kt
+++ b/compose/runtime/runtime/samples/src/main/java/androidx/compose/runtime/samples/CompositionLocalSamples.kt
@@ -21,15 +21,15 @@
 import androidx.annotation.Sampled
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 
 @Sampled
-fun createAmbient() {
-    val ActiveUser = ambientOf<User> { error("No active user found!") }
+fun createCompositionLocal() {
+    val ActiveUser = compositionLocalOf<User> { error("No active user found!") }
 }
 
 @Sampled
-fun ambientProvider() {
+fun compositionLocalProvider() {
     @Composable
     fun App(user: User) {
         Providers(ActiveUser provides user) {
@@ -47,7 +47,7 @@
 }
 
 @Sampled
-fun consumeAmbient() {
+fun consumeCompositionLocal() {
     @Composable
     fun UserPhoto() {
         val user = ActiveUser.current
@@ -55,7 +55,8 @@
     }
 }
 
-private val ActiveUser = ambientOf<User> { error("No active user found!") }
+@Suppress("CompositionLocalNaming")
+private val ActiveUser = compositionLocalOf<User> { error("No active user found!") }
 
 @Composable private fun SomeScreen() {}
 
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt
index 1aab3c2..0043c50 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt
@@ -35,8 +35,6 @@
     }
 }
 
-internal actual typealias MainThread = androidx.annotation.MainThread
-
 internal actual typealias CheckResult = androidx.annotation.CheckResult
 
 /**
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
deleted file mode 100644
index 1ab3d8e..0000000
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.runtime
-
-/**
- * Compose passes data through the composition tree explicitly through means of parameters to
- * composable functions. This is often times the simplest and best way to have data flow through
- * the tree.
- *
- * Sometimes this model can be cumbersome or break down for data that is needed by lots of
- * components, or when components need to pass data between one another but keep that implementation
- * detail private. For these cases, [Ambient]s can be used as an implicit way to have data flow
- * through a composition.
- *
- * [Ambient]s by their nature are hierarchical. They make sense when the value of the ambient needs
- * to be scoped to a particular sub-hierarchy of the composition.
- *
- * One must create an Ambient instance, which can be referenced by the consumers statically. Ambient
- * instances themselves hold no data, and can be thought of as a type-safe identifier for the data
- * being passed down a tree. Ambient factory functions takes a single parameter, a factory to
- * create a default value in cases where an ambient is used without a Provider. If this is a
- * situation you would rather not handle, you can throw an error in this factory
- *
- * @sample androidx.compose.runtime.samples.createAmbient
- *
- * Somewhere up the tree, a [Providers] component can be used, which provides a value for the
- * ambient. This would often be at the "root" of a tree, but could be anywhere, and can also be
- * used in multiple places to override the provided value for a sub-tree.
- *
- * @sample androidx.compose.runtime.samples.ambientProvider
- *
- * Intermediate components do not need to know about the ambient value, and can have zero
- * dependencies on it. For example, `SomeScreen` might look like this:
- *
- * @sample androidx.compose.runtime.samples.someScreenSample
- *
- * Finally, a component that wishes to consume the ambient value can use the [current]
- * property of the ambient key which returns the current value of the ambient, and subscribes the
- * component to changes of it.
- *
- * @sample androidx.compose.runtime.samples.consumeAmbient
- */
-@Stable
-sealed class Ambient<T> constructor(defaultFactory: (() -> T)? = null) {
-    @Suppress("UNCHECKED_CAST")
-    internal val defaultValueHolder = LazyValueHolder(defaultFactory)
-
-    @Composable
-    internal abstract fun provided(value: T): State<T>
-
-    /**
-     * Return the value provided by the nearest [Providers] component that invokes, directly or
-     * indirectly, the composable function that uses this property.
-     *
-     * @sample androidx.compose.runtime.samples.consumeAmbient
-     */
-    @OptIn(InternalComposeApi::class)
-    inline val current: T
-        @ReadOnlyComposable
-        @Composable
-        get() = currentComposer.consume(this)
-}
-
-/**
- * A [ProvidableAmbient] can be used in [Providers] to provide values.
- *
- * @see ambientOf
- * @see Ambient
- * @see Providers
- */
-@Stable
-abstract class ProvidableAmbient<T> internal constructor(defaultFactory: (() -> T)?) :
-    Ambient<T> (defaultFactory) {
-
-    /**
-     * Associates an ambient key to a value in a call to [Providers].
-     *
-     * @see Ambient
-     * @see ProvidableAmbient
-     */
-    @Suppress("UNCHECKED_CAST")
-    infix fun provides(value: T) = ProvidedValue(this, value, true)
-
-    /**
-     * Associates an ambient key to a value in a call to [Providers] if the key does not
-     * already have an associated value.
-     *
-     * @see Ambient
-     * @see ProvidableAmbient
-     */
-    @Suppress("UNCHECKED_CAST")
-    infix fun providesDefault(value: T) = ProvidedValue(this, value, false)
-}
-
-/**
- * A [DynamicProvidableAmbient] is an ambient backed by [mutableStateOf]. Providing new values
- * using a [DynamicProvidableAmbient] will provide the same [State] with a different value.
- * Reading the ambient value of a [DynamicProvidableAmbient] will record a read in the
- * [RecomposeScope] of the composition. Changing the provided value will invalidate the
- * [RecomposeScope]s.
- *
- * @see ambientOf
- */
-internal class DynamicProvidableAmbient<T> constructor(
-    private val policy: SnapshotMutationPolicy<T>,
-    defaultFactory: (() -> T)?
-) : ProvidableAmbient<T>(defaultFactory) {
-
-    @Composable
-    override fun provided(value: T): State<T> = remember { mutableStateOf(value, policy) }.apply {
-        this.value = value
-    }
-}
-
-/**
- * A [StaticProvidableAmbient] is a value that is expected to rarely change.
- *
- * @see staticAmbientOf
- */
-internal class StaticProvidableAmbient<T>(defaultFactory: (() -> T)?) :
-    ProvidableAmbient<T>(defaultFactory) {
-
-    @Composable
-    override fun provided(value: T): State<T> = StaticValueHolder(value)
-}
-
-/**
- * Create an ambient key that can be provided using [Providers]. Changing the value provided
- * during recomposition will invalidate the children of [Providers] that read the value using
- * [Ambient.current].
- *
- * @param policy a policy to determine when an ambient is considered changed. See
- * [SnapshotMutationPolicy] for details.
- *
- * @see Ambient
- * @see staticAmbientOf
- * @see mutableStateOf
- */
-fun <T> ambientOf(
-    policy: SnapshotMutationPolicy<T> =
-        @OptIn(ExperimentalComposeApi::class)
-        structuralEqualityPolicy(),
-    defaultFactory: (() -> T)? = null
-): ProvidableAmbient<T> = DynamicProvidableAmbient(policy, defaultFactory)
-
-/**
- * Create an ambient key that can be provided using [Providers]. Changing the value provided
- * will cause the entire tree below [Providers] to be recomposed, disabling skipping of composable
- * calls.
- *
- * A static ambient should be only be used when the value provided is highly unlikely to change.
- *
- * @see Ambient
- * @see ambientOf
- */
-fun <T> staticAmbientOf(defaultFactory: (() -> T)? = null): ProvidableAmbient<T> =
-    StaticProvidableAmbient(defaultFactory)
-
-/**
- * [Providers] binds values to [ProvidableAmbient] keys. Reading the ambient using
- * [Ambient.current] will return the value provided in [Providers]'s [values] parameter for all
- * composable functions called directly or indirectly in the [content] lambda.
- *
- * @sample androidx.compose.runtime.samples.ambientProvider
- *
- * @see Ambient
- * @see ambientOf
- * @see staticAmbientOf
- */
-@Composable
-@OptIn(InternalComposeApi::class)
-fun Providers(vararg values: ProvidedValue<*>, content: @Composable () -> Unit) {
-    currentComposer.startProviders(values)
-    content()
-    currentComposer.endProviders()
-}
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 8435ff1..332aaba 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
@@ -22,7 +22,7 @@
 package androidx.compose.runtime
 
 import androidx.compose.runtime.collection.IdentityScopeMap
-import androidx.compose.runtime.tooling.InspectionTables
+import androidx.compose.runtime.tooling.LocalInspectionTables
 import kotlinx.collections.immutable.PersistentMap
 import kotlinx.collections.immutable.persistentHashMapOf
 import kotlin.coroutines.CoroutineContext
@@ -250,39 +250,46 @@
 
 /**
  * An instance to hold a value provided by [Providers] and is created by the
- * [ProvidableAmbient.provides] infixed operator. If [canOverride] is `false`, the
+ * [ProvidableCompositionLocal.provides] infixed operator. If [canOverride] is `false`, the
  * provided value will not overwrite a potentially already existing value in the scope.
  */
 class ProvidedValue<T> internal constructor(
-    val ambient: Ambient<T>,
+    val compositionLocal: CompositionLocal<T>,
     val value: T,
     val canOverride: Boolean
 )
 
 /**
- * An ambient map is is an immutable map that maps ambient keys to a provider of their current
- * value. It is used to represent the combined scope of all provided ambients.
+ * A [CompositionLocal] map is is an immutable map that maps [CompositionLocal] keys to a provider
+ * of their current value. It is used to represent the combined scope of all provided
+ * [CompositionLocal]s.
  */
-internal typealias AmbientMap = PersistentMap<Ambient<Any?>, State<Any?>>
+internal typealias CompositionLocalMap = PersistentMap<CompositionLocal<Any?>, State<Any?>>
 
-internal inline fun AmbientMap.mutate(
-    mutator: (MutableMap<Ambient<Any?>, State<Any?>>) -> Unit
-): AmbientMap = builder().apply(mutator).build()
+internal inline fun CompositionLocalMap.mutate(
+    mutator: (MutableMap<CompositionLocal<Any?>, State<Any?>>) -> Unit
+): CompositionLocalMap = builder().apply(mutator).build()
 
 @Suppress("UNCHECKED_CAST")
-internal fun <T> AmbientMap.contains(key: Ambient<T>) = this.containsKey(key as Ambient<Any?>)
+internal fun <T> CompositionLocalMap.contains(key: CompositionLocal<T>) =
+    this.containsKey(key as CompositionLocal<Any?>)
 
 @Suppress("UNCHECKED_CAST")
-internal fun <T> AmbientMap.getValueOf(key: Ambient<T>) = this[key as Ambient<Any?>]?.value as T
+internal fun <T> CompositionLocalMap.getValueOf(key: CompositionLocal<T>) =
+    this[key as CompositionLocal<Any?>]?.value as T
 
 @Composable
-private fun ambientMapOf(values: Array<out ProvidedValue<*>>, parentScope: AmbientMap): AmbientMap {
-    val result: AmbientMap = persistentHashMapOf()
+private fun compositionLocalMapOf(
+    values: Array<out ProvidedValue<*>>,
+    parentScope: CompositionLocalMap
+): CompositionLocalMap {
+    val result: CompositionLocalMap = persistentHashMapOf()
     return result.mutate {
         for (provided in values) {
-            if (provided.canOverride || !parentScope.contains(provided.ambient)) {
+            if (provided.canOverride || !parentScope.contains(provided.compositionLocal)) {
                 @Suppress("UNCHECKED_CAST")
-                it[provided.ambient as Ambient<Any?>] = provided.ambient.provided(provided.value)
+                it[provided.compositionLocal as CompositionLocal<Any?>] =
+                    provided.compositionLocal.provided(provided.value)
             }
         }
     }
@@ -319,7 +326,7 @@
      *
      * Reflects whether the [Composable] function can skip. Even if a [Composable] function is
      * called with the same parameters it might still need to run because, for example, a new
-     * value was provided for an ambient created by [staticAmbientOf].
+     * value was provided for a [CompositionLocal] created by [staticCompositionLocalOf].
      */
     @ComposeCompilerApi
     val skipping: Boolean
@@ -786,19 +793,19 @@
     /**
      * A Compose internal function. DO NOT call directly.
      *
-     * Return the ambient value associated with [key]. This is the primitive function used to
-     * implement [Ambient.current].
+     * Return the [CompositionLocal] value associated with [key]. This is the primitive function
+     * used to implement [CompositionLocal.current].
      *
-     * @param key the ambient value to be retrieved.
+     * @param key the [CompositionLocal] value to be retrieved.
      */
     @InternalComposeApi
-    fun <T> consume(key: Ambient<T>): T
+    fun <T> consume(key: CompositionLocal<T>): T
 
     /**
      * A Compose internal function. DO NOT call directly.
      *
-     * Provide the given values for tha associated [Ambient] keys. This is the primitive function
-     * used to implement [Providers].
+     * Provide the given values for the associated [CompositionLocal] keys. This is the primitive
+     * function used to implement [Providers].
      *
      * @param values an array of value to provider key pairs.
      */
@@ -862,7 +869,7 @@
      *
      * Build a composition reference that can be used to created a subcomposition. A composition
      * reference is used to communicate information from this composition to the subcompositions
-     * such as the all the ambients provided at the point the reference is created.
+     * such as the all the [CompositionLocal]s provided at the point the reference is created.
      */
     @InternalComposeApi
     fun buildReference(): CompositionReference
@@ -965,8 +972,8 @@
     private val invalidations: MutableList<Invalidation> = mutableListOf()
     internal var pendingInvalidScopes = false
     private val entersStack = IntStack()
-    private var parentProvider: AmbientMap = persistentHashMapOf()
-    private val providerUpdates = HashMap<Int, AmbientMap>()
+    private var parentProvider: CompositionLocalMap = persistentHashMapOf()
+    private val providerUpdates = HashMap<Int, CompositionLocalMap>()
     private var providersInvalid = false
     private val providersInvalidStack = IntStack()
     private var childrenComposing: Int = 0
@@ -1130,12 +1137,12 @@
 
         // parent reference management
         parentReference.startComposing()
-        parentProvider = parentReference.getAmbientScope()
+        parentProvider = parentReference.getCompositionLocalScope()
         providersInvalidStack.push(providersInvalid.asInt())
         providersInvalid = changed(parentProvider)
         collectKeySources = parentReference.collectingKeySources
         collectParameterInformation = parentReference.collectingParameterInformation
-        resolveAmbient(InspectionTables, parentProvider)?.let {
+        resolveCompositionLocal(LocalInspectionTables, parentProvider)?.let {
             it.add(slotTable)
             parentReference.recordInspectionTable(it)
         }
@@ -1759,17 +1766,17 @@
     }
 
     /**
-     * Return the current ambient scope which was provided by a parent group.
+     * Return the current [CompositionLocal] scope which was provided by a parent group.
      */
-    private fun currentAmbientScope(): AmbientMap {
+    private fun currentCompositionLocalScope(): CompositionLocalMap {
         if (inserting && hasProvider) {
             var current = writer.parent
             while (current > 0) {
-                if (writer.groupKey(current) == ambientMapKey &&
-                    writer.groupObjectKey(current) == ambientMap
+                if (writer.groupKey(current) == compositionLocalMapKey &&
+                    writer.groupObjectKey(current) == compositionLocalMap
                 ) {
                     @Suppress("UNCHECKED_CAST")
-                    return writer.groupAux(current) as AmbientMap
+                    return writer.groupAux(current) as CompositionLocalMap
                 }
                 current = writer.parent(current)
             }
@@ -1777,11 +1784,12 @@
         if (slotTable.groupsSize > 0) {
             var current = reader.parent
             while (current > 0) {
-                if (reader.groupKey(current) == ambientMapKey &&
-                    reader.groupObjectKey(current) == ambientMap
+                if (reader.groupKey(current) == compositionLocalMapKey &&
+                    reader.groupObjectKey(current) == compositionLocalMap
                 ) {
                     @Suppress("UNCHECKED_CAST")
-                    return providerUpdates[current] ?: reader.groupAux(current) as AmbientMap
+                    return providerUpdates[current]
+                        ?: reader.groupAux(current) as CompositionLocalMap
                 }
                 current = reader.parent(current)
             }
@@ -1790,27 +1798,28 @@
     }
 
     /**
-     * Return the ambient scope for the location provided. If this is while the composer is
-     * composing then this is a query from a sub-composition that is being recomposed by this
-     * compose which might be inserting the sub-composition. In that case the current scope
+     * Return the [CompositionLocal] scope for the location provided. If this is while the
+     * composer is composing then this is a query from a sub-composition that is being recomposed
+     * by this compose which might be inserting the sub-composition. In that case the current scope
      * is the correct scope.
      */
-    private fun ambientScopeAt(location: Int): AmbientMap {
+    private fun compositionLocalScopeAt(location: Int): CompositionLocalMap {
         if (isComposing) {
             // The sub-composer is being composed as part of a nested composition then use the
-            // current ambient scope as the one in the slot table might be out of date.
-            return currentAmbientScope()
+            // current CompositionLocal scope as the one in the slot table might be out of date.
+            return currentCompositionLocalScope()
         }
 
         if (location >= 0) {
             slotTable.read { reader ->
                 var current = location
                 while (current > 0) {
-                    if (reader.groupKey(current) == ambientMapKey &&
-                        reader.groupObjectKey(current) == ambientMap
+                    if (reader.groupKey(current) == compositionLocalMapKey &&
+                        reader.groupObjectKey(current) == compositionLocalMap
                     ) {
                         @Suppress("UNCHECKED_CAST")
-                        return providerUpdates[current] ?: reader.groupAux(current) as AmbientMap
+                        return providerUpdates[current]
+                            ?: reader.groupAux(current) as CompositionLocalMap
                     }
                     current = reader.parent(current)
                 }
@@ -1825,9 +1834,9 @@
      * inserts, updates and deletes to the providers.
      */
     private fun updateProviderMapGroup(
-        parentScope: AmbientMap,
-        currentProviders: AmbientMap
-    ): AmbientMap {
+        parentScope: CompositionLocalMap,
+        currentProviders: CompositionLocalMap
+    ): CompositionLocalMap {
         val providerScope = parentScope.mutate { it.putAll(currentProviders) }
         startGroup(providerMapsKey, providerMaps)
         changed(providerScope)
@@ -1838,15 +1847,17 @@
 
     @InternalComposeApi
     override fun startProviders(values: Array<out ProvidedValue<*>>) {
-        val parentScope = currentAmbientScope()
+        val parentScope = currentCompositionLocalScope()
         startGroup(providerKey, provider)
-        // The group is needed here because ambientMapOf() might change the number or kind of
-        // slots consumed depending on the content of values to remember, for example, the value
-        // holders used last time.
+        // The group is needed here because compositionLocalMapOf() might change the number or
+        // kind of slots consumed depending on the content of values to remember, for example, the
+        // value holders used last time.
         startGroup(providerValuesKey, providerValues)
-        val currentProviders = invokeComposableForResult(this) { ambientMapOf(values, parentScope) }
+        val currentProviders = invokeComposableForResult(this) {
+            compositionLocalMapOf(values, parentScope)
+        }
         endGroup()
-        val providers: AmbientMap
+        val providers: CompositionLocalMap
         val invalid: Boolean
         if (inserting) {
             providers = updateProviderMapGroup(parentScope, currentProviders)
@@ -1854,10 +1865,10 @@
             hasProvider = true
         } else {
             @Suppress("UNCHECKED_CAST")
-            val oldScope = reader.groupGet(0) as AmbientMap
+            val oldScope = reader.groupGet(0) as CompositionLocalMap
 
             @Suppress("UNCHECKED_CAST")
-            val oldValues = reader.groupGet(1) as AmbientMap
+            val oldValues = reader.groupGet(1) as CompositionLocalMap
 
             // skipping is true iff parentScope has not changed.
             if (!skipping || oldValues != currentProviders) {
@@ -1883,7 +1894,7 @@
         }
         providersInvalidStack.push(providersInvalid.asInt())
         providersInvalid = invalid
-        start(ambientMapKey, ambientMap, false, providers)
+        start(compositionLocalMapKey, compositionLocalMap, false, providers)
     }
 
     @InternalComposeApi
@@ -1894,7 +1905,8 @@
     }
 
     @InternalComposeApi
-    override fun <T> consume(key: Ambient<T>): T = resolveAmbient(key, currentAmbientScope())
+    override fun <T> consume(key: CompositionLocal<T>): T =
+        resolveCompositionLocal(key, currentCompositionLocalScope())
 
     /**
      * Create or use a memoized `CompositionReference` instance at this position in the slot table.
@@ -1921,13 +1933,20 @@
         return ref.ref
     }
 
-    private fun <T> resolveAmbient(key: Ambient<T>, scope: AmbientMap): T =
-        if (scope.contains(key)) scope.getValueOf(key) else parentReference.getAmbient(key)
+    private fun <T> resolveCompositionLocal(
+        key: CompositionLocal<T>,
+        scope: CompositionLocalMap
+    ): T = if (scope.contains(key)) {
+        scope.getValueOf(key)
+    } else {
+        parentReference.getCompositionLocal(key)
+    }
 
-    internal fun <T> parentAmbient(key: Ambient<T>): T = resolveAmbient(key, currentAmbientScope())
+    internal fun <T> parentCompositionLocal(key: CompositionLocal<T>): T =
+        resolveCompositionLocal(key, currentCompositionLocalScope())
 
-    private fun <T> parentAmbient(key: Ambient<T>, location: Int): T =
-        resolveAmbient(key, ambientScopeAt(location))
+    private fun <T> parentCompositionLocal(key: CompositionLocal<T>, location: Int): T =
+        resolveCompositionLocal(key, compositionLocalScopeAt(location))
 
     /**
      * The number of changes that have been scheduled to be applied during [applyChanges].
@@ -3089,19 +3108,20 @@
             parentReference.invalidate(composition)
         }
 
-        override fun <T> getAmbient(key: Ambient<T>): T {
+        override fun <T> getCompositionLocal(key: CompositionLocal<T>): T {
             val anchor = scope.anchor
             return if (anchor != null && anchor.valid) {
-                parentAmbient(key, anchor.toIndexFor(slotTable))
+                parentCompositionLocal(key, anchor.toIndexFor(slotTable))
             } else {
-                // The composition is composing and the ambient has not landed in the slot table
-                // yet. This is a synchronous read from a sub-composition so the current ambient
-                parentAmbient(key)
+                // The composition is composing and the CompositionLocal has not landed in the slot
+                // table yet. This is a synchronous read from a sub-composition so the current
+                // CompositionLocal.
+                parentCompositionLocal(key)
             }
         }
 
-        override fun getAmbientScope(): AmbientMap {
-            return ambientScopeAt(scope.anchor?.toIndexFor(slotTable) ?: 0)
+        override fun getCompositionLocalScope(): CompositionLocalMap {
+            return compositionLocalScopeAt(scope.anchor?.toIndexFor(slotTable) ?: 0)
         }
 
         override fun recordInspectionTable(table: MutableSet<CompositionData>) {
@@ -3561,11 +3581,11 @@
 internal val provider = OpaqueKey("provider")
 
 @PublishedApi
-internal const val ambientMapKey = 202
+internal const val compositionLocalMapKey = 202
 
 @PublishedApi
 @Suppress("HiddenTypeParameter")
-internal val ambientMap = OpaqueKey("ambientMap")
+internal val compositionLocalMap = OpaqueKey("compositionLocalMap")
 
 @PublishedApi
 internal const val providerValuesKey = 203
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt
new file mode 100644
index 0000000..6fb9ca9
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionLocal.kt
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.runtime
+
+@Deprecated(
+    message = "Ambient has been renamed to CompositionLocal. Instances of CompositionLocal should" +
+        " use the prefix `Local` in their naming to convey that values retrieved through a " +
+        "CompositionLocal are local to the composition.",
+    replaceWith = ReplaceWith(
+        "CompositionLocal<T>", "androidx.compose.runtime.CompositionLocal"
+    )
+)
+typealias Ambient<T> = CompositionLocal<T>
+
+@Deprecated(
+    message = "Ambient has been renamed to CompositionLocal. Instances of CompositionLocal should" +
+        " use the prefix `Local` in their naming to convey that values retrieved through a " +
+        "CompositionLocal are local to the composition.",
+    replaceWith = ReplaceWith(
+        "ProvidableCompositionLocal<T>",
+        "androidx.compose.runtime.ProvidableCompositionLocal"
+    )
+)
+typealias ProvidableAmbient<T> = ProvidableCompositionLocal<T>
+
+/**
+ * Compose passes data through the composition tree explicitly through means of parameters to
+ * composable functions. This is often times the simplest and best way to have data flow through
+ * the tree.
+ *
+ * Sometimes this model can be cumbersome or break down for data that is needed by lots of
+ * components, or when components need to pass data between one another but keep that implementation
+ * detail private. For these cases, [CompositionLocal]s can be used as an implicit way to have data
+ * flow through a composition.
+ *
+ * [CompositionLocal]s by their nature are hierarchical. They make sense when the value of the
+ * [CompositionLocal] needs to be scoped to a particular sub-hierarchy of the composition.
+ *
+ * One must create a [CompositionLocal] instance, which can be referenced by the consumers
+ * statically. [CompositionLocal] instances themselves hold no data, and can be thought of as a
+ * type-safe identifier for the data being passed down a tree. [CompositionLocal] factory functions
+ * take a single parameter: a factory to create a default value in cases where a [CompositionLocal]
+ * is used without a Provider. If this is a situation you would rather not handle, you can throw
+ * an error in this factory.
+ *
+ * @sample androidx.compose.runtime.samples.createCompositionLocal
+ *
+ * Somewhere up the tree, a [Providers] component can be used, which provides a value for the
+ * [CompositionLocal]. This would often be at the "root" of a tree, but could be anywhere, and can
+ * also be used in multiple places to override the provided value for a sub-tree.
+ *
+ * @sample androidx.compose.runtime.samples.compositionLocalProvider
+ *
+ * Intermediate components do not need to know about the [CompositionLocal] value, and can have zero
+ * dependencies on it. For example, `SomeScreen` might look like this:
+ *
+ * @sample androidx.compose.runtime.samples.someScreenSample
+ *
+ * Finally, a component that wishes to consume the [CompositionLocal] value can use the [current]
+ * property of the [CompositionLocal] key which returns the current value of the
+ * [CompositionLocal], and subscribes the component to changes of it.
+ *
+ * @sample androidx.compose.runtime.samples.consumeCompositionLocal
+ */
+@Stable
+sealed class CompositionLocal<T> constructor(defaultFactory: (() -> T)? = null) {
+    @Suppress("UNCHECKED_CAST")
+    internal val defaultValueHolder = LazyValueHolder(defaultFactory)
+
+    @Composable
+    internal abstract fun provided(value: T): State<T>
+
+    /**
+     * Return the value provided by the nearest [Providers] component that invokes, directly or
+     * indirectly, the composable function that uses this property.
+     *
+     * @sample androidx.compose.runtime.samples.consumeCompositionLocal
+     */
+    @OptIn(InternalComposeApi::class)
+    inline val current: T
+        @ReadOnlyComposable
+        @Composable
+        get() = currentComposer.consume(this)
+}
+
+/**
+ * A [ProvidableCompositionLocal] can be used in [Providers] to provide values.
+ *
+ * @see compositionLocalOf
+ * @see staticCompositionLocalOf
+ * @see CompositionLocal
+ * @see Providers
+ */
+@Stable
+abstract class ProvidableCompositionLocal<T> internal constructor(defaultFactory: (() -> T)?) :
+    CompositionLocal<T> (defaultFactory) {
+
+    /**
+     * Associates a [CompositionLocal] key to a value in a call to [Providers].
+     *
+     * @see CompositionLocal
+     * @see ProvidableCompositionLocal
+     */
+    @Suppress("UNCHECKED_CAST")
+    infix fun provides(value: T) = ProvidedValue(this, value, true)
+
+    /**
+     * Associates a [CompositionLocal] key to a value in a call to [Providers] if the key does not
+     * already have an associated value.
+     *
+     * @see CompositionLocal
+     * @see ProvidableCompositionLocal
+     */
+    @Suppress("UNCHECKED_CAST")
+    infix fun providesDefault(value: T) = ProvidedValue(this, value, false)
+}
+
+/**
+ * A [DynamicProvidableCompositionLocal] is a [CompositionLocal] backed by [mutableStateOf].
+ * Providing new values using a [DynamicProvidableCompositionLocal] will provide the same [State]
+ * with a different value. Reading the [CompositionLocal] value of a
+ * [DynamicProvidableCompositionLocal] will record a read in the [RecomposeScope] of the
+ * composition. Changing the provided value will invalidate the [RecomposeScope]s.
+ *
+ * @see compositionLocalOf
+ */
+internal class DynamicProvidableCompositionLocal<T> constructor(
+    private val policy: SnapshotMutationPolicy<T>,
+    defaultFactory: (() -> T)?
+) : ProvidableCompositionLocal<T>(defaultFactory) {
+
+    @Composable
+    override fun provided(value: T): State<T> = remember { mutableStateOf(value, policy) }.apply {
+        this.value = value
+    }
+}
+
+/**
+ * A [StaticProvidableCompositionLocal] is a value that is expected to rarely change.
+ *
+ * @see staticCompositionLocalOf
+ */
+internal class StaticProvidableCompositionLocal<T>(defaultFactory: (() -> T)?) :
+    ProvidableCompositionLocal<T>(defaultFactory) {
+
+    @Composable
+    override fun provided(value: T): State<T> = StaticValueHolder(value)
+}
+
+/**
+ * Create a [CompositionLocal] key that can be provided using [Providers]. Changing the value
+ * provided during recomposition will invalidate the children of [Providers] that read the value
+ * using [CompositionLocal.current].
+ *
+ * @param policy a policy to determine when a [CompositionLocal] is considered changed. See
+ * [SnapshotMutationPolicy] for details.
+ *
+ * @see CompositionLocal
+ * @see staticCompositionLocalOf
+ * @see mutableStateOf
+ */
+fun <T> compositionLocalOf(
+    policy: SnapshotMutationPolicy<T> =
+        @OptIn(ExperimentalComposeApi::class)
+        structuralEqualityPolicy(),
+    defaultFactory: (() -> T)? = null
+): ProvidableCompositionLocal<T> = DynamicProvidableCompositionLocal(policy, defaultFactory)
+
+/**
+ * Create a [CompositionLocal] key that can be provided using [Providers]. Changing the value
+ * provided will cause the entire tree below [Providers] to be recomposed, disabling skipping of
+ * composable calls.
+ *
+ * A static [CompositionLocal] should be only be used when the value provided is highly unlikely to
+ * change.
+ *
+ * @see CompositionLocal
+ * @see compositionLocalOf
+ */
+fun <T> staticCompositionLocalOf(defaultFactory: (() -> T)? = null): ProvidableCompositionLocal<T> =
+    StaticProvidableCompositionLocal(defaultFactory)
+
+/**
+ * Create an ambient key that can be provided using [Providers]. Changing the value provided
+ * during recomposition will invalidate the children of [Providers] that read the value using
+ * [CompositionLocal.current].
+ *
+ * @param policy a policy to determine when an ambient is considered changed. See
+ * [SnapshotMutationPolicy] for details.
+ *
+ * @see CompositionLocal
+ * @see staticAmbientOf
+ * @see mutableStateOf
+ */
+@Deprecated(
+    message = "Ambient has been renamed to CompositionLocal. Instances of CompositionLocal should" +
+        " use the prefix `Local` in their naming to convey that values retrieved through a " +
+        "CompositionLocal are local to the composition.",
+    replaceWith = ReplaceWith(
+        "compositionLocalOf(policy, defaultFactory)",
+        "androidx.compose.runtime.compositionLocalOf"
+    )
+)
+fun <T> ambientOf(
+    policy: SnapshotMutationPolicy<T> =
+        @OptIn(ExperimentalComposeApi::class)
+        structuralEqualityPolicy(),
+    defaultFactory: (() -> T)? = null
+): ProvidableCompositionLocal<T> = DynamicProvidableCompositionLocal(policy, defaultFactory)
+
+/**
+ * Create an ambient key that can be provided using [Providers]. Changing the value provided
+ * will cause the entire tree below [Providers] to be recomposed, disabling skipping of composable
+ * calls.
+ *
+ * A static ambient should be only be used when the value provided is highly unlikely to change.
+ *
+ * @see CompositionLocal
+ * @see ambientOf
+ */
+@Deprecated(
+    message = "Ambient has been renamed to CompositionLocal. Instances of CompositionLocal should" +
+        " use the prefix `Local` in their naming to convey that values retrieved through a " +
+        "CompositionLocal are local to the composition.",
+    replaceWith = ReplaceWith(
+        "staticCompositionLocalOf(defaultFactory)",
+        "androidx.compose.runtime.staticCompositionLocalOf"
+    )
+)
+fun <T> staticAmbientOf(defaultFactory: (() -> T)? = null): ProvidableCompositionLocal<T> =
+    StaticProvidableCompositionLocal(defaultFactory)
+
+/**
+ * [Providers] binds values to [ProvidableCompositionLocal] keys. Reading the [CompositionLocal]
+ * using [CompositionLocal.current] will return the value provided in [Providers]'s [values]
+ * parameter for all composable functions called directly or indirectly in the [content] lambda.
+ *
+ * @sample androidx.compose.runtime.samples.compositionLocalProvider
+ *
+ * @see CompositionLocal
+ * @see compositionLocalOf
+ * @see staticCompositionLocalOf
+ */
+@Composable
+@OptIn(InternalComposeApi::class)
+fun Providers(vararg values: ProvidedValue<*>, content: @Composable () -> Unit) {
+    currentComposer.startProviders(values)
+    content()
+    currentComposer.endProviders()
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionReference.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionReference.kt
index 43c1cc8..93f0b61 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionReference.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionReference.kt
@@ -19,12 +19,13 @@
 import kotlinx.collections.immutable.persistentHashMapOf
 import kotlin.coroutines.CoroutineContext
 
-private val EmptyAmbientMap: AmbientMap = persistentHashMapOf()
+private val EmptyCompositionLocalMap: CompositionLocalMap = persistentHashMapOf()
 
 /**
  * An Effect to construct a CompositionReference at the current point of composition. This can be used
- * to run a separate composition in the context of the current one, preserving ambients and propagating
- * invalidations. When this call leaves the composition, the reference is invalidated.
+ * to run a separate composition in the context of the current one, preserving [CompositionLocal]s
+ * and propagating invalidations. When this call leaves the composition, the reference is
+ * invalidated.
  */
 @OptIn(InternalComposeApi::class)
 @Composable fun rememberCompositionReference(): CompositionReference {
@@ -35,8 +36,8 @@
  * A [CompositionReference] is an opaque type that is used to logically "link" two compositions
  * together. The [CompositionReference] instance represents a reference to the "parent" composition
  * in a specific position of that composition's tree, and the instance can then be given to a new
- * "child" composition. This reference ensures that invalidations and ambients flow logically
- * through the two compositions as if they were not separate.
+ * "child" composition. This reference ensures that invalidations and [CompositionLocal]s flow
+ * logically through the two compositions as if they were not separate.
  *
  * The "parent" of a root composition is a [Recomposer].
  *
@@ -60,8 +61,9 @@
     internal abstract fun registerComposition(composition: ControlledComposition)
     internal abstract fun unregisterComposition(composition: ControlledComposition)
 
-    internal open fun <T> getAmbient(key: Ambient<T>): T = key.defaultValueHolder.value
-    internal open fun getAmbientScope(): AmbientMap = EmptyAmbientMap
+    internal open fun <T> getCompositionLocal(key: CompositionLocal<T>): T =
+        key.defaultValueHolder.value
+    internal open fun getCompositionLocalScope(): CompositionLocalMap = EmptyCompositionLocalMap
     internal open fun startComposing() {}
     internal open fun doneComposing() {}
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Expect.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Expect.kt
index 2fa9cba..e363360 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Expect.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Expect.kt
@@ -41,14 +41,6 @@
 }
 
 @MustBeDocumented
-@Retention(AnnotationRetention.BINARY)
-@Target(
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.CONSTRUCTOR
-)
-expect annotation class MainThread()
-
-@MustBeDocumented
 @Retention(AnnotationRetention.SOURCE)
 @Target(
     AnnotationTarget.FUNCTION,
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
index f81a4a3..da35fbe 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
@@ -188,7 +188,7 @@
  * A policy to control how the result of [mutableStateOf] report and merge changes to
  * the state object.
  *
- * A mutation policy can be passed as an parameter to [mutableStateOf], and [ambientOf].
+ * A mutation policy can be passed as an parameter to [mutableStateOf], and [compositionLocalOf].
  *
  * Typically, one of the stock policies should be used such as [referentialEqualityPolicy],
  * [structuralEqualityPolicy], or [neverEqualPolicy]. However, a custom mutation policy can be
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 d4d91bb..e7b3a19 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
@@ -19,8 +19,6 @@
 import androidx.compose.runtime.snapshots.MutableSnapshot
 import androidx.compose.runtime.snapshots.Snapshot
 import androidx.compose.runtime.snapshots.SnapshotApplyResult
-import androidx.compose.runtime.snapshots.SnapshotReadObserver
-import androidx.compose.runtime.snapshots.SnapshotWriteObserver
 import androidx.compose.runtime.snapshots.fastForEach
 import kotlinx.collections.immutable.persistentSetOf
 import kotlinx.coroutines.CancellableContinuation
@@ -443,7 +441,7 @@
                     }
                 }
             } finally {
-                unregisterApplyObserver()
+                unregisterApplyObserver.dispose()
                 synchronized(stateLock) {
                     if (runnerJob === callingJob) {
                         runnerJob = null
@@ -529,11 +527,11 @@
         ) composition else null
     }
 
-    private fun readObserverOf(composition: ControlledComposition): SnapshotReadObserver {
+    private fun readObserverOf(composition: ControlledComposition): (Any) -> Unit {
         return { value -> composition.recordReadOf(value) }
     }
 
-    private fun writeObserverOf(composition: ControlledComposition): SnapshotWriteObserver {
+    private fun writeObserverOf(composition: ControlledComposition): (Any) -> Unit {
         return { value -> composition.recordWriteOf(value) }
     }
 
@@ -603,7 +601,7 @@
 
     internal override fun recordInspectionTable(table: MutableSet<CompositionData>) {
         // TODO: The root recomposer might be a better place to set up inspection
-        // than the current configuration with an ambient
+        // than the current configuration with an CompositionLocal
     }
 
     internal override fun registerComposition(composition: ControlledComposition) {
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 12d71fb..d27445e 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
@@ -33,9 +33,9 @@
 //                and data anchors in the group fields which are also anchors but not Anchor
 //                instances.
 // Aux          - auxiliary data that can be associated with a node and set independent of groups
-//                slots. This is used, for example, by the composer to record ambient maps as the
-//                map is not known at the when the group starts, only when the map is calculated
-//                after using an arbitrary number of slots.
+//                slots. This is used, for example, by the composer to record CompositionLocal
+//                maps as the map is not known at the when the group starts, only when the map is
+//                calculated after using an arbitrary number of slots.
 // Data         - the portion of the slot array associated with the group that contains the slots as
 //                well as the ObjectKey, Node, and Aux if present. The slots for a group are after
 //                the optional fixed group data.
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SuspendingEffects.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SuspendingEffects.kt
index ff15ec9..4f4ba72 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SuspendingEffects.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SuspendingEffects.kt
@@ -87,7 +87,7 @@
  */
 @Composable
 inline fun rememberCoroutineScope(
-    getContext: () -> CoroutineContext = { EmptyCoroutineContext }
+    getContext: @DisallowComposableCalls () -> CoroutineContext = { EmptyCoroutineContext }
 ): CoroutineScope {
     val composer = currentComposer
     val wrapper = remember {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
index e10f3e4..9ce1fc6 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
@@ -60,7 +60,7 @@
     ReplaceWith("Snapshot.takeSnapshot(readObserver)")
 )
 fun takeSnapshot(
-    readObserver: SnapshotReadObserver? = null
+    readObserver: ((Any) -> Unit)? = null
 ): Snapshot = currentSnapshot().takeNestedSnapshot(readObserver)
 
 /**
@@ -123,7 +123,7 @@
  * Composition uses [writeObserver] to track when a state object is modified during composition
  * in order to invalidate the reads that have not yet occurred. This allows a single pass of
  * composition for state objects that are written to before they are read (such as modifying the
- * value of a dynamic ambient provider).
+ * value of a dynamic CompositionLocal provider).
  *
  * @see takeSnapshot
  * @see Snapshot
@@ -134,8 +134,8 @@
     ReplaceWith("Snapshot.takeMutableSnapshot(readObserver, writeObserver)")
 )
 fun takeMutableSnapshot(
-    readObserver: SnapshotReadObserver? = null,
-    writeObserver: SnapshotWriteObserver? = null
+    readObserver: ((Any) -> Unit)? = null,
+    writeObserver: ((Any) -> Unit)? = null
 ): MutableSnapshot =
     (currentSnapshot() as? MutableSnapshot)?.takeNestedMutableSnapshot(readObserver, writeObserver)
         ?: error("Cannot create a mutable snapshot of an read-only snapshot")
@@ -160,7 +160,11 @@
  */
 sealed class Snapshot(
     id: Int,
-    invalid: SnapshotIdSet
+
+    /**
+     * A set of all the snapshots that should be treated as invalid.
+     */
+    internal open var invalid: SnapshotIdSet
 ) {
     /**
      * The snapshot id of the snapshot. This is a unique number from a monotonically increasing
@@ -178,7 +182,13 @@
     /**
      * True if any change to a state object in this snapshot will throw.
      */
-    abstract val readonly: Boolean
+    abstract val readOnly: Boolean
+
+    /**
+     * True if any change to a state object in this snapshot will throw.
+     */
+    @Deprecated("Use readOnly instead", ReplaceWith("readOnly"))
+    val readonly: Boolean get() = readOnly
 
     /**
      * Dispose the snapshot. Neglecting to dispose a snapshot will result in difficult to
@@ -195,7 +205,7 @@
      * with this snapshot can be collected. Nested snapshots are still valid after the parent has
      * been disposed.
      */
-    abstract fun takeNestedSnapshot(readObserver: SnapshotReadObserver? = null): Snapshot
+    abstract fun takeNestedSnapshot(readObserver: ((Any) -> Unit)? = null): Snapshot
 
     /**
      * Whether there are any pending changes in this snapshot. These changes are not visible
@@ -210,7 +220,7 @@
      * is restored if there was one.
      *
      * All changes to state object inside [block] are isolated to this snapshot and are not
-     * visible to other snapshot or as global state. If this is a [readonly] snapshot, any
+     * visible to other snapshot or as global state. If this is a [readOnly] snapshot, any
      * changes to state objects will throw an [IllegalStateException].
      *
      * For a [MutableSnapshot], changes made to a snapshot inside [block] can be applied
@@ -247,18 +257,12 @@
     /*
      * The read observer for the snapshot if there is one.
      */
-    internal abstract val readObserver: SnapshotReadObserver?
+    internal abstract val readObserver: ((Any) -> Unit)?
 
     /**
      * The write observer for the snapshot if there is one.
      */
-    internal abstract val writeObserver: SnapshotWriteObserver?
-
-    /**
-     * A set of all the snapshots that should be treated as invalid.
-     */
-    internal open var invalid: SnapshotIdSet = invalid
-        internal set
+    internal abstract val writeObserver: ((Any) -> Unit)?
 
     /**
      * Called when a nested snapshot of this snapshot is activated
@@ -345,7 +349,7 @@
          * @see SnapshotApplyObserver
          */
         fun takeSnapshot(
-            readObserver: SnapshotReadObserver? = null
+            readObserver: ((Any) -> Unit)? = null
         ): Snapshot = currentSnapshot().takeNestedSnapshot(readObserver)
 
         /**
@@ -418,8 +422,8 @@
          * @see MutableSnapshot
          */
         fun takeMutableSnapshot(
-            readObserver: SnapshotReadObserver? = null,
-            writeObserver: SnapshotWriteObserver? = null
+            readObserver: ((Any) -> Unit)? = null,
+            writeObserver: ((Any) -> Unit)? = null
         ): MutableSnapshot =
             (currentSnapshot() as? MutableSnapshot)?.takeNestedMutableSnapshot(
                 readObserver,
@@ -475,8 +479,8 @@
          * called several times for the same object if nested mutable snapshots are created.
          */
         fun <T> observe(
-            readObserver: SnapshotReadObserver? = null,
-            writeObserver: SnapshotWriteObserver? = null,
+            readObserver: ((Any) -> Unit)? = null,
+            writeObserver: ((Any) -> Unit)? = null,
             block: () -> T
         ): T {
             if (readObserver != null || writeObserver != null) {
@@ -502,16 +506,16 @@
          * Register an apply listener that is called back when snapshots are applied to the
          * global state.
          *
-         * @return a lambda that, when called, unregisters [observer].
+         * @return [ObserverHandle] to unregister [observer].
          */
-        fun registerApplyObserver(observer: SnapshotApplyObserver): () -> Unit {
+        fun registerApplyObserver(observer: (Set<Any>, Snapshot) -> Unit): ObserverHandle {
             // Ensure observer does not see changes before this call.
             advanceGlobalSnapshot(emptyLambda)
 
             sync {
                 applyObservers.add(observer)
             }
-            return {
+            return ObserverHandle {
                 sync {
                     applyObservers.remove(observer)
                 }
@@ -532,14 +536,14 @@
          * This should only be used to determine if a call to [sendApplyNotifications] should be
          * scheduled to be called.
          *
-         * @return a lambda that, when called, unregisters [observer].
+         * @return [ObserverHandle] to unregister [observer].
          */
-        fun registerGlobalWriteObserver(observer: SnapshotWriteObserver): () -> Unit {
+        fun registerGlobalWriteObserver(observer: ((Any) -> Unit)): ObserverHandle {
             sync {
                 globalWriteObservers.add(observer)
             }
             advanceGlobalSnapshot()
-            return {
+            return ObserverHandle {
                 sync {
                     globalWriteObservers.remove(observer)
                 }
@@ -622,8 +626,8 @@
 open class MutableSnapshot internal constructor(
     id: Int,
     invalid: SnapshotIdSet,
-    override val readObserver: SnapshotReadObserver?,
-    override val writeObserver: SnapshotWriteObserver?
+    override val readObserver: ((Any) -> Unit)?,
+    override val writeObserver: ((Any) -> Unit)?
 ) : Snapshot(id, invalid) {
     /**
      * Whether there are any pending changes in this snapshot. These changes are not visible
@@ -645,8 +649,8 @@
      * has been disposed but calling [apply] will fail.
      */
     open fun takeNestedMutableSnapshot(
-        readObserver: SnapshotReadObserver? = null,
-        writeObserver: SnapshotWriteObserver? = null
+        readObserver: ((Any) -> Unit)? = null,
+        writeObserver: ((Any) -> Unit)? = null
     ): MutableSnapshot {
         validateNotDisposed()
         validateNotApplied()
@@ -709,7 +713,7 @@
                 if (globalModified != null && globalModified.isNotEmpty())
                     applyObservers.toList() to globalModified
                 else
-                    emptyList<SnapshotApplyObserver>() to null
+                    emptyList<(Set<Any>, Snapshot) -> Unit>() to null
             } else {
                 val previousGlobalSnapshot = currentGlobalSnapshot
                 val result = innerApply(
@@ -751,7 +755,7 @@
         return SnapshotApplyResult.Success
     }
 
-    override val readonly: Boolean get() = false
+    override val readOnly: Boolean get() = false
 
     override val root: Snapshot get() = this
 
@@ -762,7 +766,7 @@
         }
     }
 
-    override fun takeNestedSnapshot(readObserver: SnapshotReadObserver?): Snapshot {
+    override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot {
         validateNotDisposed()
         validateNotApplied()
         return advance {
@@ -810,7 +814,7 @@
     /**
      * Abandon the snapshot.
      */
-    internal fun abandon() {
+    private fun abandon() {
         val modified = modified
         if (modified != null) {
             validateNotApplied()
@@ -930,11 +934,11 @@
                 id = nextSnapshotId++
                 openSnapshots = openSnapshots.set(id)
             }
-            var currentInvald = invalid
+            var currentInvalid = invalid
             for (invalidId in previousId + 1 until id) {
-                currentInvald = currentInvald.set(invalidId)
+                currentInvalid = currentInvalid.set(invalidId)
             }
-            invalid = currentInvald
+            invalid = currentInvalid
         }
     }
 
@@ -965,7 +969,7 @@
     internal var previousIds: SnapshotIdSet = SnapshotIdSet.EMPTY
 
     /**
-     * The number of pending nested snapshots of this snapshot. To simplifythe code, this
+     * The number of pending nested snapshots of this snapshot. To simplify the code, this
      * snapshot it, itself, counted as its own nested snapshot.
      */
     private var snapshots = 1
@@ -1024,6 +1028,10 @@
  * @see takeSnapshot
  * @see takeMutableSnapshot
  */
+@Deprecated(
+    "Use normal lambda syntax instead.",
+    ReplaceWith("((Any) -> Unit)")
+)
 typealias SnapshotReadObserver = (state: Any) -> Unit
 
 /**
@@ -1031,6 +1039,10 @@
  *
  * @see Snapshot.registerGlobalWriteObserver
  */
+@Deprecated(
+    "Use normal lambda syntax instead.",
+    ReplaceWith("((Any) -> Unit)")
+)
 typealias SnapshotWriteObserver = (state: Any) -> Unit
 
 /**
@@ -1048,9 +1060,25 @@
  * @see Snapshot.registerApplyObserver
  * @see Snapshot.sendApplyNotifications
  */
+@Deprecated(
+    "Use normal lambda syntax instead.",
+    ReplaceWith("((Set<Any>, Snapshot) -> Unit)")
+)
 typealias SnapshotApplyObserver = (changed: Set<Any>, snapshot: Snapshot) -> Unit
 
 /**
+ * The type returned by observer registration methods that unregisters the observer when it is
+ * disposed.
+ */
+@Suppress("CallbackName")
+fun interface ObserverHandle {
+    /**
+     * Dispose the observer causing it to be unregistered from the snapshot system.
+     */
+    fun dispose()
+}
+
+/**
  * Return the thread's active snapshot. If no thread snapshot is active then the current global
  * snapshot is used.
  */
@@ -1153,24 +1181,24 @@
 internal class ReadonlySnapshot internal constructor(
     id: Int,
     invalid: SnapshotIdSet,
-    override val readObserver: SnapshotReadObserver?
+    override val readObserver: ((Any) -> Unit)?
 ) : Snapshot(id, invalid) {
     /**
      * The number of nested snapshots that are active. To simplify the code, this snapshot counts
      * itself as a nested snapshot.
      */
     private var snapshots = 1
-    override val readonly: Boolean get() = true
+    override val readOnly: Boolean get() = true
     override val root: Snapshot get() = this
     override fun hasPendingChanges(): Boolean = false
-    override val writeObserver: SnapshotWriteObserver? get() = null
+    override val writeObserver: ((Any) -> Unit)? get() = null
 
     override var modified: HashSet<StateObject>?
         get() = null
         @Suppress("UNUSED_PARAMETER")
         set(value) = unsupported()
 
-    override fun takeNestedSnapshot(readObserver: SnapshotReadObserver?): Snapshot {
+    override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot {
         validateOpen(this)
         return NestedReadonlySnapshot(id, invalid, readObserver, this)
     }
@@ -1203,20 +1231,20 @@
 internal class NestedReadonlySnapshot(
     id: Int,
     invalid: SnapshotIdSet,
-    readObserver: SnapshotReadObserver?,
+    readObserver: ((Any) -> Unit)?,
     val parent: Snapshot
 ) : Snapshot(id, invalid) {
     init { parent.nestedActivated(this) }
-    override val readonly get() = true
+    override val readOnly get() = true
     override val root: Snapshot get() = parent.root
     @OptIn(ExperimentalComposeApi::class)
-    override fun takeNestedSnapshot(readObserver: SnapshotReadObserver?) =
+    override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?) =
         parent.takeNestedSnapshot(readObserver)
     override fun notifyObjectsInitialized() {
         // Nothing to do for read-only snapshots
     }
     override fun hasPendingChanges(): Boolean = false
-    override val readObserver: SnapshotReadObserver? =
+    override val readObserver: ((Any) -> Unit)? =
         // Merge the read observers if necessary
         readObserver?.let {
             parent.readObserver?.let {
@@ -1238,7 +1266,7 @@
     }
 
     override val modified: HashSet<StateObject>? get() = null
-    override val writeObserver: SnapshotWriteObserver? get() = null
+    override val writeObserver: ((Any) -> Unit)? get() = null
     @OptIn(ExperimentalComposeApi::class)
     override fun recordModified(state: StateObject) = parent.recordModified(state)
 
@@ -1271,7 +1299,7 @@
         }
     ) {
 
-    override fun takeNestedSnapshot(readObserver: SnapshotReadObserver?): Snapshot =
+    override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot =
         takeNewSnapshot { invalid ->
             ReadonlySnapshot(
                 id = sync { nextSnapshotId++ },
@@ -1281,8 +1309,8 @@
         }
 
     override fun takeNestedMutableSnapshot(
-        readObserver: SnapshotReadObserver?,
-        writeObserver: SnapshotWriteObserver?
+        readObserver: ((Any) -> Unit)?,
+        writeObserver: ((Any) -> Unit)?
     ): MutableSnapshot = takeNewSnapshot { invalid ->
         MutableSnapshot(
             id = sync { nextSnapshotId++ },
@@ -1321,8 +1349,8 @@
 internal class NestedMutableSnapshot(
     id: Int,
     invalid: SnapshotIdSet,
-    readObserver: SnapshotReadObserver?,
-    writeObserver: SnapshotWriteObserver?,
+    readObserver: ((Any) -> Unit)?,
+    writeObserver: ((Any) -> Unit)?,
     val parent: MutableSnapshot
 ) : MutableSnapshot(id, invalid, readObserver, writeObserver) {
 
@@ -1391,8 +1419,8 @@
  */
 internal class TransparentObserverMutableSnapshot(
     private val previousSnapshot: MutableSnapshot?,
-    internal val specifiedReadObserver: SnapshotReadObserver?,
-    internal val specifiedWriteObserver: SnapshotWriteObserver?
+    internal val specifiedReadObserver: ((Any) -> Unit)?,
+    internal val specifiedWriteObserver: ((Any) -> Unit)?
 ) : MutableSnapshot(
     INVALID_SNAPSHOT,
     SnapshotIdSet.EMPTY,
@@ -1430,8 +1458,8 @@
         @Suppress("UNUSED_PARAMETER")
         set(value) = unsupported()
 
-    override val readonly: Boolean
-        get() = currentSnapshot.readonly
+    override val readOnly: Boolean
+        get() = currentSnapshot.readOnly
 
     override fun apply(): SnapshotApplyResult =
         currentSnapshot.apply()
@@ -1440,12 +1468,12 @@
     override fun recordModified(state: StateObject) =
         currentSnapshot.recordModified(state)
 
-    override fun takeNestedSnapshot(readObserver: SnapshotReadObserver?): Snapshot =
+    override fun takeNestedSnapshot(readObserver: ((Any) -> Unit)?): Snapshot =
         currentSnapshot.takeNestedSnapshot(mergedReadObserver(readObserver, this.readObserver))
 
     override fun takeNestedMutableSnapshot(
-        readObserver: SnapshotReadObserver?,
-        writeObserver: SnapshotWriteObserver?
+        readObserver: ((Any) -> Unit)?,
+        writeObserver: ((Any) -> Unit)?
     ): MutableSnapshot = currentSnapshot.takeNestedMutableSnapshot(
         mergedReadObserver(readObserver, this.readObserver),
         mergedWriteObserver(writeObserver, this.writeObserver)
@@ -1461,9 +1489,9 @@
 }
 
 private fun mergedReadObserver(
-    readObserver: SnapshotReadObserver?,
-    parentObserver: SnapshotReadObserver?
-): SnapshotReadObserver? =
+    readObserver: ((Any) -> Unit)?,
+    parentObserver: ((Any) -> Unit)?
+): ((Any) -> Unit)? =
     if (readObserver != null && parentObserver != null && readObserver != parentObserver) {
         { state: Any ->
             readObserver(state)
@@ -1472,9 +1500,9 @@
     } else readObserver ?: parentObserver
 
 private fun mergedWriteObserver(
-    writeObserver: SnapshotWriteObserver?,
-    parentObserver: SnapshotWriteObserver?
-): SnapshotWriteObserver? =
+    writeObserver: ((Any) -> Unit)?,
+    parentObserver: ((Any) -> Unit)?
+): ((Any) -> Unit)? =
     if (writeObserver != null && parentObserver != null && writeObserver != parentObserver) {
         { state: Any ->
             writeObserver(state)
@@ -1494,13 +1522,6 @@
  */
 private const val INVALID_SNAPSHOT = 0
 
-private fun validateNotInSnapshot() {
-    threadSnapshot.get().let {
-        if (it != null && it !is TransparentObserverMutableSnapshot)
-            error("In an existing snapshot")
-    }
-}
-
 private val threadSnapshot = ThreadLocal<Snapshot>()
 
 // A global synchronization object. This synchronization object should be taken before modifying any
@@ -1520,10 +1541,10 @@
 private var nextSnapshotId = INVALID_SNAPSHOT + 1
 
 // A list of apply observers
-private val applyObservers = mutableListOf<SnapshotApplyObserver>()
+private val applyObservers = mutableListOf<(Set<Any>, Snapshot) -> Unit>()
 
 // A list of observers of writes to the global state.
-private val globalWriteObservers = mutableListOf<SnapshotWriteObserver>()
+private val globalWriteObservers = mutableListOf<((Any) -> Unit)>()
 
 private var currentGlobalSnapshot = GlobalSnapshot(
     id = nextSnapshotId++,
@@ -1702,12 +1723,12 @@
 
 @PublishedApi
 internal fun <T : StateRecord> T.writableRecord(state: StateObject, snapshot: Snapshot): T {
-    if (snapshot.readonly) {
+    if (snapshot.readOnly) {
         // If the snapshot is read-only, use the snapshot recordModified to report it.
         snapshot.recordModified(state)
     }
     val id = snapshot.id
-    val readData = readable<T>(this, id, snapshot.invalid) ?: readError()
+    val readData = readable(this, id, snapshot.invalid) ?: readError()
 
     // If the readable data was born in this snapshot, it is writable.
     if (readData.snapshotId == snapshot.id) return readData
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotFlow.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotFlow.kt
index 5f854b8f..7cce4a6 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotFlow.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotFlow.kt
@@ -115,7 +115,7 @@
             }
         }
     } finally {
-        unregisterApplyObserver()
+        unregisterApplyObserver.dispose()
     }
 }
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
index 132b707..28eea98 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
@@ -25,7 +25,7 @@
 
 /**
  * An implementation of [MutableList] that can be observed and snapshot. This is the result type
- * created by [androidx.compose.mutableStateListOf].
+ * created by [androidx.compose.runtime.mutableStateListOf].
  *
  * This class closely implements the same semantics as [ArrayList].
  *
@@ -33,7 +33,7 @@
  */
 @Stable
 class SnapshotStateList<T> : MutableList<T>, StateObject {
-    override var firstStateRecord: StateListStateRecord<T> =
+    override var firstStateRecord: StateRecord =
         StateListStateRecord<T>(persistentListOf())
         private set
 
@@ -47,12 +47,12 @@
 
     @Suppress("UNCHECKED_CAST")
     internal val readable: StateListStateRecord<T> get() =
-        firstStateRecord.readable(this)
+        (firstStateRecord as StateListStateRecord<T>).readable(this)
 
     /**
      * This is an internal implementation class of [SnapshotStateList]. Do not use.
      */
-    class StateListStateRecord<T> internal constructor(
+    internal class StateListStateRecord<T> internal constructor(
         internal var list: PersistentList<T>
     ) : StateRecord() {
         internal var modification = 0
@@ -102,11 +102,11 @@
 
     private inline fun <R> writable(block: StateListStateRecord<T>.() -> R): R =
         @Suppress("UNCHECKED_CAST")
-        firstStateRecord.writable(this, block)
+        (firstStateRecord as StateListStateRecord<T>).writable(this, block)
 
     private inline fun <R> withCurrent(block: StateListStateRecord<T>.() -> R): R =
         @Suppress("UNCHECKED_CAST")
-        firstStateRecord.withCurrent(block)
+        (firstStateRecord as StateListStateRecord<T>).withCurrent(block)
 
     private inline fun <R> mutate(block: (MutableList<T>) -> R): R =
         withCurrent {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
index 9bc955b..67d1791 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
@@ -25,7 +25,7 @@
 
 /**
  * An implementation of [MutableMap] that can be observed and snapshot. This is the result type
- * created by [androidx.compose.mutableStateMapOf].
+ * created by [androidx.compose.runtime.mutableStateMapOf].
  *
  * This class closely implements the same semantics as [HashMap].
  *
@@ -33,7 +33,7 @@
  */
 @Stable
 class SnapshotStateMap<K, V> : MutableMap<K, V>, StateObject {
-    override var firstStateRecord: StateMapStateRecord<K, V> =
+    override var firstStateRecord: StateRecord =
         StateMapStateRecord<K, V>(persistentHashMapOf())
         private set
 
@@ -63,7 +63,7 @@
 
     @Suppress("UNCHECKED_CAST")
     internal val readable: StateMapStateRecord<K, V>
-        get() = firstStateRecord.readable(this)
+        get() = (firstStateRecord as StateMapStateRecord<K, V>).readable(this)
 
     internal inline fun removeIf(predicate: (MutableMap.MutableEntry<K, V>) -> Boolean): Boolean {
         var removed = false
@@ -95,11 +95,11 @@
     private inline fun <R> withCurrent(block: StateMapStateRecord<K, V>.() -> R): R =
         @Suppress("UNCHECKED_CAST")
         @OptIn(ExperimentalComposeApi::class)
-        firstStateRecord.withCurrent(block)
+        (firstStateRecord as StateMapStateRecord<K, V>).withCurrent(block)
 
     private inline fun <R> writable(block: StateMapStateRecord<K, V>.() -> R): R =
         @Suppress("UNCHECKED_CAST")
-        firstStateRecord.writable(this, block)
+        (firstStateRecord as StateMapStateRecord<K, V>).writable(this, block)
 
     private inline fun <R> mutate(block: (MutableMap<K, V>) -> R): R =
         withCurrent {
@@ -124,7 +124,7 @@
     /**
      * Implementation class of [SnapshotStateMap]. Do not use.
      */
-    class StateMapStateRecord<K, V> internal constructor(
+    internal class StateMapStateRecord<K, V> internal constructor(
         internal var map: PersistentMap<K, V>
     ) : StateRecord() {
         internal var modification = 0
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
index 2c4a5ae..377b6a0 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateObserver.kt
@@ -24,7 +24,7 @@
 
 @ExperimentalComposeApi
 class SnapshotStateObserver(private val onChangedExecutor: (callback: () -> Unit) -> Unit) {
-    private val applyObserver: SnapshotApplyObserver = { applied, _ ->
+    private val applyObserver: (Set<Any>, Snapshot) -> Unit = { applied, _ ->
         var hasValues = false
 
         synchronized(applyMaps) {
@@ -50,9 +50,9 @@
     }
 
     /**
-     * The [SnapshotReadObserver] used by this [SnapshotStateObserver] during [observeReads].
+     * The observer used by this [SnapshotStateObserver] during [observeReads].
      */
-    private val readObserver: SnapshotReadObserver = { state ->
+    private val readObserver: (Any) -> Unit = { state ->
         if (!isPaused) {
             currentMap!!.addValue(state)
         }
@@ -67,7 +67,7 @@
     /**
      * Method to call when unsubscribing from the apply observer.
      */
-    private var applyUnsubscribe: (() -> Unit)? = null
+    private var applyUnsubscribe: ObserverHandle? = null
 
     /**
      * `true` when an [observeReads] is in progress and [readObserver] is active and `false` when
@@ -186,7 +186,7 @@
         applyUnsubscribe = if (enabled) {
             Snapshot.registerApplyObserver(applyObserver)
         } else {
-            applyUnsubscribe?.invoke()
+            applyUnsubscribe?.dispose()
             null
         }
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt
index e8e35cc..6382a8f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/tooling/InspectionTables.kt
@@ -18,10 +18,10 @@
 
 import androidx.compose.runtime.CompositionData
 import androidx.compose.runtime.InternalComposeApi
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 
 /**
  * A set of slot tables that where produced when in inspection mode.
  */
 @InternalComposeApi
-val InspectionTables = staticAmbientOf<MutableSet<CompositionData>?> { null }
+val LocalInspectionTables = staticCompositionLocalOf<MutableSet<CompositionData>?> { null }
diff --git a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt
index 9a4ddf3..c494970 100644
--- a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt
+++ b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt
@@ -87,7 +87,6 @@
 }
 
 // TODO(igotti): do we need actual processing for those?
-actual annotation class MainThread()
 actual annotation class CheckResult(actual val suggest: String)
 
 /**
@@ -117,15 +116,15 @@
  * obtained using [LaunchedEffect] or [rememberCoroutineScope] they also use
  * [MonotonicFrameClock] which is bound to the current window.
  */
-actual val DefaultMonotonicFrameClock: MonotonicFrameClock by lazy {
-    object : MonotonicFrameClock {
-        private val fps = 60
+actual val DefaultMonotonicFrameClock: MonotonicFrameClock get() = SixtyFpsMonotonicFrameClock
 
-        override suspend fun <R> withFrameNanos(
-            onFrame: (Long) -> R
-        ): R {
-            delay(1000L / fps)
-            return onFrame(System.nanoTime())
-        }
+private object SixtyFpsMonotonicFrameClock : MonotonicFrameClock {
+    private const val fps = 60
+
+    override suspend fun <R> withFrameNanos(
+        onFrame: (Long) -> R
+    ): R {
+        delay(1000L / fps)
+        return onFrame(System.nanoTime())
     }
-}
\ No newline at end of file
+}
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
index 9876c54..8527310 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
@@ -232,7 +232,7 @@
             assertEquals(snapshot, observedSnapshot)
         } finally {
             snapshot.dispose()
-            unregister()
+            unregister.dispose()
         }
     }
 
@@ -258,7 +258,7 @@
 
             assertTrue(applyObserved)
         } finally {
-            unregister()
+            unregister.dispose()
         }
     }
 
@@ -645,7 +645,7 @@
         block()
         Snapshot.sendApplyNotifications()
     } finally {
-        removeObserver()
+        removeObserver.dispose()
     }
     return changes
 }
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.kt
new file mode 100644
index 0000000..5253670
--- /dev/null
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.kt
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.testutils
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.content.ContextWrapper
+import android.graphics.Bitmap
+import android.os.Build
+import android.os.Handler
+import android.os.Looper
+import android.view.PixelCopy
+import android.view.View
+import android.view.ViewTreeObserver
+import androidx.annotation.RequiresApi
+import androidx.compose.ui.graphics.ImageBitmap
+import androidx.compose.ui.graphics.asImageBitmap
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+/**
+ * Captures the underlying view's surface into bitmap.
+ *
+ * This has currently several limitations. Currently we assume that the view is hosted in
+ * Activity's window. Also if there is another window covering part of the component if won't occur
+ * in the bitmap as this is taken from the component's window surface.
+ */
+@RequiresApi(Build.VERSION_CODES.O)
+@SuppressLint("UnsafeNewApiCall") // Seems like lint is giving false red flags
+fun View.captureToImage(): ImageBitmap {
+    val locationInWindow = intArrayOf(0, 0)
+    getLocationInWindow(locationInWindow)
+    val x = locationInWindow[0]
+    val y = locationInWindow[1]
+    val boundsInWindow = android.graphics.Rect(x, y, x + width, y + height)
+
+    fun Context.getActivity(): Activity? {
+        return when (this) {
+            is Activity -> this
+            is ContextWrapper -> this.baseContext.getActivity()
+            else -> null
+        }
+    }
+
+    val windowToCapture = context.getActivity()!!.window
+    val handler = Handler(Looper.getMainLooper())
+
+    // first we wait for the drawing to happen
+    val drawLatch = CountDownLatch(1)
+    val decorView = windowToCapture.decorView
+    handler.post {
+        if (Build.VERSION.SDK_INT >= 29 && decorView.isHardwareAccelerated) {
+            decorView.viewTreeObserver.registerFrameCommitCallback {
+                drawLatch.countDown()
+            }
+        } else {
+            decorView.viewTreeObserver.addOnDrawListener(object : ViewTreeObserver.OnDrawListener {
+                var handled = false
+                override fun onDraw() {
+                    if (!handled) {
+                        handled = true
+                        handler.post {
+                            drawLatch.countDown()
+                            decorView.viewTreeObserver.removeOnDrawListener(this)
+                        }
+                    }
+                }
+            })
+        }
+        decorView.invalidate()
+    }
+    if (!drawLatch.await(2, TimeUnit.SECONDS)) {
+        throw AssertionError("Failed waiting for DecorView redraw!")
+    }
+
+    // and then request the pixel copy of the drawn buffer
+    val destBitmap = Bitmap.createBitmap(
+        boundsInWindow.width(),
+        boundsInWindow.height(),
+        Bitmap.Config.ARGB_8888
+    )
+
+    val latch = CountDownLatch(1)
+    var copyResult = 0
+    val onCopyFinished = PixelCopy.OnPixelCopyFinishedListener { result ->
+        copyResult = result
+        latch.countDown()
+    }
+    PixelCopy.request(windowToCapture, boundsInWindow, destBitmap, onCopyFinished, handler)
+
+    if (!latch.await(1, TimeUnit.SECONDS)) {
+        throw AssertionError("Failed waiting for PixelCopy!")
+    }
+    if (copyResult != PixelCopy.SUCCESS) {
+        throw AssertionError("PixelCopy failed!")
+    }
+    return destBitmap.asImageBitmap()
+}
\ No newline at end of file
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
index 553fcc1..ed01647 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
@@ -54,7 +54,7 @@
 
     /**
      * This method should emit content that is supposed to be measured. Any other helper containers,
-     * ambients and themes should be set in [ContentWrappers].
+     * CompositionLocals and themes should be set in [ContentWrappers].
      *
      * The lifecycle rules for this method are same as for [Content]
      */
@@ -66,7 +66,7 @@
      *
      * In "first" benchmarks this method's content is set up before the content from
      * [MeasuredContent] gets introduced to be measured. This helps to avoid measuring helper
-     * containers or ambients setups.
+     * containers or CompositionLocal setups.
      *
      * The lifecycle rules for this method are same as for [Content]
      */
diff --git a/compose/ui/ui-android-stubs/api/api_lint.ignore b/compose/ui/ui-android-stubs/api/api_lint.ignore
new file mode 100644
index 0000000..6a77ca1
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+GetterSetterNames: android.view.RenderNode#getClipToOutline():
+    Symmetric method for `setClipToOutline` must be named `isClipToOutline`; was `getClipToOutline`
diff --git a/compose/ui/ui-graphics/build.gradle b/compose/ui/ui-graphics/build.gradle
index 42642e2..eb18e6b 100644
--- a/compose/ui/ui-graphics/build.gradle
+++ b/compose/ui/ui-graphics/build.gradle
@@ -51,6 +51,7 @@
 
         androidTestImplementation project(":compose:ui:ui-graphics:ui-graphics-samples")
         androidTestImplementation project(":compose:ui:ui-test-junit4")
+        androidTestImplementation project(":compose:test-utils")
         androidTestImplementation(ANDROIDX_TEST_RULES)
         androidTestImplementation(ANDROIDX_TEST_RUNNER)
         androidTestImplementation(ESPRESSO_CORE)
@@ -97,6 +98,7 @@
             androidAndroidTest.dependencies {
                 implementation project(":compose:ui:ui-graphics:ui-graphics-samples")
                 implementation project(":compose:ui:ui-test-junit4")
+                implementation project(":compose:test-utils")
                 implementation(ANDROIDX_TEST_RULES)
                 implementation(ANDROIDX_TEST_RUNNER)
                 implementation(ESPRESSO_CORE)
diff --git a/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt b/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt
index d9a9526..3bdf133 100644
--- a/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt
+++ b/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidCanvasTest.kt
@@ -32,7 +32,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.test.captureToImage
+import androidx.compose.testutils.captureToImage
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.kt
index 5330889..8deebde 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidImageBitmap.kt
@@ -18,7 +18,7 @@
 
 import android.content.res.Resources
 import android.graphics.Bitmap
-import android.graphics.BitmapFactory
+import android.graphics.drawable.BitmapDrawable
 import android.os.Build
 import android.util.DisplayMetrics
 import androidx.annotation.RequiresApi
@@ -34,7 +34,7 @@
  * @return Loaded image file represented as an [ImageBitmap]
  */
 fun imageFromResource(res: Resources, resId: Int): ImageBitmap {
-    return AndroidImageBitmap(BitmapFactory.decodeResource(res, resId))
+    return (res.getDrawable(resId, null) as BitmapDrawable).bitmap.asImageBitmap()
 }
 
 /**
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.kt
index e49c1eb..7602ef9 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.kt
@@ -21,7 +21,7 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.saveable.AmbientSaveableStateRegistry
+import androidx.compose.runtime.saveable.LocalSaveableStateRegistry
 import androidx.compose.runtime.saveable.SaveableStateRegistry
 import androidx.compose.runtime.setValue
 
@@ -78,12 +78,12 @@
 
     @Composable
     private fun InjectRestorationRegistry(content: @Composable (RestorationRegistry) -> Unit) {
-        val original = requireNotNull(AmbientSaveableStateRegistry.current) {
+        val original = requireNotNull(LocalSaveableStateRegistry.current) {
             "StateRestorationTester requires composeTestRule.setContent() to provide " +
-                "an SaveableStateRegistry implementation via AmbientSaveableStateRegistry"
+                "a SaveableStateRegistry implementation via LocalSaveableStateRegistry"
         }
         val restorationRegistry = remember { RestorationRegistry(original) }
-        Providers(AmbientSaveableStateRegistry provides restorationRegistry) {
+        Providers(LocalSaveableStateRegistry provides restorationRegistry) {
             if (restorationRegistry.shouldEmitChildren) {
                 content(restorationRegistry)
             }
diff --git a/compose/ui/ui-test/api/api_lint.ignore b/compose/ui/ui-test/api/api_lint.ignore
new file mode 100644
index 0000000..4eff534
--- /dev/null
+++ b/compose/ui/ui-test/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+GetterSetterNames: androidx.compose.ui.test.MainTestClock#getAutoAdvance():
+    Symmetric method for `setAutoAdvance` must be named `isAutoAdvance`; was `getAutoAdvance`
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index 61c92645..25bab5b 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -14,7 +14,6 @@
 
   public final class AndroidImageHelpersKt {
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
-    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(android.view.View);
   }
 
   public final class AndroidInputDispatcherKt {
diff --git a/compose/ui/ui-test/api/public_plus_experimental_current.txt b/compose/ui/ui-test/api/public_plus_experimental_current.txt
index 61c92645..25bab5b 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -14,7 +14,6 @@
 
   public final class AndroidImageHelpersKt {
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
-    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(android.view.View);
   }
 
   public final class AndroidInputDispatcherKt {
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index 61c92645..25bab5b 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -14,7 +14,6 @@
 
   public final class AndroidImageHelpersKt {
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
-    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(android.view.View);
   }
 
   public final class AndroidInputDispatcherKt {
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
index 830cce9..febc6ad 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/LayoutCoordinatesHelperTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
@@ -81,7 +81,7 @@
         var parentCoordinates: LayoutCoordinates? = null
         var childCoordinates: LayoutCoordinates? = null
         rule.setContent {
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 Box(Modifier.preferredWidth(40.toDp()), contentAlignment = Alignment.Center) {
                     Column(
                         Modifier.preferredWidth(20.toDp())
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ScrollToTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ScrollToTest.kt
index 694fdb9..3566122 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ScrollToTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ScrollToTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.semantics.scrollBy
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Constraints
@@ -83,7 +83,7 @@
         columnHeight: Int,
         content: @Composable () -> Unit
     ) {
-        with(AmbientDensity.current) {
+        with(LocalDensity.current) {
             Layout(
                 content,
                 modifier.size(crossAxisSize.toDp(), columnHeight.toDp()),
@@ -99,7 +99,7 @@
         rowWidth: Int,
         content: @Composable () -> Unit
     ) {
-        with(AmbientDensity.current) {
+        with(LocalDensity.current) {
             Layout(
                 content,
                 modifier.size(rowWidth.toDp(), crossAxisSize.toDp()),
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt
index 6450e46..fdd652e 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/PositionsTest.kt
@@ -24,7 +24,7 @@
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.bottom
 import androidx.compose.ui.test.bottomCenter
@@ -123,7 +123,7 @@
 
     private fun testPositionsInViewport(isVertical: Boolean, reverseScrollDirection: Boolean) {
         rule.setContent {
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 if (isVertical) {
                     Column(
                         Modifier.size(100.toDp())
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
index 312c1ca..5986aaa 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
@@ -31,8 +31,8 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientViewConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.bottomCenter
@@ -172,8 +172,8 @@
             animationClock = MockAnimationClock()
         )
         rule.setContent {
-            Providers(AmbientViewConfiguration provides FakeViewConfiguration) {
-                with(AmbientDensity.current) {
+            Providers(LocalViewConfiguration provides FakeViewConfiguration) {
+                with(LocalDensity.current) {
                     // Scrollable with a viewport the size of 10 boxes
                     Column(
                         Modifier
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt
index 93c724e..eb655d8 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/ClickableTestBox.kt
@@ -22,7 +22,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.util.ClickableTestBox.defaultColor
 import androidx.compose.ui.test.util.ClickableTestBox.defaultSize
@@ -42,7 +42,7 @@
     color: Color = defaultColor,
     tag: String = defaultTag
 ) {
-    with(AmbientDensity.current) {
+    with(LocalDensity.current) {
         Box(
             modifier = modifier.testTag(tag).size(width.toDp(), height.toDp()).background(color)
         )
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.kt
index 7c82733..e9d4e90 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidImageHelpers.kt
@@ -89,7 +89,7 @@
     // Now these are bounds in window
     nodeBoundsRect.offset(x, y)
 
-    return captureRegionToImage(nodeBoundsRect, view, windowToUse)
+    return captureRegionToImage(testContext, nodeBoundsRect, view, windowToUse)
 }
 
 private fun findDialogWindowProviderInParent(view: View): DialogWindowProvider? {
@@ -102,20 +102,3 @@
     }
     return null
 }
-
-/**
- * Captures the underlying view's surface into bitmap.
- *
- * This has currently several limitations. Currently we assume that the view is hosted in
- * Activity's window. Also if there is another window covering part of the component if won't occur
- * in the bitmap as this is taken from the component's window surface.
- */
-@RequiresApi(Build.VERSION_CODES.O)
-fun View.captureToImage(): ImageBitmap {
-    val locationInWindow = intArrayOf(0, 0)
-    getLocationInWindow(locationInWindow)
-    val x = locationInWindow[0]
-    val y = locationInWindow[1]
-    val boundsInWindow = android.graphics.Rect(x, y, x + width, y + height)
-    return captureRegionToImage(boundsInWindow, this)
-}
\ No newline at end of file
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.kt
index 3ea098c..85a3ab5 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.kt
@@ -31,11 +31,16 @@
 import androidx.annotation.RequiresApi
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.test.ComposeTimeoutException
+import androidx.compose.ui.test.InternalTestApi
+import androidx.compose.ui.test.MainTestClock
+import androidx.compose.ui.test.TestContext
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
 @RequiresApi(Build.VERSION_CODES.O)
 internal fun captureRegionToImage(
+    testContext: TestContext,
     captureRectInWindow: Rect,
     view: View,
     window: Window? = null
@@ -52,12 +57,12 @@
     val handler = Handler(Looper.getMainLooper())
 
     // first we wait for the drawing to happen
-    val drawLatch = CountDownLatch(1)
+    var drawDone = false
     val decorView = windowToCapture.decorView
     handler.post {
         if (Build.VERSION.SDK_INT >= 29 && decorView.isHardwareAccelerated()) {
             decorView.viewTreeObserver.registerFrameCommitCallback {
-                drawLatch.countDown()
+                drawDone = true
             }
         } else {
             decorView.viewTreeObserver.addOnDrawListener(object : ViewTreeObserver.OnDrawListener {
@@ -66,7 +71,7 @@
                     if (!handled) {
                         handled = true
                         handler.post {
-                            drawLatch.countDown()
+                            drawDone = true
                             decorView.viewTreeObserver.removeOnDrawListener(this)
                         }
                     }
@@ -75,9 +80,9 @@
         }
         decorView.invalidate()
     }
-    if (!drawLatch.await(1, TimeUnit.SECONDS)) {
-        throw AssertionError("Failed waiting for DecorView redraw!")
-    }
+
+    @OptIn(InternalTestApi::class)
+    testContext.testOwner.mainClock.waitUntil(timeoutMillis = 2_000) { drawDone }
 
     // and then request the pixel copy of the drawn buffer
     val destBitmap = Bitmap.createBitmap(
@@ -102,3 +107,21 @@
     }
     return destBitmap.asImageBitmap()
 }
+
+// Unfortunately this is a copy paste from AndroidComposeTestRule. At this moment it is a bit
+// tricky to share this method. We can expose it on TestOwner in theory.
+private fun MainTestClock.waitUntil(timeoutMillis: Long, condition: () -> Boolean) {
+    val startTime = System.nanoTime()
+    while (!condition()) {
+        if (autoAdvance) {
+            advanceTimeByFrame()
+        }
+        // Let Android run measure, draw and in general any other async operations.
+        Thread.sleep(10)
+        if (System.nanoTime() - startTime > timeoutMillis * 1_000_000) {
+            throw ComposeTimeoutException(
+                "Condition still not satisfied after $timeoutMillis ms"
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/api/api_lint.ignore b/compose/ui/ui-text/api/api_lint.ignore
index e58187a..04e1505 100644
--- a/compose/ui/ui-text/api/api_lint.ignore
+++ b/compose/ui/ui-text/api/api_lint.ignore
@@ -19,8 +19,6 @@
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.compose.ui.text.AnnotatedString.Builder.pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation)
 BuilderSetStyle: androidx.compose.ui.text.AnnotatedString.Builder#toAnnotatedString():
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.compose.ui.text.AnnotatedString.Builder.toAnnotatedString()
-BuilderSetStyle: androidx.compose.ui.text.AnnotatedString.Builder#toString():
-    Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.compose.ui.text.AnnotatedString.Builder.toString()
 
 
 GetterOnBuilder: androidx.compose.ui.text.AnnotatedString.Builder#getLength():
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 e443bf93..1d10f0a 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
@@ -208,7 +208,7 @@
             val text = createAnnotatedString(List(3) { "a".repeat(lineLength) })
 
             val fontSize = 50.sp
-            val fontSizeInPx = fontSize.toIntPx()
+            val fontSizeInPx = fontSize.roundToPx()
             // each line contains 2 character
             val width = 2 * fontSizeInPx
 
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt
index 2417156..8c8be66 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableStringTest.kt
@@ -119,7 +119,7 @@
         assertThat(spannableString).hasSpan(
             AbsoluteSizeSpan::class, 5, 10
         ) {
-            it.size == with(density) { fontSize.toIntPx() }
+            it.size == with(density) { fontSize.roundToPx() }
         }
     }
 
diff --git a/compose/ui/ui-tooling-data/OWNERS b/compose/ui/ui-tooling-data/OWNERS
new file mode 100644
index 0000000..583d415
--- /dev/null
+++ b/compose/ui/ui-tooling-data/OWNERS
@@ -0,0 +1,3 @@
[email protected]
[email protected]
[email protected]
\ No newline at end of file
diff --git a/compose/ui/ui-tooling-data/api/current.txt b/compose/ui/ui-tooling-data/api/current.txt
new file mode 100644
index 0000000..3a629b7
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/current.txt
@@ -0,0 +1,101 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class CallGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntRect box, androidx.compose.ui.tooling.data.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public abstract sealed class Group {
+    method public final androidx.compose.ui.unit.IntRect getBox();
+    method public final java.util.Collection<androidx.compose.ui.tooling.data.Group> getChildren();
+    method public final java.util.Collection<java.lang.Object> getData();
+    method public final Object? getKey();
+    method public final androidx.compose.ui.tooling.data.SourceLocation? getLocation();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public final String? getName();
+    method public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> getParameters();
+    property public final androidx.compose.ui.unit.IntRect box;
+    property public final java.util.Collection<androidx.compose.ui.tooling.data.Group> children;
+    property public final java.util.Collection<java.lang.Object> data;
+    property public final Object? key;
+    property public final androidx.compose.ui.tooling.data.SourceLocation? location;
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final String? name;
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class JoinedKey {
+    ctor public JoinedKey(Object? left, Object? right);
+    method public Object? component1();
+    method public Object? component2();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.JoinedKey copy(Object? left, Object? right);
+    method public Object? getLeft();
+    method public Object? getRight();
+    property public final Object? left;
+    property public final Object? right;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class NodeGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntRect box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    method public Object getNode();
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final Object node;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class ParameterInformation {
+    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
+    method public String component1();
+    method public Object? component2();
+    method public boolean component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public String? component6();
+    method public boolean component7();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
+    method public boolean getCompared();
+    method public boolean getFromDefault();
+    method public String? getInlineClass();
+    method public String getName();
+    method public boolean getStable();
+    method public boolean getStatic();
+    method public Object? getValue();
+    property public final boolean compared;
+    property public final boolean fromDefault;
+    property public final String? inlineClass;
+    property public final String name;
+    property public final boolean stable;
+    property public final boolean static;
+    property public final Object? value;
+  }
+
+  public final class SlotTreeKt {
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static androidx.compose.ui.tooling.data.Group asTree(androidx.compose.runtime.CompositionData);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static String? getPosition(androidx.compose.ui.tooling.data.Group);
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class SourceLocation {
+    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public String? component4();
+    method public int component5();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int getLength();
+    method public int getLineNumber();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public String? getSourceFile();
+    property public final int length;
+    property public final int lineNumber;
+    property public final int offset;
+    property public final int packageHash;
+    property public final String? sourceFile;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is for tooling only and is likely to change in the future.") public @interface UiToolingDataApi {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..3a629b7
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_current.txt
@@ -0,0 +1,101 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class CallGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntRect box, androidx.compose.ui.tooling.data.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public abstract sealed class Group {
+    method public final androidx.compose.ui.unit.IntRect getBox();
+    method public final java.util.Collection<androidx.compose.ui.tooling.data.Group> getChildren();
+    method public final java.util.Collection<java.lang.Object> getData();
+    method public final Object? getKey();
+    method public final androidx.compose.ui.tooling.data.SourceLocation? getLocation();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public final String? getName();
+    method public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> getParameters();
+    property public final androidx.compose.ui.unit.IntRect box;
+    property public final java.util.Collection<androidx.compose.ui.tooling.data.Group> children;
+    property public final java.util.Collection<java.lang.Object> data;
+    property public final Object? key;
+    property public final androidx.compose.ui.tooling.data.SourceLocation? location;
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final String? name;
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class JoinedKey {
+    ctor public JoinedKey(Object? left, Object? right);
+    method public Object? component1();
+    method public Object? component2();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.JoinedKey copy(Object? left, Object? right);
+    method public Object? getLeft();
+    method public Object? getRight();
+    property public final Object? left;
+    property public final Object? right;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class NodeGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntRect box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    method public Object getNode();
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final Object node;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class ParameterInformation {
+    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
+    method public String component1();
+    method public Object? component2();
+    method public boolean component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public String? component6();
+    method public boolean component7();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
+    method public boolean getCompared();
+    method public boolean getFromDefault();
+    method public String? getInlineClass();
+    method public String getName();
+    method public boolean getStable();
+    method public boolean getStatic();
+    method public Object? getValue();
+    property public final boolean compared;
+    property public final boolean fromDefault;
+    property public final String? inlineClass;
+    property public final String name;
+    property public final boolean stable;
+    property public final boolean static;
+    property public final Object? value;
+  }
+
+  public final class SlotTreeKt {
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static androidx.compose.ui.tooling.data.Group asTree(androidx.compose.runtime.CompositionData);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static String? getPosition(androidx.compose.ui.tooling.data.Group);
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class SourceLocation {
+    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public String? component4();
+    method public int component5();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int getLength();
+    method public int getLineNumber();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public String? getSourceFile();
+    property public final int length;
+    property public final int lineNumber;
+    property public final int offset;
+    property public final int packageHash;
+    property public final String? sourceFile;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is for tooling only and is likely to change in the future.") public @interface UiToolingDataApi {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/api/res-current.txt b/compose/ui/ui-tooling-data/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/res-current.txt
diff --git a/compose/ui/ui-tooling-data/api/restricted_current.txt b/compose/ui/ui-tooling-data/api/restricted_current.txt
new file mode 100644
index 0000000..3a629b7
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_current.txt
@@ -0,0 +1,101 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class CallGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntRect box, androidx.compose.ui.tooling.data.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public abstract sealed class Group {
+    method public final androidx.compose.ui.unit.IntRect getBox();
+    method public final java.util.Collection<androidx.compose.ui.tooling.data.Group> getChildren();
+    method public final java.util.Collection<java.lang.Object> getData();
+    method public final Object? getKey();
+    method public final androidx.compose.ui.tooling.data.SourceLocation? getLocation();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public final String? getName();
+    method public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> getParameters();
+    property public final androidx.compose.ui.unit.IntRect box;
+    property public final java.util.Collection<androidx.compose.ui.tooling.data.Group> children;
+    property public final java.util.Collection<java.lang.Object> data;
+    property public final Object? key;
+    property public final androidx.compose.ui.tooling.data.SourceLocation? location;
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final String? name;
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class JoinedKey {
+    ctor public JoinedKey(Object? left, Object? right);
+    method public Object? component1();
+    method public Object? component2();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.JoinedKey copy(Object? left, Object? right);
+    method public Object? getLeft();
+    method public Object? getRight();
+    property public final Object? left;
+    property public final Object? right;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class NodeGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntRect box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    method public Object getNode();
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final Object node;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class ParameterInformation {
+    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
+    method public String component1();
+    method public Object? component2();
+    method public boolean component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public String? component6();
+    method public boolean component7();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
+    method public boolean getCompared();
+    method public boolean getFromDefault();
+    method public String? getInlineClass();
+    method public String getName();
+    method public boolean getStable();
+    method public boolean getStatic();
+    method public Object? getValue();
+    property public final boolean compared;
+    property public final boolean fromDefault;
+    property public final String? inlineClass;
+    property public final String name;
+    property public final boolean stable;
+    property public final boolean static;
+    property public final Object? value;
+  }
+
+  public final class SlotTreeKt {
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static androidx.compose.ui.tooling.data.Group asTree(androidx.compose.runtime.CompositionData);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static String? getPosition(androidx.compose.ui.tooling.data.Group);
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class SourceLocation {
+    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public String? component4();
+    method public int component5();
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int getLength();
+    method public int getLineNumber();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public String? getSourceFile();
+    property public final int length;
+    property public final int lineNumber;
+    property public final int offset;
+    property public final int packageHash;
+    property public final String? sourceFile;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is for tooling only and is likely to change in the future.") public @interface UiToolingDataApi {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/build.gradle b/compose/ui/ui-tooling-data/build.gradle
new file mode 100644
index 0000000..a94cd48
--- /dev/null
+++ b/compose/ui/ui-tooling-data/build.gradle
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+import androidx.build.LibraryGroups
+import androidx.build.Publish
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    kotlinPlugin project(":compose:compiler:compiler")
+
+    implementation(KOTLIN_STDLIB)
+
+    api "androidx.annotation:annotation:1.1.0"
+
+    api(project(":compose:runtime:runtime"))
+    api(project(":compose:ui:ui"))
+
+    androidTestImplementation project(":compose:ui:ui-test-junit4")
+
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+
+    androidTestImplementation(TRUTH)
+    androidTestImplementation(project(":compose:foundation:foundation-layout"))
+    androidTestImplementation(project(":compose:foundation:foundation"))
+    androidTestImplementation(project(":compose:material:material"))
+}
+
+androidx {
+    name = "Compose Tooling Data"
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenGroup = LibraryGroups.Compose.UI
+    inceptionYear = "2021"
+    description = "Compose tooling library data. This library provides data about compose" +
+            " for different tooling purposes."
+    legacyDisableKotlinStrictApiMode = true
+}
diff --git a/benchmark/perfetto/lint-baseline.xml b/compose/ui/ui-tooling-data/lint-baseline.xml
similarity index 100%
copy from benchmark/perfetto/lint-baseline.xml
copy to compose/ui/ui-tooling-data/lint-baseline.xml
diff --git a/compose/ui/ui-tooling-data/src/androidTest/java/AndroidManifest.xml b/compose/ui/ui-tooling-data/src/androidTest/java/AndroidManifest.xml
new file mode 100644
index 0000000..09f8b59
--- /dev/null
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.compose.ui.tooling.data.test">
+
+    <application/>
+
+</manifest>
\ No newline at end of file
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/BoundsTest.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/BoundsTest.kt
similarity index 93%
rename from compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/BoundsTest.kt
rename to compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/BoundsTest.kt
index aec5e08..0d82800 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/BoundsTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/BoundsTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.tooling
+package androidx.compose.ui.tooling.data
 
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxWithConstraints
@@ -28,7 +28,7 @@
 import androidx.compose.runtime.resetSourceInfo
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -41,6 +41,7 @@
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
+@UiToolingDataApi
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class BoundsTest : ToolingTest() {
@@ -86,9 +87,9 @@
             with(Density(activityTestRule.activity)) {
                 println(boundingBoxes.contentDeepToString())
                 arrayOf(
-                    0.dp.toIntPx(), // Root
-                    10.dp.toIntPx(), // Column
-                    15.dp.toIntPx() // Text
+                    0.dp.roundToPx(), // Root
+                    10.dp.roundToPx(), // Column
+                    15.dp.roundToPx() // Text
                 ).forEachIndexed { index, value ->
                     Assert.assertTrue(boundingBoxes[index] in value - 1..value + 1)
                 }
@@ -138,7 +139,7 @@
             Inspectable(slotTableRecord) {
                 key(value) {
                     BoxWithConstraints {
-                        requireNotNull(AmbientDensity.current)
+                        requireNotNull(LocalDensity.current)
                         Text("Hello")
                     }
                 }
diff --git a/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/Inspectable.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/Inspectable.kt
new file mode 100644
index 0000000..b6b8d50
--- /dev/null
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/Inspectable.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.tooling.data
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionData
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.tooling.LocalInspectionTables
+import androidx.compose.ui.platform.LocalInspectionMode
+import java.util.Collections
+import java.util.WeakHashMap
+
+/**
+ * Storage for the preview generated [CompositionData]s.
+ */
+internal interface CompositionDataRecord {
+    val store: Set<CompositionData>
+
+    companion object {
+        fun create(): CompositionDataRecord = CompositionDataRecordImpl()
+    }
+}
+
+private class CompositionDataRecordImpl : CompositionDataRecord {
+    @OptIn(InternalComposeApi::class)
+    override val store: MutableSet<CompositionData> =
+        Collections.newSetFromMap(WeakHashMap())
+}
+
+/**
+ * A wrapper for compositions in inspection mode. The composition inside the Inspectable component
+ * is in inspection mode.
+ *
+ * @param compositionDataRecord [CompositionDataRecord] to record the SlotTable used in the
+ * composition of [content]
+ *
+ * @suppress
+ */
+@Composable
+@OptIn(InternalComposeApi::class)
+internal fun Inspectable(
+    compositionDataRecord: CompositionDataRecord,
+    content: @Composable () -> Unit
+) {
+    currentComposer.collectParameterInformation()
+    val store = (compositionDataRecord as CompositionDataRecordImpl).store
+    store.add(currentComposer.compositionData)
+    Providers(
+        LocalInspectionMode provides true,
+        LocalInspectionTables provides store,
+        content = content
+    )
+}
+
+/**
+ * A wrapper for inspection-mode-only behavior. The children of this component will only be included
+ * in the composition when the composition is in inspection mode.
+ */
+@Composable
+fun InInspectionModeOnly(content: @Composable () -> Unit) {
+    if (LocalInspectionMode.current) {
+        content()
+    }
+}
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/InspectableTests.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/InspectableTests.kt
similarity index 98%
rename from compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/InspectableTests.kt
rename to compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/InspectableTests.kt
index a1ea937..c5b9f4c 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/InspectableTests.kt
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/InspectableTests.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.tooling
+package androidx.compose.ui.tooling.data
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
@@ -44,6 +44,7 @@
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
+@UiToolingDataApi
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class InspectableTests : ToolingTest() {
@@ -373,7 +374,7 @@
         activity.runOnUiThread { }
 
         assertFalse(tables.isNullOrEmpty())
-        assertTrue(tables!!.size > 1)
+        assertTrue(tables.size > 1)
 
         val calls = tables.flatMap { table ->
             if (!table.isEmpty) table.asTree().asList() else emptyList()
@@ -410,6 +411,7 @@
 }
 
 // BFS
+@UiToolingDataApi
 internal fun Group.firstOrNull(predicate: (Group) -> Boolean): Group? {
     val stack = mutableListOf(this)
     while (stack.isNotEmpty()) {
@@ -420,6 +422,7 @@
     return null
 }
 
+@UiToolingDataApi
 internal fun Group.asList(): List<Group> {
     val result = mutableListOf<Group>()
     val stack = mutableListOf(this)
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/ModifierInfoTest.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/ModifierInfoTest.kt
similarity index 93%
rename from compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/ModifierInfoTest.kt
rename to compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/ModifierInfoTest.kt
index 51b3d3a..1757b86 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/ModifierInfoTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/ModifierInfoTest.kt
@@ -14,21 +14,21 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.tooling
+package androidx.compose.ui.tooling.data
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
-import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.layout.GraphicLayerInfo
 import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.positionInRoot
-import androidx.compose.ui.node.OwnedLayer
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import org.junit.Assert.assertEquals
@@ -36,6 +36,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
+@UiToolingDataApi
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class ModifierInfoTest : ToolingTest() {
@@ -47,7 +48,7 @@
         val slotTableRecord = CompositionDataRecord.create()
         show {
             Inspectable(slotTableRecord) {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     val px10 = 10f.toDp()
                     val px5 = 5f.toDp()
                     Box {
@@ -105,7 +106,7 @@
                     "but was ${columnModifierInfo[1].modifier}",
                 columnModifierInfo[1].modifier is LayoutModifier
             )
-            assertTrue(columnModifierInfo[2].extra is OwnedLayer)
+            assertTrue(columnModifierInfo[2].extra is GraphicLayerInfo)
             assertEquals(10f, columnModifierInfo[1].coordinates.positionInRoot().x)
             assertTrue(
                 "The third modifier in the column should be a DrawModifier" +
diff --git a/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/TestActivity.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/TestActivity.kt
new file mode 100644
index 0000000..28d6003
--- /dev/null
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/TestActivity.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.tooling.data
+
+import androidx.activity.ComponentActivity
+import java.util.concurrent.CountDownLatch
+
+class TestActivity : ComponentActivity() {
+    var hasFocusLatch = CountDownLatch(1)
+
+    override fun onWindowFocusChanged(hasFocus: Boolean) {
+        super.onWindowFocusChanged(hasFocus)
+        if (hasFocus) {
+            hasFocusLatch.countDown()
+        }
+    }
+}
diff --git a/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/ToolingTest.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/ToolingTest.kt
new file mode 100644
index 0000000..89b01699
--- /dev/null
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/ToolingTest.kt
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.tooling.data
+
+import android.os.Handler
+import android.os.Looper
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionData
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.R
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.ViewRootForTest
+import androidx.compose.ui.platform.setContent
+import org.junit.Before
+import org.junit.Rule
+import java.util.Collections
+import java.util.WeakHashMap
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+open class ToolingTest {
+    @Suppress("DEPRECATION")
+    @get:Rule
+    val activityTestRule = androidx.test.rule.ActivityTestRule<TestActivity>(
+        TestActivity::class.java
+    )
+    lateinit var activity: TestActivity
+    lateinit var handler: Handler
+    lateinit var positionedLatch: CountDownLatch
+
+    @Before
+    fun setup() {
+        activity = activityTestRule.activity
+        activity.hasFocusLatch.await(5, TimeUnit.SECONDS)
+
+        activityTestRule.onUiThread { handler = Handler(Looper.getMainLooper()) }
+    }
+
+    internal fun show(composable: @Composable () -> Unit) {
+        positionedLatch = CountDownLatch(1)
+        activityTestRule.onUiThread {
+            activity.setContent {
+                Box(
+                    Modifier.onGloballyPositioned { positionedLatch.countDown() }
+                        .fillMaxSize()
+                ) {
+                    composable()
+                }
+            }
+        }
+
+        // Wait for the layout to be performed
+        positionedLatch.await(1, TimeUnit.SECONDS)
+
+        // Wait for the UI thread to complete its current work so we know that layout is done.
+        activityTestRule.onUiThread { }
+    }
+
+    internal fun showAndRecord(content: @Composable () -> Unit): MutableSet<CompositionData> {
+
+        positionedLatch = CountDownLatch(1)
+        val map: MutableSet<CompositionData> = Collections.newSetFromMap(
+            WeakHashMap<CompositionData, Boolean>()
+        )
+        activityTestRule.onUiThread {
+            ViewRootForTest.onViewCreatedCallback = {
+                it.view.setTag(R.id.inspection_slot_table_set, map)
+                ViewRootForTest.onViewCreatedCallback = null
+            }
+            activity.setContent {
+                Box(
+                    Modifier.onGloballyPositioned { positionedLatch.countDown() }
+                        .fillMaxSize()
+                ) {
+                    content()
+                }
+            }
+
+            // Wait for the layout to be performed
+            positionedLatch.await(1, TimeUnit.SECONDS)
+
+            // Wait for the UI thread to complete its current work so we know that layout is done.
+            activityTestRule.onUiThread { }
+        }
+        return map
+    }
+}
+
+// Kotlin IR compiler doesn't seem too happy with auto-conversion from
+// lambda to Runnable, so separate it here
+@Suppress("DEPRECATION")
+fun androidx.test.rule.ActivityTestRule<TestActivity>.onUiThread(block: () -> Unit) {
+    val runnable: Runnable = object : Runnable {
+        override fun run() {
+            block()
+        }
+    }
+    runOnUiThread(runnable)
+}
diff --git a/compose/ui/ui-tooling-data/src/main/AndroidManifest.xml b/compose/ui/ui-tooling-data/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..db78381
--- /dev/null
+++ b/compose/ui/ui-tooling-data/src/main/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.compose.ui.tooling.data">
+
+    <application>
+        <activity android:name=".TestActivity" />
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/SlotTree.kt b/compose/ui/ui-tooling-data/src/main/java/androidx/compose/ui/tooling/data/SlotTree.kt
similarity index 95%
rename from compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/SlotTree.kt
rename to compose/ui/ui-tooling-data/src/main/java/androidx/compose/ui/tooling/data/SlotTree.kt
index 271c767..aba023e 100644
--- a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/SlotTree.kt
+++ b/compose/ui/ui-tooling-data/src/main/java/androidx/compose/ui/tooling/data/SlotTree.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * 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.
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.tooling
+package androidx.compose.ui.tooling.data
 
 import androidx.compose.runtime.CompositionData
 import androidx.compose.runtime.CompositionGroup
 import androidx.compose.ui.layout.LayoutInfo
 import androidx.compose.ui.layout.ModifierInfo
 import androidx.compose.ui.layout.positionInWindow
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import java.lang.reflect.Field
 import kotlin.math.max
 import kotlin.math.min
@@ -30,6 +30,7 @@
 /**
  * A group in the slot table. Represents either a call or an emitted node.
  */
+@UiToolingDataApi
 sealed class Group(
     /**
      * The key is the key generated for the group
@@ -49,7 +50,7 @@
     /**
      * The bounding layout box for the group.
      */
-    val box: IntBounds,
+    val box: IntRect,
 
     /**
      * Any data that was stored in the slot table for the group
@@ -72,6 +73,7 @@
     open val parameters: List<ParameterInformation> get() = emptyList()
 }
 
+@UiToolingDataApi
 data class ParameterInformation(
     val name: String,
     val value: Any?,
@@ -85,6 +87,7 @@
 /**
  * Source location of the call that produced the call group.
  */
+@UiToolingDataApi
 data class SourceLocation(
     /**
      * A 0 offset line number of the source location.
@@ -125,10 +128,11 @@
 /**
  * A group that represents the invocation of a component
  */
+@UiToolingDataApi
 class CallGroup(
     key: Any?,
     name: String?,
-    box: IntBounds,
+    box: IntRect,
     location: SourceLocation?,
     override val parameters: List<ParameterInformation>,
     data: Collection<Any?>,
@@ -138,6 +142,7 @@
 /**
  * A group that represents an emitted node
  */
+@UiToolingDataApi
 class NodeGroup(
     key: Any?,
 
@@ -145,7 +150,7 @@
      * An emitted node
      */
     val node: Any,
-    box: IntBounds,
+    box: IntRect,
     data: Collection<Any?>,
     override val modifierInfo: List<ModifierInfo>,
     children: Collection<Group>
@@ -154,9 +159,10 @@
 /**
  * A key that has being joined together to form one key.
  */
+@UiToolingDataApi
 data class JoinedKey(val left: Any?, val right: Any?)
 
-internal val emptyBox = IntBounds(0, 0, 0, 0)
+internal val emptyBox = IntRect(0, 0, 0, 0)
 
 private val tokenizer = Regex("(\\d+)|([,])|([*])|([:])|L|(P\\([^)]*\\))|(C(\\(([^)]*)\\))?)|@")
 
@@ -171,6 +177,7 @@
 
 private class SourceLocationInfo(val lineNumber: Int?, val offset: Int?, val length: Int?)
 
+@UiToolingDataApi
 private class SourceInformationContext(
     val name: String?,
     val sourceFile: String?,
@@ -318,6 +325,7 @@
     }
 }
 
+@UiToolingDataApi
 private fun sourceInformationContextOf(
     information: String,
     parent: SourceInformationContext?
@@ -425,6 +433,7 @@
 /**
  * Iterate the slot table and extract a group tree that corresponds to the content of the table.
  */
+@UiToolingDataApi
 private fun CompositionGroup.getGroup(parentContext: SourceInformationContext?): Group {
     val key = key
     val context = sourceInfo?.let { sourceInformationContextOf(it, parentContext) }
@@ -471,9 +480,9 @@
         )
 }
 
-private fun boundsOfLayoutNode(node: LayoutInfo): IntBounds {
+private fun boundsOfLayoutNode(node: LayoutInfo): IntRect {
     if (!node.isAttached) {
-        return IntBounds(
+        return IntRect(
             left = 0,
             top = 0,
             right = node.width,
@@ -486,19 +495,20 @@
     val top = position.y.roundToInt()
     val right = left + size.width
     val bottom = top + size.height
-    return IntBounds(left = left, top = top, right = right, bottom = bottom)
+    return IntRect(left = left, top = top, right = right, bottom = bottom)
 }
 
 /**
  * Return a group tree for for the slot table that represents the entire content of the slot
  * table.
  */
+@UiToolingDataApi
 fun CompositionData.asTree(): Group = compositionGroups.first().getGroup(null)
 
-internal fun IntBounds.union(other: IntBounds): IntBounds {
+internal fun IntRect.union(other: IntRect): IntRect {
     if (this == emptyBox) return other else if (other == emptyBox) return this
 
-    return IntBounds(
+    return IntRect(
         left = min(left, other.left),
         top = min(top, other.top),
         bottom = max(bottom, other.bottom),
@@ -506,6 +516,7 @@
     )
 }
 
+@UiToolingDataApi
 private fun keyPosition(key: Any?): String? = when (key) {
     is String -> key
     is JoinedKey ->
@@ -521,6 +532,7 @@
 private const val jacocoDataField = "${parameterPrefix}jacoco"
 private const val recomposeScopeNameSuffix = ".RecomposeScopeImpl"
 
+@UiToolingDataApi
 private fun extractParameterInfo(
     data: List<Any?>,
     context: SourceInformationContext?
@@ -595,7 +607,10 @@
 /**
  * The source position of the group extracted from the key, if one exists for the group.
  */
-val Group.position: String? get() = keyPosition(key)
+@UiToolingDataApi
+val Group.position: String?
+    @UiToolingDataApi
+    get() = keyPosition(key)
 
 private fun Class<*>.accessibleField(name: String): Field? = declaredFields.firstOrNull {
     it.name == name
diff --git a/compose/ui/ui-tooling-data/src/main/java/androidx/compose/ui/tooling/data/UiToolingDataApi.kt b/compose/ui/ui-tooling-data/src/main/java/androidx/compose/ui/tooling/data/UiToolingDataApi.kt
new file mode 100644
index 0000000..45578f6
--- /dev/null
+++ b/compose/ui/ui-tooling-data/src/main/java/androidx/compose/ui/tooling/data/UiToolingDataApi.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.tooling.data
+
+@RequiresOptIn("This API is for tooling only and is likely to change in the future.")
+annotation class UiToolingDataApi
\ No newline at end of file
diff --git a/compose/ui/ui-tooling/api/api_lint.ignore b/compose/ui/ui-tooling/api/api_lint.ignore
new file mode 100644
index 0000000..2d83e26
--- /dev/null
+++ b/compose/ui/ui-tooling/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+GetterSetterNames: androidx.compose.ui.tooling.inspector.LayoutInspectorTree#getHideSystemNodes():
+    Symmetric method for `setHideSystemNodes` must be named `isHideSystemNodes`; was `getHideSystemNodes`
diff --git a/compose/ui/ui-tooling/api/current.txt b/compose/ui/ui-tooling/api/current.txt
index 242d52e..e392e95 100644
--- a/compose/ui/ui-tooling/api/current.txt
+++ b/compose/ui/ui-tooling/api/current.txt
@@ -1,103 +1,10 @@
 // Signature format: 4.0
 package androidx.compose.ui.tooling {
 
-  public final class CallGroup extends androidx.compose.ui.tooling.Group {
-    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntBounds box, androidx.compose.ui.tooling.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.Group> children);
-    property public java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters;
-  }
-
-  public abstract sealed class Group {
-    method public final androidx.compose.ui.unit.IntBounds getBox();
-    method public final java.util.Collection<androidx.compose.ui.tooling.Group> getChildren();
-    method public final java.util.Collection<java.lang.Object> getData();
-    method public final Object? getKey();
-    method public final androidx.compose.ui.tooling.SourceLocation? getLocation();
-    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
-    method public final String? getName();
-    method public java.util.List<androidx.compose.ui.tooling.ParameterInformation> getParameters();
-    property public final androidx.compose.ui.unit.IntBounds box;
-    property public final java.util.Collection<androidx.compose.ui.tooling.Group> children;
-    property public final java.util.Collection<java.lang.Object> data;
-    property public final Object? key;
-    property public final androidx.compose.ui.tooling.SourceLocation? location;
-    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
-    property public final String? name;
-    property public java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters;
-  }
-
   public final class InspectableKt {
     method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class JoinedKey {
-    ctor public JoinedKey(Object? left, Object? right);
-    method public Object? component1();
-    method public Object? component2();
-    method public androidx.compose.ui.tooling.JoinedKey copy(Object? left, Object? right);
-    method public Object? getLeft();
-    method public Object? getRight();
-    property public final Object? left;
-    property public final Object? right;
-  }
-
-  public final class NodeGroup extends androidx.compose.ui.tooling.Group {
-    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntBounds box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.Group> children);
-    method public Object getNode();
-    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
-    property public final Object node;
-  }
-
-  public final class ParameterInformation {
-    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
-    method public String component1();
-    method public Object? component2();
-    method public boolean component3();
-    method public boolean component4();
-    method public boolean component5();
-    method public String? component6();
-    method public boolean component7();
-    method public androidx.compose.ui.tooling.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
-    method public boolean getCompared();
-    method public boolean getFromDefault();
-    method public String? getInlineClass();
-    method public String getName();
-    method public boolean getStable();
-    method public boolean getStatic();
-    method public Object? getValue();
-    property public final boolean compared;
-    property public final boolean fromDefault;
-    property public final String? inlineClass;
-    property public final String name;
-    property public final boolean stable;
-    property public final boolean static;
-    property public final Object? value;
-  }
-
-  public final class SlotTreeKt {
-    method public static androidx.compose.ui.tooling.Group asTree(androidx.compose.runtime.CompositionData);
-    method public static String? getPosition(androidx.compose.ui.tooling.Group);
-  }
-
-  public final class SourceLocation {
-    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
-    method public int component1();
-    method public int component2();
-    method public int component3();
-    method public String? component4();
-    method public int component5();
-    method public androidx.compose.ui.tooling.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
-    method public int getLength();
-    method public int getLineNumber();
-    method public int getOffset();
-    method public int getPackageHash();
-    method public String? getSourceFile();
-    property public final int length;
-    property public final int lineNumber;
-    property public final int offset;
-    property public final int packageHash;
-    property public final String? sourceFile;
-  }
-
 }
 
 package androidx.compose.ui.tooling.inspector {
diff --git a/compose/ui/ui-tooling/api/public_plus_experimental_current.txt b/compose/ui/ui-tooling/api/public_plus_experimental_current.txt
index 242d52e..e392e95 100644
--- a/compose/ui/ui-tooling/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_current.txt
@@ -1,103 +1,10 @@
 // Signature format: 4.0
 package androidx.compose.ui.tooling {
 
-  public final class CallGroup extends androidx.compose.ui.tooling.Group {
-    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntBounds box, androidx.compose.ui.tooling.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.Group> children);
-    property public java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters;
-  }
-
-  public abstract sealed class Group {
-    method public final androidx.compose.ui.unit.IntBounds getBox();
-    method public final java.util.Collection<androidx.compose.ui.tooling.Group> getChildren();
-    method public final java.util.Collection<java.lang.Object> getData();
-    method public final Object? getKey();
-    method public final androidx.compose.ui.tooling.SourceLocation? getLocation();
-    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
-    method public final String? getName();
-    method public java.util.List<androidx.compose.ui.tooling.ParameterInformation> getParameters();
-    property public final androidx.compose.ui.unit.IntBounds box;
-    property public final java.util.Collection<androidx.compose.ui.tooling.Group> children;
-    property public final java.util.Collection<java.lang.Object> data;
-    property public final Object? key;
-    property public final androidx.compose.ui.tooling.SourceLocation? location;
-    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
-    property public final String? name;
-    property public java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters;
-  }
-
   public final class InspectableKt {
     method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class JoinedKey {
-    ctor public JoinedKey(Object? left, Object? right);
-    method public Object? component1();
-    method public Object? component2();
-    method public androidx.compose.ui.tooling.JoinedKey copy(Object? left, Object? right);
-    method public Object? getLeft();
-    method public Object? getRight();
-    property public final Object? left;
-    property public final Object? right;
-  }
-
-  public final class NodeGroup extends androidx.compose.ui.tooling.Group {
-    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntBounds box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.Group> children);
-    method public Object getNode();
-    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
-    property public final Object node;
-  }
-
-  public final class ParameterInformation {
-    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
-    method public String component1();
-    method public Object? component2();
-    method public boolean component3();
-    method public boolean component4();
-    method public boolean component5();
-    method public String? component6();
-    method public boolean component7();
-    method public androidx.compose.ui.tooling.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
-    method public boolean getCompared();
-    method public boolean getFromDefault();
-    method public String? getInlineClass();
-    method public String getName();
-    method public boolean getStable();
-    method public boolean getStatic();
-    method public Object? getValue();
-    property public final boolean compared;
-    property public final boolean fromDefault;
-    property public final String? inlineClass;
-    property public final String name;
-    property public final boolean stable;
-    property public final boolean static;
-    property public final Object? value;
-  }
-
-  public final class SlotTreeKt {
-    method public static androidx.compose.ui.tooling.Group asTree(androidx.compose.runtime.CompositionData);
-    method public static String? getPosition(androidx.compose.ui.tooling.Group);
-  }
-
-  public final class SourceLocation {
-    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
-    method public int component1();
-    method public int component2();
-    method public int component3();
-    method public String? component4();
-    method public int component5();
-    method public androidx.compose.ui.tooling.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
-    method public int getLength();
-    method public int getLineNumber();
-    method public int getOffset();
-    method public int getPackageHash();
-    method public String? getSourceFile();
-    property public final int length;
-    property public final int lineNumber;
-    property public final int offset;
-    property public final int packageHash;
-    property public final String? sourceFile;
-  }
-
 }
 
 package androidx.compose.ui.tooling.inspector {
diff --git a/compose/ui/ui-tooling/api/restricted_current.txt b/compose/ui/ui-tooling/api/restricted_current.txt
index 242d52e..e392e95 100644
--- a/compose/ui/ui-tooling/api/restricted_current.txt
+++ b/compose/ui/ui-tooling/api/restricted_current.txt
@@ -1,103 +1,10 @@
 // Signature format: 4.0
 package androidx.compose.ui.tooling {
 
-  public final class CallGroup extends androidx.compose.ui.tooling.Group {
-    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntBounds box, androidx.compose.ui.tooling.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.Group> children);
-    property public java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters;
-  }
-
-  public abstract sealed class Group {
-    method public final androidx.compose.ui.unit.IntBounds getBox();
-    method public final java.util.Collection<androidx.compose.ui.tooling.Group> getChildren();
-    method public final java.util.Collection<java.lang.Object> getData();
-    method public final Object? getKey();
-    method public final androidx.compose.ui.tooling.SourceLocation? getLocation();
-    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
-    method public final String? getName();
-    method public java.util.List<androidx.compose.ui.tooling.ParameterInformation> getParameters();
-    property public final androidx.compose.ui.unit.IntBounds box;
-    property public final java.util.Collection<androidx.compose.ui.tooling.Group> children;
-    property public final java.util.Collection<java.lang.Object> data;
-    property public final Object? key;
-    property public final androidx.compose.ui.tooling.SourceLocation? location;
-    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
-    property public final String? name;
-    property public java.util.List<androidx.compose.ui.tooling.ParameterInformation> parameters;
-  }
-
   public final class InspectableKt {
     method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class JoinedKey {
-    ctor public JoinedKey(Object? left, Object? right);
-    method public Object? component1();
-    method public Object? component2();
-    method public androidx.compose.ui.tooling.JoinedKey copy(Object? left, Object? right);
-    method public Object? getLeft();
-    method public Object? getRight();
-    property public final Object? left;
-    property public final Object? right;
-  }
-
-  public final class NodeGroup extends androidx.compose.ui.tooling.Group {
-    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntBounds box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.Group> children);
-    method public Object getNode();
-    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
-    property public final Object node;
-  }
-
-  public final class ParameterInformation {
-    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
-    method public String component1();
-    method public Object? component2();
-    method public boolean component3();
-    method public boolean component4();
-    method public boolean component5();
-    method public String? component6();
-    method public boolean component7();
-    method public androidx.compose.ui.tooling.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, boolean compared, String? inlineClass, boolean stable);
-    method public boolean getCompared();
-    method public boolean getFromDefault();
-    method public String? getInlineClass();
-    method public String getName();
-    method public boolean getStable();
-    method public boolean getStatic();
-    method public Object? getValue();
-    property public final boolean compared;
-    property public final boolean fromDefault;
-    property public final String? inlineClass;
-    property public final String name;
-    property public final boolean stable;
-    property public final boolean static;
-    property public final Object? value;
-  }
-
-  public final class SlotTreeKt {
-    method public static androidx.compose.ui.tooling.Group asTree(androidx.compose.runtime.CompositionData);
-    method public static String? getPosition(androidx.compose.ui.tooling.Group);
-  }
-
-  public final class SourceLocation {
-    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
-    method public int component1();
-    method public int component2();
-    method public int component3();
-    method public String? component4();
-    method public int component5();
-    method public androidx.compose.ui.tooling.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
-    method public int getLength();
-    method public int getLineNumber();
-    method public int getOffset();
-    method public int getPackageHash();
-    method public String? getSourceFile();
-    property public final int length;
-    property public final int lineNumber;
-    property public final int offset;
-    property public final int packageHash;
-    property public final String? sourceFile;
-  }
-
 }
 
 package androidx.compose.ui.tooling.inspector {
diff --git a/compose/ui/ui-tooling/build.gradle b/compose/ui/ui-tooling/build.gradle
index 97f9838..376426a 100644
--- a/compose/ui/ui-tooling/build.gradle
+++ b/compose/ui/ui-tooling/build.gradle
@@ -35,6 +35,7 @@
 
     api(project(":compose:runtime:runtime"))
     api(project(":compose:ui:ui"))
+    api(project(":compose:ui:ui-tooling-data"))
     implementation(project(":compose:material:material"))
 
     // kotlin-reflect and tooling-animation-internal are provided by Studio at runtime
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/SimpleComposablePreview.kt b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/SimpleComposablePreview.kt
index 3c95990..679b4a1 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/SimpleComposablePreview.kt
+++ b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/SimpleComposablePreview.kt
@@ -19,9 +19,9 @@
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.saveable.AmbientSaveableStateRegistry
+import androidx.compose.runtime.saveable.LocalSaveableStateRegistry
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientLifecycleOwner
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.lifecycle.Lifecycle
 
@@ -70,7 +70,7 @@
 @Preview
 @Composable
 private fun LifecyclePreview() {
-    val lifecycleState = AmbientLifecycleOwner.current.lifecycle.currentState
+    val lifecycleState = LocalLifecycleOwner.current.lifecycle.currentState
     if (lifecycleState != Lifecycle.State.RESUMED) throw IllegalArgumentException(
         "Lifecycle state is not resumed. $lifecycleState"
     )
@@ -80,7 +80,7 @@
 @Preview
 @Composable
 private fun SaveableStateRegistryPreview() {
-    if (AmbientSaveableStateRegistry.current == null) throw IllegalArgumentException(
+    if (LocalSaveableStateRegistry.current == null) throw IllegalArgumentException(
         "SaveableStateRegistry is not provided"
     )
     Text("SaveableStateRegistry preview")
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/InlineClassConverterTest.kt b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/InlineClassConverterTest.kt
index 06e692b..57ae98f 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/InlineClassConverterTest.kt
+++ b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/InlineClassConverterTest.kt
@@ -19,11 +19,12 @@
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.tooling.Group
-import androidx.compose.ui.tooling.Inspectable
 import androidx.compose.ui.tooling.CompositionDataRecord
+import androidx.compose.ui.tooling.Inspectable
 import androidx.compose.ui.tooling.ToolingTest
-import androidx.compose.ui.tooling.asTree
+import androidx.compose.ui.tooling.data.Group
+import androidx.compose.ui.tooling.data.UiToolingDataApi
+import androidx.compose.ui.tooling.data.asTree
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.sp
@@ -35,6 +36,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
+@OptIn(UiToolingDataApi::class)
 class InlineClassConverterTest : ToolingTest() {
 
     @Test
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTreeTest.kt b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTreeTest.kt
index 8305e32..292877a 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTreeTest.kt
+++ b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTreeTest.kt
@@ -37,17 +37,18 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.node.OwnedLayer
+import androidx.compose.ui.layout.GraphicLayerInfo
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.tooling.CompositionDataRecord
-import androidx.compose.ui.tooling.Group
 import androidx.compose.ui.tooling.Inspectable
 import androidx.compose.ui.tooling.R
 import androidx.compose.ui.tooling.ToolingTest
-import androidx.compose.ui.tooling.asTree
-import androidx.compose.ui.tooling.position
+import androidx.compose.ui.tooling.data.Group
+import androidx.compose.ui.tooling.data.UiToolingDataApi
+import androidx.compose.ui.tooling.data.asTree
+import androidx.compose.ui.tooling.data.position
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -67,6 +68,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = 29) // Render id is not returned for api < 29
+@OptIn(UiToolingDataApi::class)
 class LayoutInspectorTreeTest : ToolingTest() {
     private lateinit var density: Density
     private lateinit var view: View
@@ -565,7 +567,7 @@
     private fun dumpGroup(group: Group, indent: Int) {
         val position = group.position?.let { "\"$it\"" } ?: "null"
         val box = group.box
-        val id = group.modifierInfo.mapNotNull { (it.extra as? OwnedLayer)?.layerId }
+        val id = group.modifierInfo.mapNotNull { (it.extra as? GraphicLayerInfo)?.layerId }
             .singleOrNull() ?: 0
         println(
             "\"${"  ".repeat(indent)}\", ${group.javaClass.simpleName}, \"${group.name}\", " +
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/OffsetInformationTest.kt b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/OffsetInformationTest.kt
index 59635c8..4b0c595 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/OffsetInformationTest.kt
+++ b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/inspector/OffsetInformationTest.kt
@@ -16,11 +16,12 @@
 
 package androidx.compose.ui.tooling.inspector
 
-import androidx.compose.ui.tooling.Group
-import androidx.compose.ui.tooling.Inspectable
 import androidx.compose.ui.tooling.CompositionDataRecord
+import androidx.compose.ui.tooling.Inspectable
 import androidx.compose.ui.tooling.ToolingTest
-import androidx.compose.ui.tooling.asTree
+import androidx.compose.ui.tooling.data.Group
+import androidx.compose.ui.tooling.data.UiToolingDataApi
+import androidx.compose.ui.tooling.data.asTree
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import junit.framework.TestCase
@@ -29,6 +30,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
+@OptIn(UiToolingDataApi::class)
 class OffsetInformationTest : ToolingTest() {
     @Test
     fun testOffset() {
@@ -67,6 +69,7 @@
     }
 }
 
+@OptIn(UiToolingDataApi::class)
 fun Group.all(): Iterable<Group> {
     val result = mutableListOf<Group>()
     fun appendAll(group: Group) {
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/ComposeViewAdapterTest.kt b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/ComposeViewAdapterTest.kt
index 05bbd6a..030a3d0 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/ComposeViewAdapterTest.kt
+++ b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/ComposeViewAdapterTest.kt
@@ -20,6 +20,7 @@
 import android.os.Bundle
 import androidx.compose.animation.core.InternalAnimationApi
 import androidx.compose.ui.tooling.compositionCount
+import androidx.compose.ui.tooling.data.UiToolingDataApi
 import androidx.compose.ui.tooling.preview.animation.PreviewAnimationClock
 import androidx.compose.ui.tooling.test.R
 import org.junit.Assert.assertArrayEquals
@@ -34,6 +35,7 @@
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicBoolean
 
+@OptIn(UiToolingDataApi::class)
 class ComposeViewAdapterTest {
     @Suppress("DEPRECATION")
     @get:Rule
diff --git a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/animation/PreviewAnimationClockTest.kt b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/animation/PreviewAnimationClockTest.kt
index 2664177..08d726d 100644
--- a/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/animation/PreviewAnimationClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidTest/java/androidx/compose/ui/tooling/preview/animation/PreviewAnimationClockTest.kt
@@ -32,6 +32,7 @@
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 
@@ -58,6 +59,7 @@
         assertEquals(2, callbackCalledCount)
     }
 
+    @Ignore("b/178910730")
     @Test
     fun getAnimatedPropertiesReturnsValuesAtCurrentTime() {
         var rotationAnimation: ComposeAnimation? = null
@@ -90,6 +92,7 @@
         assertEquals(Color.Blue, color.value)
     }
 
+    @Ignore("b/178910730")
     @Test
     fun maxDurationReturnsLongestDuration() {
         // When there are no animations, we should return an invalid duration.
@@ -99,6 +102,7 @@
             setUpOffsetScenario() // 800ms
         }
         composeRule.waitForIdle()
+        testClock.setClockTime(0L)
 
         assertEquals(1000, testClock.getMaxDuration())
     }
@@ -226,7 +230,6 @@
             it.states.contains(RotationColor.RC1)
         }
         testClock.updateFromAndToStates(animation, RotationColor.RC1, RotationColor.RC3)
-        testClock.setClockTime(0)
         return animation
     }
 
@@ -250,7 +253,6 @@
         testClock.trackTransition(transition as Transition<Any>)
         val animation = testClock.trackedTransitions.keys.single { it.states.contains(Offset.O1) }
         testClock.updateFromAndToStates(animation, Offset.O1, Offset.O2)
-        testClock.setClockTime(0)
         return animation
     }
 
diff --git a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/Inspectable.kt b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/Inspectable.kt
index dfe12ca..94dba74 100644
--- a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/Inspectable.kt
+++ b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/Inspectable.kt
@@ -21,8 +21,8 @@
 import androidx.compose.runtime.InternalComposeApi
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.currentComposer
-import androidx.compose.runtime.tooling.InspectionTables
-import androidx.compose.ui.platform.InspectionMode
+import androidx.compose.runtime.tooling.LocalInspectionTables
+import androidx.compose.ui.platform.LocalInspectionMode
 import java.util.Collections
 import java.util.WeakHashMap
 
@@ -62,8 +62,8 @@
     val store = (compositionDataRecord as CompositionDataRecordImpl).store
     store.add(currentComposer.compositionData)
     Providers(
-        InspectionMode provides true,
-        InspectionTables provides store,
+        LocalInspectionMode provides true,
+        LocalInspectionTables provides store,
         content = content
     )
 }
@@ -74,7 +74,7 @@
  */
 @Composable
 fun InInspectionModeOnly(content: @Composable () -> Unit) {
-    if (InspectionMode.current) {
+    if (LocalInspectionMode.current) {
         content()
     }
 }
diff --git a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTree.kt b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTree.kt
index b8c2c3b..dc7ad77 100644
--- a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTree.kt
+++ b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/LayoutInspectorTree.kt
@@ -20,14 +20,14 @@
 import androidx.compose.runtime.CompositionData
 import androidx.compose.runtime.InternalComposeApi
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.layout.GraphicLayerInfo
 import androidx.compose.ui.layout.LayoutInfo
-import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.OwnedLayer
-import androidx.compose.ui.tooling.Group
-import androidx.compose.ui.tooling.NodeGroup
-import androidx.compose.ui.tooling.ParameterInformation
 import androidx.compose.ui.tooling.R
-import androidx.compose.ui.tooling.asTree
+import androidx.compose.ui.tooling.data.Group
+import androidx.compose.ui.tooling.data.NodeGroup
+import androidx.compose.ui.tooling.data.ParameterInformation
+import androidx.compose.ui.tooling.data.UiToolingDataApi
+import androidx.compose.ui.tooling.data.asTree
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.toSize
@@ -143,21 +143,21 @@
         return when (trees.size) {
             0 -> listOf()
             1 -> addTree(mutableListOf(), trees.single())
-            else -> stitchTreesByLayoutNode(trees)
+            else -> stitchTreesByLayoutInfo(trees)
         }
     }
 
     /**
-     * Stitch separate trees together using the [LayoutNode]s found in the [CompositionData]s.
+     * Stitch separate trees together using the [LayoutInfo]s found in the [CompositionData]s.
      *
      * Some constructs in Compose (e.g. ModalDrawerLayout) will result is multiple
      * [CompositionData]s. This code will attempt to stitch the resulting [InspectorNode] trees
-     * together by looking at the parent of each [LayoutNode].
+     * together by looking at the parent of each [LayoutInfo].
      *
      * If this algorithm is successful the result of this function will be a list with a single
      * tree.
      */
-    private fun stitchTreesByLayoutNode(trees: List<MutableInspectorNode>): List<InspectorNode> {
+    private fun stitchTreesByLayoutInfo(trees: List<MutableInspectorNode>): List<InspectorNode> {
         val layoutToTreeMap = IdentityHashMap<LayoutInfo, MutableInspectorNode>()
         trees.forEach { tree -> tree.layoutNodes.forEach { layoutToTreeMap[it] = tree } }
         trees.forEach { tree ->
@@ -246,13 +246,14 @@
         return out
     }
 
-    @OptIn(InternalComposeApi::class)
+    @OptIn(InternalComposeApi::class, UiToolingDataApi::class)
     private fun convert(table: CompositionData): MutableInspectorNode {
         val fakeParent = newNode()
         addToParent(fakeParent, listOf(convert(table.asTree())), buildFakeChildNodes = true)
         return fakeParent
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun convert(group: Group): MutableInspectorNode {
         val children = convertChildren(group)
         val parent = parse(group)
@@ -260,6 +261,7 @@
         return parent
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun convertChildren(group: Group): List<MutableInspectorNode> {
         if (group.children.isEmpty()) {
             return emptyList()
@@ -314,6 +316,7 @@
         parentNode.id = if (parentNode.id == 0L && nodeId != null) nodeId else parentNode.id
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun parse(group: Group): MutableInspectorNode {
         val node = newNode()
         node.id = getRenderNode(group)
@@ -333,6 +336,7 @@
         return node
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun parsePosition(group: Group, node: MutableInspectorNode) {
         val box = group.box
         node.top = box.top
@@ -341,11 +345,12 @@
         node.width = box.right - box.left
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun parseLayoutInfo(group: Group, node: MutableInspectorNode) {
         val layoutInfo = (group as? NodeGroup)?.node as? LayoutInfo ?: return
         node.layoutNodes.add(layoutInfo)
         val box = group.box
-        val size = box.toSize().toSize()
+        val size = box.size.toSize()
         val coordinates = layoutInfo.coordinates
         val topLeft = toIntOffset(coordinates.localToWindow(Offset.Zero))
         val topRight = toIntOffset(coordinates.localToWindow(Offset(size.width, 0f)))
@@ -373,6 +378,7 @@
     private fun markUnwanted(node: MutableInspectorNode): MutableInspectorNode =
         node.apply { markUnwanted() }
 
+    @OptIn(UiToolingDataApi::class)
     private fun parseCallLocation(group: Group, node: MutableInspectorNode): Boolean {
         val location = group.location ?: return false
         val fileName = location.sourceFile ?: return false
@@ -384,21 +390,25 @@
         return true
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun getRenderNode(group: Group): Long =
         group.modifierInfo.asSequence()
             .map { it.extra }
-            .filterIsInstance<OwnedLayer>()
+            .filterIsInstance<GraphicLayerInfo>()
             .map { it.layerId }
             .firstOrNull() ?: 0
 
+    @OptIn(UiToolingDataApi::class)
     private fun addParameters(parameters: List<ParameterInformation>, node: MutableInspectorNode) =
         parameters.forEach { addParameter(it, node) }
 
+    @OptIn(UiToolingDataApi::class)
     private fun addParameter(parameter: ParameterInformation, node: MutableInspectorNode) {
         val castedValue = castValue(parameter)
         node.parameters.add(RawParameter(parameter.name, castedValue))
     }
 
+    @OptIn(UiToolingDataApi::class)
     private fun castValue(parameter: ParameterInformation): Any? {
         val value = parameter.value ?: return null
         if (parameter.inlineClass == null) return value
diff --git a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/preview/ComposeViewAdapter.kt b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/preview/ComposeViewAdapter.kt
index 92237c6..2eb7758 100644
--- a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/preview/ComposeViewAdapter.kt
+++ b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/preview/ComposeViewAdapter.kt
@@ -37,16 +37,17 @@
 import androidx.compose.runtime.snapshots.Snapshot
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.platform.AmbientFontLoader
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalFontLoader
 import androidx.compose.ui.platform.ViewRootForTest
 import androidx.compose.ui.tooling.CompositionDataRecord
-import androidx.compose.ui.tooling.Group
 import androidx.compose.ui.tooling.Inspectable
-import androidx.compose.ui.tooling.SourceLocation
-import androidx.compose.ui.tooling.asTree
+import androidx.compose.ui.tooling.data.Group
+import androidx.compose.ui.tooling.data.SourceLocation
+import androidx.compose.ui.tooling.data.UiToolingDataApi
+import androidx.compose.ui.tooling.data.asTree
 import androidx.compose.ui.tooling.preview.animation.PreviewAnimationClock
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleRegistry
 import androidx.lifecycle.ViewModelStoreOwner
@@ -67,10 +68,11 @@
  *
  * @suppress
  */
+@OptIn(UiToolingDataApi::class)
 data class ViewInfo(
     val fileName: String,
     val lineNumber: Int,
-    val bounds: IntBounds,
+    val bounds: IntRect,
     val location: SourceLocation?,
     val children: List<ViewInfo>
 ) {
@@ -105,6 +107,7 @@
  * @suppress
  */
 @Suppress("unused")
+@OptIn(UiToolingDataApi::class)
 internal class ComposeViewAdapter : FrameLayout {
     private val TAG = "ComposeViewAdapter"
 
@@ -384,7 +387,7 @@
         // We need to replace the FontResourceLoader to avoid using ResourcesCompat.
         // ResourcesCompat can not load fonts within Layoutlib and, since Layoutlib always runs
         // the latest version, we do not need it.
-        Providers(AmbientFontLoader provides LayoutlibFontResourceLoader(context)) {
+        Providers(LocalFontLoader provides LayoutlibFontResourceLoader(context)) {
             Inspectable(slotTableRecord, content)
         }
     }
diff --git a/compose/ui/ui-unit/api/api_lint.ignore b/compose/ui/ui-unit/api/api_lint.ignore
deleted file mode 100644
index c8c61e3..0000000
--- a/compose/ui/ui-unit/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-MissingNullability: androidx.compose.ui.unit.Uptime#toString-impl(long):
-    Missing nullability on method `toString-impl` return
-MissingNullability: androidx.compose.ui.unit.Velocity#toString-impl(long):
-    Missing nullability on method `toString-impl` return
diff --git a/compose/ui/ui-unit/api/current.txt b/compose/ui/ui-unit/api/current.txt
index fc5ee9b..f4749cc 100644
--- a/compose/ui/ui-unit/api/current.txt
+++ b/compose/ui/ui-unit/api/current.txt
@@ -65,11 +65,12 @@
   @androidx.compose.runtime.Immutable public interface Density {
     method public float getDensity();
     method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
     method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
     method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
-    method @androidx.compose.runtime.Stable public default int toIntPx--R2X_6o(long);
-    method @androidx.compose.runtime.Stable public default int toIntPx-0680j_4(float);
+    method @Deprecated @androidx.compose.runtime.Stable public default int toIntPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
     method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.Bounds);
@@ -158,33 +159,6 @@
     property public final long Zero;
   }
 
-  @androidx.compose.runtime.Immutable public final class IntBounds {
-    ctor public IntBounds(int left, int top, int right, int bottom);
-    method public int component1();
-    method public int component2();
-    method public int component3();
-    method public int component4();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.IntBounds copy(int left, int top, int right, int bottom);
-    method public int getBottom();
-    method public int getLeft();
-    method public int getRight();
-    method public int getTop();
-    property public final int bottom;
-    property public final int left;
-    property public final int right;
-    property public final int top;
-  }
-
-  public final class IntBoundsKt {
-    method @androidx.compose.runtime.Stable public static inline androidx.compose.ui.unit.IntBounds IntBounds-TtQJ-B4(long topLeft, long size);
-    method @androidx.compose.runtime.Stable public static inline long center(androidx.compose.ui.unit.IntBounds);
-    method public static inline int getHeight(androidx.compose.ui.unit.IntBounds);
-    method public static inline int getWidth(androidx.compose.ui.unit.IntBounds);
-    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntBounds toBounds-ozmzZPI(long);
-    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.IntBounds);
-    method @androidx.compose.runtime.Stable public static long toSize(androidx.compose.ui.unit.IntBounds);
-  }
-
   @androidx.compose.runtime.Immutable public final inline class IntOffset {
     ctor public IntOffset();
     method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
@@ -222,6 +196,73 @@
     method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(long);
   }
 
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
   @androidx.compose.runtime.Immutable public final inline class IntSize {
     ctor public IntSize();
     method @androidx.compose.runtime.Stable public static inline operator int component1-impl(long $this);
@@ -247,6 +288,7 @@
     method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
     method public static long getCenter-ozmzZPI(long);
     method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
     method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(long);
   }
 
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_current.txt b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
index fc5ee9b..f4749cc 100644
--- a/compose/ui/ui-unit/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
@@ -65,11 +65,12 @@
   @androidx.compose.runtime.Immutable public interface Density {
     method public float getDensity();
     method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
     method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
     method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
-    method @androidx.compose.runtime.Stable public default int toIntPx--R2X_6o(long);
-    method @androidx.compose.runtime.Stable public default int toIntPx-0680j_4(float);
+    method @Deprecated @androidx.compose.runtime.Stable public default int toIntPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
     method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.Bounds);
@@ -158,33 +159,6 @@
     property public final long Zero;
   }
 
-  @androidx.compose.runtime.Immutable public final class IntBounds {
-    ctor public IntBounds(int left, int top, int right, int bottom);
-    method public int component1();
-    method public int component2();
-    method public int component3();
-    method public int component4();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.IntBounds copy(int left, int top, int right, int bottom);
-    method public int getBottom();
-    method public int getLeft();
-    method public int getRight();
-    method public int getTop();
-    property public final int bottom;
-    property public final int left;
-    property public final int right;
-    property public final int top;
-  }
-
-  public final class IntBoundsKt {
-    method @androidx.compose.runtime.Stable public static inline androidx.compose.ui.unit.IntBounds IntBounds-TtQJ-B4(long topLeft, long size);
-    method @androidx.compose.runtime.Stable public static inline long center(androidx.compose.ui.unit.IntBounds);
-    method public static inline int getHeight(androidx.compose.ui.unit.IntBounds);
-    method public static inline int getWidth(androidx.compose.ui.unit.IntBounds);
-    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntBounds toBounds-ozmzZPI(long);
-    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.IntBounds);
-    method @androidx.compose.runtime.Stable public static long toSize(androidx.compose.ui.unit.IntBounds);
-  }
-
   @androidx.compose.runtime.Immutable public final inline class IntOffset {
     ctor public IntOffset();
     method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
@@ -222,6 +196,73 @@
     method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(long);
   }
 
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
   @androidx.compose.runtime.Immutable public final inline class IntSize {
     ctor public IntSize();
     method @androidx.compose.runtime.Stable public static inline operator int component1-impl(long $this);
@@ -247,6 +288,7 @@
     method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
     method public static long getCenter-ozmzZPI(long);
     method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
     method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(long);
   }
 
diff --git a/compose/ui/ui-unit/api/restricted_current.txt b/compose/ui/ui-unit/api/restricted_current.txt
index f95ad8b..249983c 100644
--- a/compose/ui/ui-unit/api/restricted_current.txt
+++ b/compose/ui/ui-unit/api/restricted_current.txt
@@ -65,11 +65,12 @@
   @androidx.compose.runtime.Immutable public interface Density {
     method public float getDensity();
     method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
     method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
     method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
-    method @androidx.compose.runtime.Stable public default int toIntPx--R2X_6o(long);
-    method @androidx.compose.runtime.Stable public default int toIntPx-0680j_4(float);
+    method @Deprecated @androidx.compose.runtime.Stable public default int toIntPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
     method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.Bounds);
@@ -158,33 +159,6 @@
     property public final long Zero;
   }
 
-  @androidx.compose.runtime.Immutable public final class IntBounds {
-    ctor public IntBounds(int left, int top, int right, int bottom);
-    method public int component1();
-    method public int component2();
-    method public int component3();
-    method public int component4();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.IntBounds copy(int left, int top, int right, int bottom);
-    method public int getBottom();
-    method public int getLeft();
-    method public int getRight();
-    method public int getTop();
-    property public final int bottom;
-    property public final int left;
-    property public final int right;
-    property public final int top;
-  }
-
-  public final class IntBoundsKt {
-    method @androidx.compose.runtime.Stable public static inline androidx.compose.ui.unit.IntBounds IntBounds-TtQJ-B4(long topLeft, long size);
-    method @androidx.compose.runtime.Stable public static inline long center(androidx.compose.ui.unit.IntBounds);
-    method public static inline int getHeight(androidx.compose.ui.unit.IntBounds);
-    method public static inline int getWidth(androidx.compose.ui.unit.IntBounds);
-    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntBounds toBounds-ozmzZPI(long);
-    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.IntBounds);
-    method @androidx.compose.runtime.Stable public static long toSize(androidx.compose.ui.unit.IntBounds);
-  }
-
   @androidx.compose.runtime.Immutable public final inline class IntOffset {
     ctor public IntOffset();
     method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
@@ -222,6 +196,73 @@
     method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(long);
   }
 
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
   @androidx.compose.runtime.Immutable public final inline class IntSize {
     ctor public IntSize();
     method @androidx.compose.runtime.Stable public static inline operator int component1-impl(long $this);
@@ -247,6 +288,7 @@
     method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
     method public static long getCenter-ozmzZPI(long);
     method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
     method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(long);
   }
 
diff --git a/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DensitySample.kt b/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DensitySample.kt
index 983599c..801540d 100644
--- a/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DensitySample.kt
+++ b/compose/ui/ui-unit/samples/src/main/java/androidx/compose/ui/unit/samples/DensitySample.kt
@@ -18,12 +18,12 @@
 
 import androidx.annotation.Sampled
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
 @Sampled
 @Composable
 @Suppress("UNUSED_VARIABLE")
 fun WithDensitySample() {
-    val sizeInPx = with(AmbientDensity.current) { 16.dp.toPx() }
+    val sizeInPx = with(LocalDensity.current) { 16.dp.toPx() }
 }
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
index 2ba0d4a..dfa76e7 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
@@ -66,11 +66,18 @@
      * Convert [Dp] to [Int] by rounding
      */
     @Stable
-    fun Dp.toIntPx(): Int {
+    fun Dp.roundToPx(): Int {
         val px = toPx()
         return if (px.isInfinite()) Constraints.Infinity else px.roundToInt()
     }
 
+    @Stable
+    @Deprecated(
+        "toIntPx was renamed to roundToPx.",
+        ReplaceWith("roundToPx()", "androidx.compose.ui.unit.roundToPx")
+    )
+    fun Dp.toIntPx() = roundToPx()
+
     /**
      * Convert [Dp] to Sp. Sp is used for font size, etc.
      */
@@ -91,7 +98,7 @@
      * Convert Sp to [Int] by rounding
      */
     @Stable
-    fun TextUnit.toIntPx(): Int = toPx().roundToInt()
+    fun TextUnit.roundToPx(): Int = toPx().roundToInt()
 
     /**
      * Convert Sp to [Dp].
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntBounds.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntBounds.kt
deleted file mode 100644
index e1562e7..0000000
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntBounds.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("NOTHING_TO_INLINE")
-
-package androidx.compose.ui.unit
-
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
-import androidx.compose.ui.geometry.Rect
-
-/**
- * A four dimensional bounds holder defined by integer pixels.
- */
-@Immutable
-data class IntBounds(
-    val left: Int,
-    val top: Int,
-    val right: Int,
-    val bottom: Int
-)
-
-@Stable
-inline fun IntBounds(topLeft: IntOffset, size: IntSize) =
-    IntBounds(
-        left = topLeft.x,
-        top = topLeft.y,
-        right = topLeft.x + size.width,
-        bottom = topLeft.y + size.height
-    )
-
-/**
- * The width of this IntBounds in integer pixels.
- */
-@Stable
-inline val IntBounds.width: Int get() = right - left
-
-/**
- * The height of this IntBounds in integer pixels.
- */
-@Stable
-inline val IntBounds.height: Int get() = bottom - top
-
-/**
- * Returns the [IntOffset] of the center of the [IntBounds].
- */
-@Stable
-inline fun IntBounds.center(): IntOffset {
-    return IntOffset((left + right) / 2, (top + bottom) / 2)
-}
-
-/**
- * Convert an [IntBounds] to an [IntSize].
- */
-@Stable
-fun IntBounds.toSize(): IntSize {
-    return IntSize(width, height)
-}
-
-/**
- * Convert an [IntSize] to an [IntBounds]. The left and top are 0 and the right and bottom
- * are the width and height, respectively.
- */
-@Stable
-fun IntSize.toBounds(): IntBounds {
-    return IntBounds(0, 0, width, height)
-}
-
-/**
- * Convert an [IntBounds] to a [Rect].
- */
-@Stable
-fun IntBounds.toRect(): Rect {
-    return Rect(
-        left.toFloat(),
-        top.toFloat(),
-        right.toFloat(),
-        bottom.toFloat()
-    )
-}
\ No newline at end of file
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt
new file mode 100644
index 0000000..b7b5c9d
--- /dev/null
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntRect.kt
@@ -0,0 +1,310 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.compose.ui.unit
+
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.translate
+import androidx.compose.ui.util.lerp
+import kotlin.math.absoluteValue
+
+/**
+ * An immutable, 2D, axis-aligned, integer bounds rectangle whose coordinates are relative
+ * to a given origin.
+ */
+@Immutable
+data class IntRect(
+    /**
+     * The offset of the left edge of this rectangle from the x axis.
+     */
+    @Stable
+    val left: Int,
+
+    /**
+     * The offset of the top edge of this rectangle from the y axis.
+     */
+    @Stable
+    val top: Int,
+
+    /**
+     * The offset of the right edge of this rectangle from the x axis.
+     */
+    @Stable
+    val right: Int,
+
+    /**
+     * The offset of the bottom edge of this rectangle from the y axis.
+     */
+    @Stable
+    val bottom: Int
+) {
+    companion object {
+
+        /** A rectangle with left, top, right, and bottom edges all at zero. */
+        @Stable
+        val Zero: IntRect = IntRect(0, 0, 0, 0)
+    }
+
+    /** The distance between the left and right edges of this rectangle. */
+    @Stable
+    val width: Int
+        get() { return right - left }
+
+    /** The distance between the top and bottom edges of this rectangle. */
+    @Stable
+    val height: Int
+        get() { return bottom - top }
+
+    /**
+     * The distance between the upper-left corner and the lower-right corner of
+     * this rectangle.
+     */
+    @Stable
+    val size: IntSize
+        get() = IntSize(width, height)
+
+    /**
+     * Whether this rectangle encloses a non-zero area. Negative areas are
+     * considered empty.
+     */
+    @Stable
+    val isEmpty: Boolean
+        get() = left >= right || top >= bottom
+
+    /**
+     * Returns a new rectangle translated by the given offset.
+     *
+     * To translate a rectangle by separate x and y components rather than by an
+     * [Offset], consider [translate].
+     */
+    @Stable
+    fun translate(offset: IntOffset): IntRect {
+        return IntRect(left + offset.x, top + offset.y, right + offset.x, bottom + offset.y)
+    }
+
+    /**
+     * Returns a new rectangle with translateX added to the x components and
+     * translateY added to the y components.
+     */
+    @Stable
+    fun translate(translateX: Int, translateY: Int): IntRect {
+        return IntRect(
+            left + translateX,
+            top + translateY,
+            right + translateX,
+            bottom + translateY
+        )
+    }
+
+    /** Returns a new rectangle with edges moved outwards by the given delta. */
+    @Stable
+    fun inflate(delta: Int): IntRect {
+        return IntRect(left - delta, top - delta, right + delta, bottom + delta)
+    }
+
+    /** Returns a new rectangle with edges moved inwards by the given delta. */
+    @Stable
+    fun deflate(delta: Int): IntRect = inflate(-delta)
+
+    /**
+     * Returns a new rectangle that is the intersection of the given
+     * rectangle and this rectangle. The two rectangles must overlap
+     * for this to be meaningful. If the two rectangles do not overlap,
+     * then the resulting IntRect will have a negative width or height.
+     */
+    @Stable
+    fun intersect(other: IntRect): IntRect {
+        return IntRect(
+            kotlin.math.max(left, other.left),
+            kotlin.math.max(top, other.top),
+            kotlin.math.min(right, other.right),
+            kotlin.math.min(bottom, other.bottom)
+        )
+    }
+
+    /** Whether `other` has a nonzero area of overlap with this rectangle. */
+    fun overlaps(other: IntRect): Boolean {
+        if (right <= other.left || other.right <= left)
+            return false
+        if (bottom <= other.top || other.bottom <= top)
+            return false
+        return true
+    }
+
+    /**
+     * The lesser of the magnitudes of the [width] and the [height] of this
+     * rectangle.
+     */
+    val minDimension: Int
+        get() = kotlin.math.min(width.absoluteValue, height.absoluteValue)
+
+    /**
+     * The greater of the magnitudes of the [width] and the [height] of this
+     * rectangle.
+     */
+    val maxDimension: Int
+        get() = kotlin.math.max(width.absoluteValue, height.absoluteValue)
+
+    /**
+     * The offset to the intersection of the top and left edges of this rectangle.
+     */
+    val topLeft: IntOffset
+        get() = IntOffset(left, top)
+
+    /**
+     * The offset to the center of the top edge of this rectangle.
+     */
+    val topCenter: IntOffset
+        get() = IntOffset(left + width / 2, top)
+
+    /**
+     * The offset to the intersection of the top and right edges of this rectangle.
+     */
+    val topRight: IntOffset
+        get() = IntOffset(right, top)
+
+    /**
+     * The offset to the center of the left edge of this rectangle.
+     */
+    val centerLeft: IntOffset
+        get() = IntOffset(left, top + height / 2)
+
+    /**
+     * The offset to the point halfway between the left and right and the top and
+     * bottom edges of this rectangle.
+     *
+     * See also [IntSize.center].
+     */
+    val center: IntOffset
+        get() = IntOffset(left + width / 2, top + height / 2)
+
+    /**
+     * The offset to the center of the right edge of this rectangle.
+     */
+    val centerRight: IntOffset
+        get() = IntOffset(right, top + height / 2)
+
+    /**
+     * The offset to the intersection of the bottom and left edges of this rectangle.
+     */
+    val bottomLeft: IntOffset
+        get() = IntOffset(left, bottom)
+
+    /**
+     * The offset to the center of the bottom edge of this rectangle.
+     */
+    val bottomCenter: IntOffset
+        get() { return IntOffset(left + width / 2, bottom) }
+
+    /**
+     * The offset to the intersection of the bottom and right edges of this rectangle.
+     */
+    val bottomRight: IntOffset
+        get() { return IntOffset(right, bottom) }
+
+    /**
+     * Whether the point specified by the given offset (which is assumed to be
+     * relative to the origin) lies between the left and right and the top and
+     * bottom edges of this rectangle.
+     *
+     * Rectangles include their top and left edges but exclude their bottom and
+     * right edges.
+     */
+    fun contains(offset: IntOffset): Boolean {
+        return offset.x >= left && offset.x < right && offset.y >= top && offset.y < bottom
+    }
+
+    override fun toString() = "IntRect.fromLTRB(" +
+        "$left, " +
+        "$top, " +
+        "$right, " +
+        "$bottom)"
+}
+
+/**
+ * Construct a rectangle from its left and top edges as well as its width and height.
+ * @param offset Offset to represent the top and left parameters of the Rect
+ * @param size Size to determine the width and height of this [IntRect].
+ * @return Rect with [IntRect.left] and [IntRect.top] configured to [IntOffset.x] and
+ * [IntOffset.y] as [IntRect.right] and [IntRect.bottom] to [IntOffset.x] + [IntSize.width] and
+ * [IntOffset.y] + [IntSize.height] respectively
+ */
+@Stable
+fun IntRect(offset: IntOffset, size: IntSize) =
+    IntRect(
+        left = offset.x,
+        top = offset.y,
+        right = offset.x + size.width,
+        bottom = offset.y + size.height
+    )
+
+/**
+ * Construct the smallest rectangle that encloses the given offsets, treating
+ * them as vectors from the origin.
+ * @param topLeft Offset representing the left and top edges of the rectangle
+ * @param bottomRight Offset representing the bottom and right edges of the rectangle
+ */
+@Stable
+fun IntRect(topLeft: IntOffset, bottomRight: IntOffset): IntRect =
+    IntRect(
+        topLeft.x,
+        topLeft.y,
+        bottomRight.x,
+        bottomRight.y
+    )
+
+/**
+ * Construct a rectangle that bounds the given circle
+ * @param center Offset that represents the center of the circle
+ * @param radius Radius of the circle to enclose
+ */
+@Stable
+fun IntRect(center: IntOffset, radius: Int): IntRect =
+    IntRect(
+        center.x - radius,
+        center.y - radius,
+        center.x + radius,
+        center.y + radius
+    )
+
+/**
+ * Linearly interpolate between two rectangles.
+ *
+ * The [fraction] argument represents position on the timeline, with 0.0 meaning
+ * that the interpolation has not started, returning [start] (or something
+ * equivalent to [start]), 1.0 meaning that the interpolation has finished,
+ * returning [stop] (or something equivalent to [stop]), and values in between
+ * meaning that the interpolation is at the relevant point on the timeline
+ * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
+ * 1.0, so negative values and values greater than 1.0 are valid (and can
+ * easily be generated by curves).
+ *
+ * Values for [fraction] are usually obtained from an [Animation<Float>], such as
+ * an `AnimationController`.
+ */
+@Stable
+fun lerp(start: IntRect, stop: IntRect, fraction: Float): IntRect {
+    return IntRect(
+        lerp(start.left, stop.left, fraction),
+        lerp(start.top, stop.top, fraction),
+        lerp(start.right, stop.right, fraction),
+        lerp(start.bottom, stop.bottom, fraction)
+    )
+}
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt
index ec92260..a65577d 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/IntSize.kt
@@ -83,6 +83,14 @@
 operator fun Int.times(size: IntSize) = size * this
 
 /**
+ * Convert a [IntSize] to a [IntRect].
+ */
+@Stable
+fun IntSize.toIntRect(): IntRect {
+    return IntRect(IntOffset.Zero, this)
+}
+
+/**
  * Constructs an [IntSize] from width and height [Int] values.
  */
 @Stable
diff --git a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/IntBoundsTest.kt b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/IntBoundsTest.kt
deleted file mode 100644
index f4d819e..0000000
--- a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/IntBoundsTest.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.unit
-
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class IntBoundsTest {
-    @Test
-    fun boundsWidth() {
-        val bounds = IntBounds(10, 5, 25, 15)
-        Assert.assertEquals(15, bounds.width)
-    }
-
-    @Test
-    fun boundsHeight() {
-        val bounds = IntBounds(10, 5, 25, 15)
-        Assert.assertEquals(10, bounds.height)
-    }
-
-    @Test
-    fun toBounds() {
-        val size = IntSize(15, 10)
-        val bounds = IntBounds(0, 0, 15, 10)
-        Assert.assertEquals(bounds, size.toBounds())
-    }
-
-    @Test
-    fun toSize() {
-        val size = IntSize(15, 10)
-        val bounds = IntBounds(10, 5, 25, 15)
-        Assert.assertEquals(size, bounds.toSize())
-    }
-}
\ No newline at end of file
diff --git a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/IntRectTest.kt b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/IntRectTest.kt
new file mode 100644
index 0000000..34f10c3
--- /dev/null
+++ b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/IntRectTest.kt
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.unit
+
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class IntRectTest {
+    @Test
+    fun `rect created by width and height`() {
+        val r = IntRect(IntOffset(1, 3), IntSize(5, 7))
+        Assert.assertEquals(1, r.left)
+        Assert.assertEquals(3, r.top)
+        Assert.assertEquals(6, r.right)
+        Assert.assertEquals(10, r.bottom)
+    }
+
+    @Test
+    fun `rect intersection`() {
+        val r1 = IntRect(0, 0, 100, 100)
+        val r2 = IntRect(50, 50, 200, 200)
+        val r3 = r1.intersect(r2)
+        Assert.assertEquals(50, r3.left)
+        Assert.assertEquals(50, r3.top)
+        Assert.assertEquals(100, r3.right)
+        Assert.assertEquals(100, r3.bottom)
+        val r4 = r2.intersect(r1)
+        Assert.assertEquals(r3, r4)
+    }
+
+    @Test
+    fun `rect width`() {
+        Assert.assertEquals(210, IntRect(70, 10, 280, 300).width)
+    }
+
+    @Test
+    fun `rect height`() {
+        Assert.assertEquals(290, IntRect(70, 10, 280, 300).height)
+    }
+
+    @Test
+    fun `rect size`() {
+        Assert.assertEquals(
+            IntSize(210, 290),
+            IntRect(70, 10, 280, 300).size
+        )
+    }
+
+    @Test
+    fun `rect isEmpty`() {
+        Assert.assertTrue(IntRect(0, 0, 0, 10).isEmpty)
+        Assert.assertTrue(IntRect(1, 0, 0, 10).isEmpty)
+        Assert.assertTrue(IntRect(0, 1, 10, 0).isEmpty)
+        Assert.assertTrue(IntRect(0, 1, 10, 1).isEmpty)
+
+        Assert.assertFalse(IntRect(0, 1, 2, 3).isEmpty)
+    }
+
+    @Test
+    fun `rect translate IntOffset`() {
+        val shifted = IntRect(0, 5, 10, 15).translate(IntOffset(10, 15))
+        Assert.assertEquals(IntRect(10, 20, 20, 30), shifted)
+    }
+
+    @Test
+    fun `rect translate`() {
+        val translated = IntRect(0, 5, 10, 15).translate(10, 15)
+        Assert.assertEquals(IntRect(10, 20, 20, 30), translated)
+    }
+
+    @Test
+    fun `rect inflate`() {
+        val inflated = IntRect(5, 10, 10, 20).inflate(5)
+        Assert.assertEquals(IntRect(0, 5, 15, 25), inflated)
+    }
+
+    @Test
+    fun `rect deflate`() {
+        val deflated = IntRect(0, 5, 15, 25).deflate(5)
+        Assert.assertEquals(IntRect(5, 10, 10, 20), deflated)
+    }
+
+    @Test
+    fun `rect intersect`() {
+        val intersected = IntRect(0, 0, 20, 20).intersect(
+            IntRect(10, 10, 30, 30)
+        )
+        Assert.assertEquals(IntRect(10, 10, 20, 20), intersected)
+    }
+
+    @Test
+    fun `rect overlap`() {
+        val rect1 = IntRect(0, 5, 10, 15)
+        val rect2 = IntRect(5, 10, 15, 20)
+        Assert.assertTrue(rect1.overlaps(rect2))
+        Assert.assertTrue(rect2.overlaps(rect1))
+    }
+
+    @Test
+    fun `rect does not overlap`() {
+        val rect1 = IntRect(0, 5, 10, 15)
+        val rect2 = IntRect(10, 5, 20, 15)
+        Assert.assertFalse(rect1.overlaps(rect2))
+        Assert.assertFalse(rect2.overlaps(rect1))
+    }
+
+    @Test
+    fun `rect minDimension`() {
+        val rect = IntRect(0, 5, 100, 25)
+        Assert.assertEquals(20, rect.minDimension)
+    }
+
+    @Test
+    fun `rect maxDimension`() {
+        val rect = IntRect(0, 5, 100, 25)
+        Assert.assertEquals(100, rect.maxDimension)
+    }
+
+    @Test
+    fun `rect topLeft`() {
+        val rect = IntRect(27, 38, 100, 200)
+        Assert.assertEquals(IntOffset(27, 38), rect.topLeft)
+    }
+
+    @Test
+    fun `rect topCenter`() {
+        val rect = IntRect(100, 15, 200, 300)
+        Assert.assertEquals(IntOffset(150, 15), rect.topCenter)
+    }
+
+    @Test
+    fun `rect topRight`() {
+        val rect = IntRect(100, 15, 200, 300)
+        Assert.assertEquals(IntOffset(200, 15), rect.topRight)
+    }
+
+    @Test
+    fun `rect centerLeft`() {
+        val rect = IntRect(100, 10, 200, 300)
+        Assert.assertEquals(IntOffset(100, 155), rect.centerLeft)
+    }
+
+    @Test
+    fun `rect center`() {
+        val rect = IntRect(100, 10, 200, 300)
+        Assert.assertEquals(IntOffset(150, 155), rect.center)
+    }
+
+    @Test
+    fun `rect centerRight`() {
+        val rect = IntRect(100, 10, 200, 300)
+        Assert.assertEquals(IntOffset(200, 155), rect.centerRight)
+    }
+
+    @Test
+    fun `rect bottomLeft`() {
+        val rect = IntRect(100, 10, 200, 300)
+        Assert.assertEquals(IntOffset(100, 300), rect.bottomLeft)
+    }
+
+    @Test
+    fun `rect bottomCenter`() {
+        val rect = IntRect(100, 10, 200, 300)
+        Assert.assertEquals(IntOffset(150, 300), rect.bottomCenter)
+    }
+
+    @Test
+    fun `rect bottomRight`() {
+        val rect = IntRect(100, 10, 200, 300)
+        Assert.assertEquals(IntOffset(200, 300), rect.bottomRight)
+    }
+
+    @Test
+    fun `rect contains`() {
+        val rect = IntRect(100, 10, 200, 300)
+        val IntOffset = IntOffset(177, 288)
+        Assert.assertTrue(rect.contains(IntOffset))
+    }
+
+    @Test
+    fun `rect does not contain`() {
+        val rect = IntRect(100, 10, 200, 300)
+        val IntOffset1 = IntOffset(201, 150)
+        Assert.assertFalse(rect.contains(IntOffset1))
+
+        val IntOffset2 = IntOffset(200, 301)
+        Assert.assertFalse(rect.contains(IntOffset2))
+    }
+
+    @Test
+    fun `rect from IntOffset and size`() {
+        val offset = IntOffset(220, 300)
+        val size = IntSize(80, 200)
+        Assert.assertEquals(IntRect(220, 300, 300, 500), IntRect(offset, size))
+    }
+
+    @Test
+    fun `rect from topleft and bottomRight`() {
+        val offset1 = IntOffset(27, 38)
+        val offset2 = IntOffset(130, 280)
+        Assert.assertEquals(IntRect(27, 38, 130, 280), IntRect(offset1, offset2))
+    }
+
+    @Test
+    fun `rect from center and radius`() {
+        val offset = IntOffset(100, 50)
+        val radius = 25
+        Assert.assertEquals(IntRect(75, 25, 125, 75), IntRect(offset, radius))
+    }
+
+    @Test
+    fun `rect lerp`() {
+        val rect1 = IntRect(0, 0, 100, 100)
+        val rect2 = IntRect(50, 50, 200, 200)
+
+        Assert.assertEquals(
+            IntRect(25, 25, 150, 150),
+            lerp(rect1, rect2, 0.5f)
+        )
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-util/api/current.txt b/compose/ui/ui-util/api/current.txt
index 7e8527b..2509e77 100644
--- a/compose/ui/ui-util/api/current.txt
+++ b/compose/ui/ui-util/api/current.txt
@@ -15,7 +15,6 @@
   }
 
   public final class JvmMiscHelpersKt {
-    method public static StringBuilder deleteAt(StringBuilder, int index);
     method public static String format(String, java.lang.Object?... args);
   }
 
diff --git a/compose/ui/ui-util/api/public_plus_experimental_current.txt b/compose/ui/ui-util/api/public_plus_experimental_current.txt
index 7e8527b..2509e77 100644
--- a/compose/ui/ui-util/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-util/api/public_plus_experimental_current.txt
@@ -15,7 +15,6 @@
   }
 
   public final class JvmMiscHelpersKt {
-    method public static StringBuilder deleteAt(StringBuilder, int index);
     method public static String format(String, java.lang.Object?... args);
   }
 
diff --git a/compose/ui/ui-util/api/restricted_current.txt b/compose/ui/ui-util/api/restricted_current.txt
index 7e8527b..2509e77 100644
--- a/compose/ui/ui-util/api/restricted_current.txt
+++ b/compose/ui/ui-util/api/restricted_current.txt
@@ -15,7 +15,6 @@
   }
 
   public final class JvmMiscHelpersKt {
-    method public static StringBuilder deleteAt(StringBuilder, int index);
     method public static String format(String, java.lang.Object?... args);
   }
 
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt
index b24fe06..f41a6e8 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt
@@ -17,5 +17,3 @@
 package androidx.compose.ui.util
 
 expect fun String.format(vararg args: Any?): String
-
-expect fun StringBuilder.deleteAt(index: Int): StringBuilder
diff --git a/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt b/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt
index be14a1b..e424471 100644
--- a/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt
+++ b/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt
@@ -17,8 +17,3 @@
 package androidx.compose.ui.util
 
 actual fun String.format(vararg args: Any?): String = java.lang.String.format(this, *args)
-
-actual fun StringBuilder.deleteAt(index: Int): StringBuilder {
-    this.deleteCharAt(index)
-    return this
-}
diff --git a/compose/ui/ui-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt b/compose/ui/ui-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt
index c7b8e9e..5677a58 100644
--- a/compose/ui/ui-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt
+++ b/compose/ui/ui-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -58,7 +58,7 @@
         }
 
         val size = 50.dp
-        val sizePx = with(rule.density) { size.toIntPx() }
+        val sizePx = with(rule.density) { size.roundToPx() }
         rule.onNodeWithTag("layout").captureToImage().assertPixels(IntSize(sizePx, sizePx * 2)) {
             if (it.y < sizePx) Color.Blue else Color.Black
         }
@@ -75,7 +75,7 @@
         }
 
         val size = 50.dp
-        val sizePx = with(rule.density) { size.toIntPx() }
+        val sizePx = with(rule.density) { size.roundToPx() }
         rule.onNodeWithTag("layout").captureToImage()
             .assertPixels(IntSize(sizePx, sizePx * 2)) {
                 if (it.y < sizePx) Color.Blue else color.value
@@ -93,8 +93,8 @@
         rule.setContent {
             val size = 50.dp
             val density = Density(3f)
-            val sizeIpx = with(density) { size.toIntPx() }
-            Providers(AmbientDensity provides density) {
+            val sizeIpx = with(density) { size.roundToPx() }
+            Providers(LocalDensity provides density) {
                 AndroidViewBinding(
                     TestLayoutBinding::inflate,
                     Modifier.size(size).onGloballyPositioned {
diff --git a/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt b/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt
index 508137c..1f8694e 100644
--- a/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt
+++ b/compose/ui/ui-viewbinding/src/main/java/androidx/compose/ui/viewinterop/AndroidViewBinding.kt
@@ -20,14 +20,11 @@
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.FrameLayout
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.currentComposer
-import androidx.compose.runtime.ComposeNode
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.materialize
-import androidx.compose.ui.node.UiApplier
-import androidx.compose.ui.platform.AmbientContext
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.node.Ref
 import androidx.viewbinding.ViewBinding
 
 /**
@@ -49,47 +46,22 @@
  */
 @Composable
 fun <T : ViewBinding> AndroidViewBinding(
-    bindingBlock: (LayoutInflater, ViewGroup, Boolean) -> T,
+    bindingBlock: (inflater: LayoutInflater, parent: ViewGroup, attachToParent: Boolean) -> T,
     modifier: Modifier = Modifier,
     update: T.() -> Unit = {}
 ) {
-    val context = AmbientContext.current
-    val materialized = currentComposer.materialize(modifier)
-    val density = AmbientDensity.current
-    ComposeNode<ViewBindingHolder<T>, UiApplier>(
-        factory = { ViewBindingHolder<T>(context).also { it.bindingBlock = bindingBlock } },
-        update = {
-            set(materialized) { this.modifier = it }
-            set(density) { this.density = it }
-            set(update) { this.updateBlock = it }
+    val viewBindingRef = remember { Ref<T>() }
+    val viewBlock: (Context) -> View = remember {
+        { context ->
+            val inflater = LayoutInflater.from(context)
+            val viewBinding = bindingBlock(inflater, FrameLayout(context), false)
+            viewBindingRef.value = viewBinding
+            viewBinding.root
         }
+    }
+    AndroidView(
+        viewBlock = viewBlock,
+        modifier = modifier,
+        update = { viewBindingRef.value?.update() }
     )
 }
-
-@OptIn(InternalInteropApi::class)
-internal class ViewBindingHolder<T : ViewBinding>(
-    context: Context
-) : AndroidViewHolder(context) {
-    private var viewBinding: T? = null
-        set(value) {
-            field = value
-            if (value != null) {
-                view = value.root
-            }
-        }
-
-    internal var bindingBlock: ((LayoutInflater, ViewGroup, Boolean) -> T)? = null
-        set(value) {
-            field = value
-            if (value != null) {
-                val layoutParamsParent = (parent as? ViewGroup) ?: this
-                viewBinding = value(LayoutInflater.from(context), layoutParamsParent, false)
-            }
-        }
-
-    internal var updateBlock: (T) -> Unit = {}
-        set(value) {
-            field = value
-            update = { viewBinding?.apply(updateBlock) }
-        }
-}
\ No newline at end of file
diff --git a/compose/ui/ui/api/api_lint.ignore b/compose/ui/ui/api/api_lint.ignore
index 20cc704..c7bc626 100644
--- a/compose/ui/ui/api/api_lint.ignore
+++ b/compose/ui/ui/api/api_lint.ignore
@@ -3,14 +3,12 @@
     Callback method names must follow the on<Something> style: onStart-k-4lQ0M
 
 
-CallbackName: androidx.compose.ui.gesture.DragObserver:
-    Class should be named DragCallback
-CallbackName: androidx.compose.ui.gesture.LongPressDragObserver:
-    Class should be named LongPressDragCallback
-
-
-ExecutorRegistration: androidx.compose.ui.gesture.ScrollGestureFilterKt#scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation, kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>, boolean):
-    Registration methods should have overload that accepts delivery Executor: `scrollGestureFilter`
+GetterSetterNames: androidx.compose.ui.graphics.GraphicsLayerScope#getClip():
+    Symmetric method for `setClip` must be named `isClip`; was `getClip`
+GetterSetterNames: androidx.compose.ui.input.pointer.ConsumedData#getDownChange():
+    Symmetric method for `setDownChange` must be named `isDownChange`; was `getDownChange`
+GetterSetterNames: androidx.compose.ui.platform.AbstractComposeView#getShowLayoutBounds():
+    Symmetric method for `setShowLayoutBounds` must be named `isShowLayoutBounds`; was `getShowLayoutBounds`
 
 
 ListenerLast: androidx.compose.ui.gesture.ScrollGestureFilterKt#scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation, kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>, boolean) parameter #2:
@@ -49,7 +47,3 @@
     Missing nullability on method `toString-impl` return
 MissingNullability: androidx.compose.ui.layout.Measured#toString-impl(androidx.compose.ui.layout.Placeable) parameter #0:
     Missing nullability on parameter `p` in method `toString-impl`
-
-
-NotCloseable: androidx.compose.ui.node.OwnedLayer:
-    Classes that release resources (destroy()) should implement AutoClosable and CloseGuard: class androidx.compose.ui.node.OwnedLayer
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 7e97814..49ebff6 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -459,34 +459,33 @@
   }
 
   public final class DragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier dragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
+    method @Deprecated public static androidx.compose.ui.Modifier dragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
   }
 
-  public interface DragObserver {
-    method public default void onCancel();
-    method public default long onDrag-k-4lQ0M(long dragDistance);
-    method public default void onStart-k-4lQ0M(long downPosition);
-    method public default void onStop-k-4lQ0M(long velocity);
+  @Deprecated public interface DragObserver {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default long onDrag-k-4lQ0M(long dragDistance);
+    method @Deprecated public default void onStart-k-4lQ0M(long downPosition);
+    method @Deprecated public default void onStop-k-4lQ0M(long velocity);
   }
 
   public final class DragSlopExceededGestureFilterKt {
-    method public static androidx.compose.ui.Modifier dragSlopExceededGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
+    method @Deprecated public static androidx.compose.ui.Modifier dragSlopExceededGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
   }
 
   public final class GestureUtilsKt {
-    method public static boolean anyPointersInBounds-5eFHUEc(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange>, long bounds);
   }
 
   public final class LongPressDragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier longPressDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.LongPressDragObserver longPressDragObserver);
+    method @Deprecated public static androidx.compose.ui.Modifier longPressDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.LongPressDragObserver longPressDragObserver);
   }
 
-  public interface LongPressDragObserver {
-    method public default void onCancel();
-    method public default long onDrag-k-4lQ0M(long dragDistance);
-    method public default void onDragStart();
-    method public default void onLongPress-k-4lQ0M(long pxPosition);
-    method public default void onStop-k-4lQ0M(long velocity);
+  @Deprecated public interface LongPressDragObserver {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default long onDrag-k-4lQ0M(long dragDistance);
+    method @Deprecated public default void onDragStart();
+    method @Deprecated public default void onLongPress-k-4lQ0M(long pxPosition);
+    method @Deprecated public default void onStop-k-4lQ0M(long velocity);
   }
 
   public final class LongPressGestureFilterKt {
@@ -498,25 +497,25 @@
   }
 
   public final class RawDragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier rawDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
+    method @Deprecated public static androidx.compose.ui.Modifier rawDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
   }
 
   public final class RawPressStartGestureFilterKt {
-    method public static androidx.compose.ui.Modifier rawPressStartGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, optional boolean enabled, optional androidx.compose.ui.input.pointer.PointerEventPass executionPass);
+    method @Deprecated public static androidx.compose.ui.Modifier rawPressStartGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, optional boolean enabled, optional androidx.compose.ui.input.pointer.PointerEventPass executionPass);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public interface ScrollCallback {
-    method public default void onCancel();
-    method public default float onScroll(float scrollDistance);
-    method public default void onStart-k-4lQ0M(long downPosition);
-    method public default void onStop(float velocity);
+  @Deprecated public interface ScrollCallback {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default float onScroll(float scrollDistance);
+    method @Deprecated public default void onStart-k-4lQ0M(long downPosition);
+    method @Deprecated public default void onStop(float velocity);
   }
 
   public final class ScrollGestureFilterKt {
-    method public static androidx.compose.ui.Modifier scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback scrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
+    method @Deprecated public static androidx.compose.ui.Modifier scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback scrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
   }
 
   public final class TapGestureFilterKt {
@@ -1710,6 +1709,11 @@
     property public final float value;
   }
 
+  public interface GraphicLayerInfo {
+    method public long getLayerId();
+    property public abstract long layerId;
+  }
+
   public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
     ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
   }
@@ -1977,7 +1981,7 @@
   @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalCoreApi {
   }
 
-  public final class LayoutNode implements androidx.compose.ui.layout.LayoutInfo androidx.compose.ui.layout.Measurable androidx.compose.ui.node.OwnerScope androidx.compose.ui.layout.Remeasurement {
+  public final class LayoutNode implements androidx.compose.ui.layout.LayoutInfo androidx.compose.ui.layout.Measurable androidx.compose.ui.layout.Remeasurement {
     method public void forceRemeasure();
     method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
     method public int getHeight();
@@ -2014,28 +2018,6 @@
     method public int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int h);
   }
 
-  public interface OwnedLayer {
-    method public void destroy();
-    method public void drawLayer(androidx.compose.ui.graphics.Canvas canvas);
-    method public long getLayerId();
-    method public void getMatrix-58bKbWc(float[] matrix);
-    method public void invalidate();
-    method public void move--gyyYBs(long position);
-    method public void resize-ozmzZPI(long size);
-    method public void updateDisplayList();
-    method public void updateLayerProperties-y8e2Zg0(float scaleX, float scaleY, float alpha, float translationX, float translationY, float shadowElevation, float rotationX, float rotationY, float rotationZ, float cameraDistance, long transformOrigin, androidx.compose.ui.graphics.Shape shape, boolean clip, androidx.compose.ui.unit.LayoutDirection layoutDirection);
-    property public abstract long layerId;
-  }
-
-  public interface OwnerScope {
-    method public boolean isValid();
-    property public abstract boolean isValid;
-  }
-
-  public final class OwnerSnapshotObserver {
-    ctor public OwnerSnapshotObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2090,28 +2072,48 @@
   }
 
   public final class AmbientsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.animation.core.AnimationClockObservable> getAmbientAnimationClock();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.autofill.Autofill> getAmbientAutofill();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.autofill.AutofillTree> getAmbientAutofillTree();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.ClipboardManager> getAmbientClipboardManager();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.Density> getAmbientDensity();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.focus.FocusManager> getAmbientFocusManager();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.hapticfeedback.HapticFeedback> getAmbientHapticFeedback();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.LayoutDirection> getAmbientLayoutDirection();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.text.input.TextInputService> getAmbientTextInputService();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.TextToolbar> getAmbientTextToolbar();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.UriHandler> getAmbientUriHandler();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.ViewConfiguration> getAmbientViewConfiguration();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.WindowInfo> getAmbientWindowInfo();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.animation.core.AnimationClockObservable>! getAmbientAnimationClock();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill>! getAmbientAutofill();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree>! getAmbientAutofillTree();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager>! getAmbientClipboardManager();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density>! getAmbientDensity();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager>! getAmbientFocusManager();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.Font.ResourceLoader>! getAmbientFontLoader();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback>! getAmbientHapticFeedback();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection>! getAmbientLayoutDirection();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService>! getAmbientTextInputService();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar>! getAmbientTextToolbar();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler>! getAmbientUriHandler();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration>! getAmbientViewConfiguration();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo>! getAmbientWindowInfo();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.animation.core.AnimationClockObservable> getLocalAnimationClock();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
   }
 
   public final class AndroidAmbientsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<android.content.res.Configuration> getAmbientConfiguration();
-    method public static androidx.compose.runtime.ProvidableAmbient<android.content.Context> getAmbientContext();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.lifecycle.LifecycleOwner> getAmbientLifecycleOwner();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.savedstate.SavedStateRegistryOwner> getAmbientSavedStateRegistryOwner();
-    method public static androidx.compose.runtime.ProvidableAmbient<android.view.View> getAmbientView();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.lifecycle.ViewModelStoreOwner> getAmbientViewModelStoreOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration>! getAmbientConfiguration();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context>! getAmbientContext();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner>! getAmbientLifecycleOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner>! getAmbientSavedStateRegistryOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View>! getAmbientView();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.ViewModelStoreOwner>! getAmbientViewModelStoreOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.ViewModelStoreOwner> getLocalViewModelStoreOwner();
   }
 
   public final class AndroidClipboardManagerKt {
@@ -2203,7 +2205,8 @@
   }
 
   public final class InspectionModeKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.lang.Boolean> getInspectionMode();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean>! getInspectionMode();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
   }
 
   public final class InspectorInfo {
@@ -2435,87 +2438,6 @@
 
 }
 
-package androidx.compose.ui.selection {
-
-  @androidx.compose.ui.text.ExperimentalTextApi public interface Selectable {
-    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
-    method public long getHandlePosition-F1C5BW0(androidx.compose.ui.selection.Selection selection, boolean isStartHandle);
-    method public androidx.compose.ui.layout.LayoutCoordinates? getLayoutCoordinates();
-    method public androidx.compose.ui.selection.Selection? getSelection-lzk2kLM(long startPosition, long endPosition, androidx.compose.ui.layout.LayoutCoordinates containerLayoutCoordinates, boolean longPress, optional androidx.compose.ui.selection.Selection? previousSelection, optional boolean isStartHandle);
-    method public androidx.compose.ui.text.AnnotatedString getText();
-  }
-
-  @androidx.compose.runtime.Immutable public final class Selection {
-    ctor public Selection(androidx.compose.ui.selection.Selection.AnchorInfo start, androidx.compose.ui.selection.Selection.AnchorInfo end, boolean handlesCrossed);
-    method public androidx.compose.ui.selection.Selection.AnchorInfo component1();
-    method public androidx.compose.ui.selection.Selection.AnchorInfo component2();
-    method public boolean component3();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.selection.Selection copy(androidx.compose.ui.selection.Selection.AnchorInfo start, androidx.compose.ui.selection.Selection.AnchorInfo end, boolean handlesCrossed);
-    method public androidx.compose.ui.selection.Selection.AnchorInfo getEnd();
-    method public boolean getHandlesCrossed();
-    method public androidx.compose.ui.selection.Selection.AnchorInfo getStart();
-    method public androidx.compose.ui.selection.Selection merge(androidx.compose.ui.selection.Selection? other);
-    method public long toTextRange-d9O1mEE();
-    property public final androidx.compose.ui.selection.Selection.AnchorInfo end;
-    property public final boolean handlesCrossed;
-    property public final androidx.compose.ui.selection.Selection.AnchorInfo start;
-  }
-
-  @androidx.compose.runtime.Immutable public static final class Selection.AnchorInfo {
-    ctor public Selection.AnchorInfo(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.compose.ui.selection.Selectable selectable);
-    method public androidx.compose.ui.text.style.ResolvedTextDirection component1();
-    method public int component2();
-    method public androidx.compose.ui.selection.Selectable component3();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.selection.Selection.AnchorInfo copy(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.compose.ui.selection.Selectable selectable);
-    method public androidx.compose.ui.text.style.ResolvedTextDirection getDirection();
-    method public int getOffset();
-    method public androidx.compose.ui.selection.Selectable getSelectable();
-    property public final androidx.compose.ui.text.style.ResolvedTextDirection direction;
-    property public final int offset;
-    property public final androidx.compose.ui.selection.Selectable selectable;
-  }
-
-  public final class SelectionContainerKt {
-    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-  public final class SelectionHandlesKt {
-  }
-
-  public final class SelectionManagerKt {
-  }
-
-  @androidx.compose.ui.text.ExperimentalTextApi public interface SelectionRegistrar {
-    method public void notifyPositionChange();
-    method public void notifySelectableChange(androidx.compose.ui.selection.Selectable selectable);
-    method public void notifySelectionUpdate-rULFVbc(androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates, long startPosition, long endPosition);
-    method public void notifySelectionUpdateEnd();
-    method public void notifySelectionUpdateStart-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates, long startPosition);
-    method public androidx.compose.ui.selection.Selectable subscribe(androidx.compose.ui.selection.Selectable selectable);
-    method public void unsubscribe(androidx.compose.ui.selection.Selectable selectable);
-  }
-
-  public final class SelectionRegistrarKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.selection.SelectionRegistrar> getAmbientSelectionRegistrar();
-  }
-
-  public final class SimpleLayoutKt {
-  }
-
-  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
-    method public long getBackgroundColor-0d7_KjU();
-    method public long getHandleColor-0d7_KjU();
-    property public final long backgroundColor;
-    property public final long handleColor;
-  }
-
-  public final class TextSelectionColorsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.selection.TextSelectionColors> getAmbientTextSelectionColors();
-  }
-
-}
-
 package androidx.compose.ui.semantics {
 
   public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
@@ -2570,25 +2492,22 @@
   }
 
   public final class ScrollAxisRange {
-    ctor public ScrollAxisRange(float value, float maxValue, boolean reverseScrolling);
-    ctor public ScrollAxisRange();
-    method public float component1();
-    method public float component2();
-    method public boolean component3();
-    method public androidx.compose.ui.semantics.ScrollAxisRange copy(float value, float maxValue, boolean reverseScrolling);
-    method public float getMaxValue();
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
     method public boolean getReverseScrolling();
-    method public float getValue();
-    property public final float maxValue;
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
     property public final boolean reverseScrolling;
-    property public final float value;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
   }
 
   public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
@@ -2597,10 +2516,12 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
@@ -2736,11 +2657,13 @@
   }
 
   public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
@@ -2826,19 +2749,7 @@
 
 package androidx.compose.ui.viewinterop {
 
-  @androidx.compose.ui.viewinterop.InternalInteropApi public abstract class AndroidViewHolder extends android.view.ViewGroup {
-    ctor public AndroidViewHolder(android.content.Context context);
-    method public final androidx.compose.ui.unit.Density getDensity();
-    method public final androidx.compose.ui.Modifier getModifier();
-    method public final kotlin.jvm.functions.Function0<kotlin.Unit> getUpdate();
-    method public final android.view.View? getView();
-    method public final void setDensity(androidx.compose.ui.unit.Density value);
-    method public final void setModifier(androidx.compose.ui.Modifier value);
-    method protected final void setUpdate(kotlin.jvm.functions.Function0<kotlin.Unit> value);
-    property public final androidx.compose.ui.unit.Density density;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> update;
-    property public final android.view.View? view;
+  public final class AndroidViewHolderKt {
   }
 
   public final class AndroidViewKt {
@@ -2851,9 +2762,6 @@
     method @Deprecated @androidx.compose.runtime.Composable public static <T extends android.view.ViewGroup> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is an experimental API for Compose UI LayoutNode and is likely to change " + "before becoming stable.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalInteropApi {
-  }
-
   public final class ViewModelKt {
     method @androidx.compose.runtime.Composable public static <T extends androidx.lifecycle.ViewModel> T viewModel(Class<T> modelClass, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
     method @androidx.compose.runtime.Composable public static inline <reified T extends androidx.lifecycle.ViewModel> T! viewModel(optional String key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
@@ -2910,7 +2818,7 @@
   }
 
   @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
-    method public long calculatePosition-igXpx9M(androidx.compose.ui.unit.IntBounds anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+    method public long calculatePosition-aa5Bd6I(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
   }
 
   @androidx.compose.runtime.Immutable public interface PopupProperties {
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index 7e97814..49ebff6 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -459,34 +459,33 @@
   }
 
   public final class DragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier dragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
+    method @Deprecated public static androidx.compose.ui.Modifier dragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
   }
 
-  public interface DragObserver {
-    method public default void onCancel();
-    method public default long onDrag-k-4lQ0M(long dragDistance);
-    method public default void onStart-k-4lQ0M(long downPosition);
-    method public default void onStop-k-4lQ0M(long velocity);
+  @Deprecated public interface DragObserver {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default long onDrag-k-4lQ0M(long dragDistance);
+    method @Deprecated public default void onStart-k-4lQ0M(long downPosition);
+    method @Deprecated public default void onStop-k-4lQ0M(long velocity);
   }
 
   public final class DragSlopExceededGestureFilterKt {
-    method public static androidx.compose.ui.Modifier dragSlopExceededGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
+    method @Deprecated public static androidx.compose.ui.Modifier dragSlopExceededGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
   }
 
   public final class GestureUtilsKt {
-    method public static boolean anyPointersInBounds-5eFHUEc(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange>, long bounds);
   }
 
   public final class LongPressDragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier longPressDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.LongPressDragObserver longPressDragObserver);
+    method @Deprecated public static androidx.compose.ui.Modifier longPressDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.LongPressDragObserver longPressDragObserver);
   }
 
-  public interface LongPressDragObserver {
-    method public default void onCancel();
-    method public default long onDrag-k-4lQ0M(long dragDistance);
-    method public default void onDragStart();
-    method public default void onLongPress-k-4lQ0M(long pxPosition);
-    method public default void onStop-k-4lQ0M(long velocity);
+  @Deprecated public interface LongPressDragObserver {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default long onDrag-k-4lQ0M(long dragDistance);
+    method @Deprecated public default void onDragStart();
+    method @Deprecated public default void onLongPress-k-4lQ0M(long pxPosition);
+    method @Deprecated public default void onStop-k-4lQ0M(long velocity);
   }
 
   public final class LongPressGestureFilterKt {
@@ -498,25 +497,25 @@
   }
 
   public final class RawDragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier rawDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
+    method @Deprecated public static androidx.compose.ui.Modifier rawDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
   }
 
   public final class RawPressStartGestureFilterKt {
-    method public static androidx.compose.ui.Modifier rawPressStartGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, optional boolean enabled, optional androidx.compose.ui.input.pointer.PointerEventPass executionPass);
+    method @Deprecated public static androidx.compose.ui.Modifier rawPressStartGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, optional boolean enabled, optional androidx.compose.ui.input.pointer.PointerEventPass executionPass);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public interface ScrollCallback {
-    method public default void onCancel();
-    method public default float onScroll(float scrollDistance);
-    method public default void onStart-k-4lQ0M(long downPosition);
-    method public default void onStop(float velocity);
+  @Deprecated public interface ScrollCallback {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default float onScroll(float scrollDistance);
+    method @Deprecated public default void onStart-k-4lQ0M(long downPosition);
+    method @Deprecated public default void onStop(float velocity);
   }
 
   public final class ScrollGestureFilterKt {
-    method public static androidx.compose.ui.Modifier scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback scrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
+    method @Deprecated public static androidx.compose.ui.Modifier scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback scrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
   }
 
   public final class TapGestureFilterKt {
@@ -1710,6 +1709,11 @@
     property public final float value;
   }
 
+  public interface GraphicLayerInfo {
+    method public long getLayerId();
+    property public abstract long layerId;
+  }
+
   public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
     ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
   }
@@ -1977,7 +1981,7 @@
   @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalCoreApi {
   }
 
-  public final class LayoutNode implements androidx.compose.ui.layout.LayoutInfo androidx.compose.ui.layout.Measurable androidx.compose.ui.node.OwnerScope androidx.compose.ui.layout.Remeasurement {
+  public final class LayoutNode implements androidx.compose.ui.layout.LayoutInfo androidx.compose.ui.layout.Measurable androidx.compose.ui.layout.Remeasurement {
     method public void forceRemeasure();
     method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
     method public int getHeight();
@@ -2014,28 +2018,6 @@
     method public int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int h);
   }
 
-  public interface OwnedLayer {
-    method public void destroy();
-    method public void drawLayer(androidx.compose.ui.graphics.Canvas canvas);
-    method public long getLayerId();
-    method public void getMatrix-58bKbWc(float[] matrix);
-    method public void invalidate();
-    method public void move--gyyYBs(long position);
-    method public void resize-ozmzZPI(long size);
-    method public void updateDisplayList();
-    method public void updateLayerProperties-y8e2Zg0(float scaleX, float scaleY, float alpha, float translationX, float translationY, float shadowElevation, float rotationX, float rotationY, float rotationZ, float cameraDistance, long transformOrigin, androidx.compose.ui.graphics.Shape shape, boolean clip, androidx.compose.ui.unit.LayoutDirection layoutDirection);
-    property public abstract long layerId;
-  }
-
-  public interface OwnerScope {
-    method public boolean isValid();
-    property public abstract boolean isValid;
-  }
-
-  public final class OwnerSnapshotObserver {
-    ctor public OwnerSnapshotObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2090,28 +2072,48 @@
   }
 
   public final class AmbientsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.animation.core.AnimationClockObservable> getAmbientAnimationClock();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.autofill.Autofill> getAmbientAutofill();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.autofill.AutofillTree> getAmbientAutofillTree();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.ClipboardManager> getAmbientClipboardManager();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.Density> getAmbientDensity();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.focus.FocusManager> getAmbientFocusManager();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.hapticfeedback.HapticFeedback> getAmbientHapticFeedback();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.LayoutDirection> getAmbientLayoutDirection();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.text.input.TextInputService> getAmbientTextInputService();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.TextToolbar> getAmbientTextToolbar();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.UriHandler> getAmbientUriHandler();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.ViewConfiguration> getAmbientViewConfiguration();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.WindowInfo> getAmbientWindowInfo();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.animation.core.AnimationClockObservable>! getAmbientAnimationClock();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill>! getAmbientAutofill();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree>! getAmbientAutofillTree();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager>! getAmbientClipboardManager();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density>! getAmbientDensity();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager>! getAmbientFocusManager();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.Font.ResourceLoader>! getAmbientFontLoader();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback>! getAmbientHapticFeedback();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection>! getAmbientLayoutDirection();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService>! getAmbientTextInputService();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar>! getAmbientTextToolbar();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler>! getAmbientUriHandler();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration>! getAmbientViewConfiguration();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo>! getAmbientWindowInfo();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.animation.core.AnimationClockObservable> getLocalAnimationClock();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
   }
 
   public final class AndroidAmbientsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<android.content.res.Configuration> getAmbientConfiguration();
-    method public static androidx.compose.runtime.ProvidableAmbient<android.content.Context> getAmbientContext();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.lifecycle.LifecycleOwner> getAmbientLifecycleOwner();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.savedstate.SavedStateRegistryOwner> getAmbientSavedStateRegistryOwner();
-    method public static androidx.compose.runtime.ProvidableAmbient<android.view.View> getAmbientView();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.lifecycle.ViewModelStoreOwner> getAmbientViewModelStoreOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration>! getAmbientConfiguration();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context>! getAmbientContext();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner>! getAmbientLifecycleOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner>! getAmbientSavedStateRegistryOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View>! getAmbientView();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.ViewModelStoreOwner>! getAmbientViewModelStoreOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.ViewModelStoreOwner> getLocalViewModelStoreOwner();
   }
 
   public final class AndroidClipboardManagerKt {
@@ -2203,7 +2205,8 @@
   }
 
   public final class InspectionModeKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.lang.Boolean> getInspectionMode();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean>! getInspectionMode();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
   }
 
   public final class InspectorInfo {
@@ -2435,87 +2438,6 @@
 
 }
 
-package androidx.compose.ui.selection {
-
-  @androidx.compose.ui.text.ExperimentalTextApi public interface Selectable {
-    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
-    method public long getHandlePosition-F1C5BW0(androidx.compose.ui.selection.Selection selection, boolean isStartHandle);
-    method public androidx.compose.ui.layout.LayoutCoordinates? getLayoutCoordinates();
-    method public androidx.compose.ui.selection.Selection? getSelection-lzk2kLM(long startPosition, long endPosition, androidx.compose.ui.layout.LayoutCoordinates containerLayoutCoordinates, boolean longPress, optional androidx.compose.ui.selection.Selection? previousSelection, optional boolean isStartHandle);
-    method public androidx.compose.ui.text.AnnotatedString getText();
-  }
-
-  @androidx.compose.runtime.Immutable public final class Selection {
-    ctor public Selection(androidx.compose.ui.selection.Selection.AnchorInfo start, androidx.compose.ui.selection.Selection.AnchorInfo end, boolean handlesCrossed);
-    method public androidx.compose.ui.selection.Selection.AnchorInfo component1();
-    method public androidx.compose.ui.selection.Selection.AnchorInfo component2();
-    method public boolean component3();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.selection.Selection copy(androidx.compose.ui.selection.Selection.AnchorInfo start, androidx.compose.ui.selection.Selection.AnchorInfo end, boolean handlesCrossed);
-    method public androidx.compose.ui.selection.Selection.AnchorInfo getEnd();
-    method public boolean getHandlesCrossed();
-    method public androidx.compose.ui.selection.Selection.AnchorInfo getStart();
-    method public androidx.compose.ui.selection.Selection merge(androidx.compose.ui.selection.Selection? other);
-    method public long toTextRange-d9O1mEE();
-    property public final androidx.compose.ui.selection.Selection.AnchorInfo end;
-    property public final boolean handlesCrossed;
-    property public final androidx.compose.ui.selection.Selection.AnchorInfo start;
-  }
-
-  @androidx.compose.runtime.Immutable public static final class Selection.AnchorInfo {
-    ctor public Selection.AnchorInfo(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.compose.ui.selection.Selectable selectable);
-    method public androidx.compose.ui.text.style.ResolvedTextDirection component1();
-    method public int component2();
-    method public androidx.compose.ui.selection.Selectable component3();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.selection.Selection.AnchorInfo copy(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.compose.ui.selection.Selectable selectable);
-    method public androidx.compose.ui.text.style.ResolvedTextDirection getDirection();
-    method public int getOffset();
-    method public androidx.compose.ui.selection.Selectable getSelectable();
-    property public final androidx.compose.ui.text.style.ResolvedTextDirection direction;
-    property public final int offset;
-    property public final androidx.compose.ui.selection.Selectable selectable;
-  }
-
-  public final class SelectionContainerKt {
-    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-  public final class SelectionHandlesKt {
-  }
-
-  public final class SelectionManagerKt {
-  }
-
-  @androidx.compose.ui.text.ExperimentalTextApi public interface SelectionRegistrar {
-    method public void notifyPositionChange();
-    method public void notifySelectableChange(androidx.compose.ui.selection.Selectable selectable);
-    method public void notifySelectionUpdate-rULFVbc(androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates, long startPosition, long endPosition);
-    method public void notifySelectionUpdateEnd();
-    method public void notifySelectionUpdateStart-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates, long startPosition);
-    method public androidx.compose.ui.selection.Selectable subscribe(androidx.compose.ui.selection.Selectable selectable);
-    method public void unsubscribe(androidx.compose.ui.selection.Selectable selectable);
-  }
-
-  public final class SelectionRegistrarKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.selection.SelectionRegistrar> getAmbientSelectionRegistrar();
-  }
-
-  public final class SimpleLayoutKt {
-  }
-
-  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
-    method public long getBackgroundColor-0d7_KjU();
-    method public long getHandleColor-0d7_KjU();
-    property public final long backgroundColor;
-    property public final long handleColor;
-  }
-
-  public final class TextSelectionColorsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.selection.TextSelectionColors> getAmbientTextSelectionColors();
-  }
-
-}
-
 package androidx.compose.ui.semantics {
 
   public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
@@ -2570,25 +2492,22 @@
   }
 
   public final class ScrollAxisRange {
-    ctor public ScrollAxisRange(float value, float maxValue, boolean reverseScrolling);
-    ctor public ScrollAxisRange();
-    method public float component1();
-    method public float component2();
-    method public boolean component3();
-    method public androidx.compose.ui.semantics.ScrollAxisRange copy(float value, float maxValue, boolean reverseScrolling);
-    method public float getMaxValue();
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
     method public boolean getReverseScrolling();
-    method public float getValue();
-    property public final float maxValue;
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
     property public final boolean reverseScrolling;
-    property public final float value;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
   }
 
   public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
@@ -2597,10 +2516,12 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
@@ -2736,11 +2657,13 @@
   }
 
   public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
@@ -2826,19 +2749,7 @@
 
 package androidx.compose.ui.viewinterop {
 
-  @androidx.compose.ui.viewinterop.InternalInteropApi public abstract class AndroidViewHolder extends android.view.ViewGroup {
-    ctor public AndroidViewHolder(android.content.Context context);
-    method public final androidx.compose.ui.unit.Density getDensity();
-    method public final androidx.compose.ui.Modifier getModifier();
-    method public final kotlin.jvm.functions.Function0<kotlin.Unit> getUpdate();
-    method public final android.view.View? getView();
-    method public final void setDensity(androidx.compose.ui.unit.Density value);
-    method public final void setModifier(androidx.compose.ui.Modifier value);
-    method protected final void setUpdate(kotlin.jvm.functions.Function0<kotlin.Unit> value);
-    property public final androidx.compose.ui.unit.Density density;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> update;
-    property public final android.view.View? view;
+  public final class AndroidViewHolderKt {
   }
 
   public final class AndroidViewKt {
@@ -2851,9 +2762,6 @@
     method @Deprecated @androidx.compose.runtime.Composable public static <T extends android.view.ViewGroup> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is an experimental API for Compose UI LayoutNode and is likely to change " + "before becoming stable.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalInteropApi {
-  }
-
   public final class ViewModelKt {
     method @androidx.compose.runtime.Composable public static <T extends androidx.lifecycle.ViewModel> T viewModel(Class<T> modelClass, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
     method @androidx.compose.runtime.Composable public static inline <reified T extends androidx.lifecycle.ViewModel> T! viewModel(optional String key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
@@ -2910,7 +2818,7 @@
   }
 
   @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
-    method public long calculatePosition-igXpx9M(androidx.compose.ui.unit.IntBounds anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+    method public long calculatePosition-aa5Bd6I(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
   }
 
   @androidx.compose.runtime.Immutable public interface PopupProperties {
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index 9ccdb01..c5c3639 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -459,34 +459,33 @@
   }
 
   public final class DragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier dragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
+    method @Deprecated public static androidx.compose.ui.Modifier dragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
   }
 
-  public interface DragObserver {
-    method public default void onCancel();
-    method public default long onDrag-k-4lQ0M(long dragDistance);
-    method public default void onStart-k-4lQ0M(long downPosition);
-    method public default void onStop-k-4lQ0M(long velocity);
+  @Deprecated public interface DragObserver {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default long onDrag-k-4lQ0M(long dragDistance);
+    method @Deprecated public default void onStart-k-4lQ0M(long downPosition);
+    method @Deprecated public default void onStop-k-4lQ0M(long velocity);
   }
 
   public final class DragSlopExceededGestureFilterKt {
-    method public static androidx.compose.ui.Modifier dragSlopExceededGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
+    method @Deprecated public static androidx.compose.ui.Modifier dragSlopExceededGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
   }
 
   public final class GestureUtilsKt {
-    method public static boolean anyPointersInBounds-5eFHUEc(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange>, long bounds);
   }
 
   public final class LongPressDragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier longPressDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.LongPressDragObserver longPressDragObserver);
+    method @Deprecated public static androidx.compose.ui.Modifier longPressDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.LongPressDragObserver longPressDragObserver);
   }
 
-  public interface LongPressDragObserver {
-    method public default void onCancel();
-    method public default long onDrag-k-4lQ0M(long dragDistance);
-    method public default void onDragStart();
-    method public default void onLongPress-k-4lQ0M(long pxPosition);
-    method public default void onStop-k-4lQ0M(long velocity);
+  @Deprecated public interface LongPressDragObserver {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default long onDrag-k-4lQ0M(long dragDistance);
+    method @Deprecated public default void onDragStart();
+    method @Deprecated public default void onLongPress-k-4lQ0M(long pxPosition);
+    method @Deprecated public default void onStop-k-4lQ0M(long velocity);
   }
 
   public final class LongPressGestureFilterKt {
@@ -498,25 +497,25 @@
   }
 
   public final class RawDragGestureFilterKt {
-    method public static androidx.compose.ui.Modifier rawDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
+    method @Deprecated public static androidx.compose.ui.Modifier rawDragGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.DragObserver dragObserver, optional kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging, optional androidx.compose.ui.gesture.scrollorientationlocking.Orientation? orientation);
   }
 
   public final class RawPressStartGestureFilterKt {
-    method public static androidx.compose.ui.Modifier rawPressStartGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, optional boolean enabled, optional androidx.compose.ui.input.pointer.PointerEventPass executionPass);
+    method @Deprecated public static androidx.compose.ui.Modifier rawPressStartGestureFilter(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onPressStart, optional boolean enabled, optional androidx.compose.ui.input.pointer.PointerEventPass executionPass);
   }
 
   public final class ScaleUtilKt {
   }
 
-  public interface ScrollCallback {
-    method public default void onCancel();
-    method public default float onScroll(float scrollDistance);
-    method public default void onStart-k-4lQ0M(long downPosition);
-    method public default void onStop(float velocity);
+  @Deprecated public interface ScrollCallback {
+    method @Deprecated public default void onCancel();
+    method @Deprecated public default float onScroll(float scrollDistance);
+    method @Deprecated public default void onStart-k-4lQ0M(long downPosition);
+    method @Deprecated public default void onStop(float velocity);
   }
 
   public final class ScrollGestureFilterKt {
-    method public static androidx.compose.ui.Modifier scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback scrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
+    method @Deprecated public static androidx.compose.ui.Modifier scrollGestureFilter(androidx.compose.ui.Modifier, androidx.compose.ui.gesture.ScrollCallback scrollCallback, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.gesture.Direction,java.lang.Boolean>? canDrag, optional boolean startDragImmediately);
   }
 
   public final class TapGestureFilterKt {
@@ -1727,6 +1726,11 @@
     property public final float value;
   }
 
+  public interface GraphicLayerInfo {
+    method public long getLayerId();
+    property public abstract long layerId;
+  }
+
   public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
     ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
   }
@@ -1763,11 +1767,12 @@
     method public float getDensity();
     method public float getFontScale();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method @androidx.compose.runtime.Stable public int roundToPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public int roundToPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public float toDp--R2X_6o(long);
     method @androidx.compose.runtime.Stable public float toDp-D9Ej5fM(float);
     method @androidx.compose.runtime.Stable public float toDp-D9Ej5fM(int);
-    method @androidx.compose.runtime.Stable public int toIntPx--R2X_6o(long);
-    method @androidx.compose.runtime.Stable public int toIntPx-0680j_4(float);
+    method @Deprecated @androidx.compose.runtime.Stable public int toIntPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public float toPx--R2X_6o(long);
     method @androidx.compose.runtime.Stable public float toPx-0680j_4(float);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.Bounds);
@@ -2039,7 +2044,7 @@
     property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.LayoutNode,androidx.compose.ui.node.Ref<androidx.compose.ui.node.LayoutNode>,kotlin.Unit> setRef;
   }
 
-  public final class LayoutNode implements androidx.compose.ui.layout.LayoutInfo androidx.compose.ui.layout.Measurable androidx.compose.ui.node.OwnerScope androidx.compose.ui.layout.Remeasurement {
+  public final class LayoutNode implements androidx.compose.ui.layout.LayoutInfo androidx.compose.ui.layout.Measurable androidx.compose.ui.layout.Remeasurement {
     method public void forceRemeasure();
     method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
     method public int getHeight();
@@ -2076,28 +2081,6 @@
     method public int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int h);
   }
 
-  public interface OwnedLayer {
-    method public void destroy();
-    method public void drawLayer(androidx.compose.ui.graphics.Canvas canvas);
-    method public long getLayerId();
-    method public void getMatrix-58bKbWc(float[] matrix);
-    method public void invalidate();
-    method public void move--gyyYBs(long position);
-    method public void resize-ozmzZPI(long size);
-    method public void updateDisplayList();
-    method public void updateLayerProperties-y8e2Zg0(float scaleX, float scaleY, float alpha, float translationX, float translationY, float shadowElevation, float rotationX, float rotationY, float rotationZ, float cameraDistance, long transformOrigin, androidx.compose.ui.graphics.Shape shape, boolean clip, androidx.compose.ui.unit.LayoutDirection layoutDirection);
-    property public abstract long layerId;
-  }
-
-  public interface OwnerScope {
-    method public boolean isValid();
-    property public abstract boolean isValid;
-  }
-
-  public final class OwnerSnapshotObserver {
-    ctor public OwnerSnapshotObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2152,28 +2135,48 @@
   }
 
   public final class AmbientsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.animation.core.AnimationClockObservable> getAmbientAnimationClock();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.autofill.Autofill> getAmbientAutofill();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.autofill.AutofillTree> getAmbientAutofillTree();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.ClipboardManager> getAmbientClipboardManager();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.Density> getAmbientDensity();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.focus.FocusManager> getAmbientFocusManager();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.hapticfeedback.HapticFeedback> getAmbientHapticFeedback();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.unit.LayoutDirection> getAmbientLayoutDirection();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.text.input.TextInputService> getAmbientTextInputService();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.TextToolbar> getAmbientTextToolbar();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.UriHandler> getAmbientUriHandler();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.ViewConfiguration> getAmbientViewConfiguration();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.platform.WindowInfo> getAmbientWindowInfo();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.animation.core.AnimationClockObservable>! getAmbientAnimationClock();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill>! getAmbientAutofill();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree>! getAmbientAutofillTree();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager>! getAmbientClipboardManager();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density>! getAmbientDensity();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager>! getAmbientFocusManager();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.Font.ResourceLoader>! getAmbientFontLoader();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback>! getAmbientHapticFeedback();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection>! getAmbientLayoutDirection();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService>! getAmbientTextInputService();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar>! getAmbientTextToolbar();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler>! getAmbientUriHandler();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration>! getAmbientViewConfiguration();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo>! getAmbientWindowInfo();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.animation.core.AnimationClockObservable> getLocalAnimationClock();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
   }
 
   public final class AndroidAmbientsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<android.content.res.Configuration> getAmbientConfiguration();
-    method public static androidx.compose.runtime.ProvidableAmbient<android.content.Context> getAmbientContext();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.lifecycle.LifecycleOwner> getAmbientLifecycleOwner();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.savedstate.SavedStateRegistryOwner> getAmbientSavedStateRegistryOwner();
-    method public static androidx.compose.runtime.ProvidableAmbient<android.view.View> getAmbientView();
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.lifecycle.ViewModelStoreOwner> getAmbientViewModelStoreOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration>! getAmbientConfiguration();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context>! getAmbientContext();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner>! getAmbientLifecycleOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner>! getAmbientSavedStateRegistryOwner();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View>! getAmbientView();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.ViewModelStoreOwner>! getAmbientViewModelStoreOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.ViewModelStoreOwner> getLocalViewModelStoreOwner();
   }
 
   public final class AndroidClipboardManagerKt {
@@ -2265,7 +2268,8 @@
   }
 
   public final class InspectionModeKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<java.lang.Boolean> getInspectionMode();
+    method @Deprecated public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean>! getInspectionMode();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
   }
 
   public final class InspectorInfo {
@@ -2499,87 +2503,6 @@
 
 }
 
-package androidx.compose.ui.selection {
-
-  @androidx.compose.ui.text.ExperimentalTextApi public interface Selectable {
-    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
-    method public long getHandlePosition-F1C5BW0(androidx.compose.ui.selection.Selection selection, boolean isStartHandle);
-    method public androidx.compose.ui.layout.LayoutCoordinates? getLayoutCoordinates();
-    method public androidx.compose.ui.selection.Selection? getSelection-lzk2kLM(long startPosition, long endPosition, androidx.compose.ui.layout.LayoutCoordinates containerLayoutCoordinates, boolean longPress, optional androidx.compose.ui.selection.Selection? previousSelection, optional boolean isStartHandle);
-    method public androidx.compose.ui.text.AnnotatedString getText();
-  }
-
-  @androidx.compose.runtime.Immutable public final class Selection {
-    ctor public Selection(androidx.compose.ui.selection.Selection.AnchorInfo start, androidx.compose.ui.selection.Selection.AnchorInfo end, boolean handlesCrossed);
-    method public androidx.compose.ui.selection.Selection.AnchorInfo component1();
-    method public androidx.compose.ui.selection.Selection.AnchorInfo component2();
-    method public boolean component3();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.selection.Selection copy(androidx.compose.ui.selection.Selection.AnchorInfo start, androidx.compose.ui.selection.Selection.AnchorInfo end, boolean handlesCrossed);
-    method public androidx.compose.ui.selection.Selection.AnchorInfo getEnd();
-    method public boolean getHandlesCrossed();
-    method public androidx.compose.ui.selection.Selection.AnchorInfo getStart();
-    method public androidx.compose.ui.selection.Selection merge(androidx.compose.ui.selection.Selection? other);
-    method public long toTextRange-d9O1mEE();
-    property public final androidx.compose.ui.selection.Selection.AnchorInfo end;
-    property public final boolean handlesCrossed;
-    property public final androidx.compose.ui.selection.Selection.AnchorInfo start;
-  }
-
-  @androidx.compose.runtime.Immutable public static final class Selection.AnchorInfo {
-    ctor public Selection.AnchorInfo(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.compose.ui.selection.Selectable selectable);
-    method public androidx.compose.ui.text.style.ResolvedTextDirection component1();
-    method public int component2();
-    method public androidx.compose.ui.selection.Selectable component3();
-    method @androidx.compose.runtime.Immutable public androidx.compose.ui.selection.Selection.AnchorInfo copy(androidx.compose.ui.text.style.ResolvedTextDirection direction, int offset, androidx.compose.ui.selection.Selectable selectable);
-    method public androidx.compose.ui.text.style.ResolvedTextDirection getDirection();
-    method public int getOffset();
-    method public androidx.compose.ui.selection.Selectable getSelectable();
-    property public final androidx.compose.ui.text.style.ResolvedTextDirection direction;
-    property public final int offset;
-    property public final androidx.compose.ui.selection.Selectable selectable;
-  }
-
-  public final class SelectionContainerKt {
-    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-  public final class SelectionHandlesKt {
-  }
-
-  public final class SelectionManagerKt {
-  }
-
-  @androidx.compose.ui.text.ExperimentalTextApi public interface SelectionRegistrar {
-    method public void notifyPositionChange();
-    method public void notifySelectableChange(androidx.compose.ui.selection.Selectable selectable);
-    method public void notifySelectionUpdate-rULFVbc(androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates, long startPosition, long endPosition);
-    method public void notifySelectionUpdateEnd();
-    method public void notifySelectionUpdateStart-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates, long startPosition);
-    method public androidx.compose.ui.selection.Selectable subscribe(androidx.compose.ui.selection.Selectable selectable);
-    method public void unsubscribe(androidx.compose.ui.selection.Selectable selectable);
-  }
-
-  public final class SelectionRegistrarKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.selection.SelectionRegistrar> getAmbientSelectionRegistrar();
-  }
-
-  public final class SimpleLayoutKt {
-  }
-
-  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
-    method public long getBackgroundColor-0d7_KjU();
-    method public long getHandleColor-0d7_KjU();
-    property public final long backgroundColor;
-    property public final long handleColor;
-  }
-
-  public final class TextSelectionColorsKt {
-    method public static androidx.compose.runtime.ProvidableAmbient<androidx.compose.ui.selection.TextSelectionColors> getAmbientTextSelectionColors();
-  }
-
-}
-
 package androidx.compose.ui.semantics {
 
   public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
@@ -2634,25 +2557,22 @@
   }
 
   public final class ScrollAxisRange {
-    ctor public ScrollAxisRange(float value, float maxValue, boolean reverseScrolling);
-    ctor public ScrollAxisRange();
-    method public float component1();
-    method public float component2();
-    method public boolean component3();
-    method public androidx.compose.ui.semantics.ScrollAxisRange copy(float value, float maxValue, boolean reverseScrolling);
-    method public float getMaxValue();
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
     method public boolean getReverseScrolling();
-    method public float getValue();
-    property public final float maxValue;
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
     property public final boolean reverseScrolling;
-    property public final float value;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
   }
 
   public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
@@ -2661,10 +2581,12 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
@@ -2800,11 +2722,13 @@
   }
 
   public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
     method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
@@ -2890,19 +2814,7 @@
 
 package androidx.compose.ui.viewinterop {
 
-  @androidx.compose.ui.viewinterop.InternalInteropApi public abstract class AndroidViewHolder extends android.view.ViewGroup {
-    ctor public AndroidViewHolder(android.content.Context context);
-    method public final androidx.compose.ui.unit.Density getDensity();
-    method public final androidx.compose.ui.Modifier getModifier();
-    method public final kotlin.jvm.functions.Function0<kotlin.Unit> getUpdate();
-    method public final android.view.View? getView();
-    method public final void setDensity(androidx.compose.ui.unit.Density value);
-    method public final void setModifier(androidx.compose.ui.Modifier value);
-    method protected final void setUpdate(kotlin.jvm.functions.Function0<kotlin.Unit> value);
-    property public final androidx.compose.ui.unit.Density density;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> update;
-    property public final android.view.View? view;
+  public final class AndroidViewHolderKt {
   }
 
   public final class AndroidViewKt {
@@ -2915,9 +2827,6 @@
     method @Deprecated @androidx.compose.runtime.Composable public static <T extends android.view.ViewGroup> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
-  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is an experimental API for Compose UI LayoutNode and is likely to change " + "before becoming stable.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalInteropApi {
-  }
-
   public final class ViewModelKt {
     method @androidx.compose.runtime.Composable public static <T extends androidx.lifecycle.ViewModel> T viewModel(Class<T> modelClass, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
     method @androidx.compose.runtime.Composable public static inline <reified T extends androidx.lifecycle.ViewModel> T! viewModel(optional String key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
@@ -2974,7 +2883,7 @@
   }
 
   @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
-    method public long calculatePosition-igXpx9M(androidx.compose.ui.unit.IntBounds anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+    method public long calculatePosition-aa5Bd6I(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
   }
 
   @androidx.compose.runtime.Immutable public interface PopupProperties {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
index 9ec65f5..628069c 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
@@ -39,8 +39,8 @@
 import androidx.compose.ui.graphics.toComposeRect
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientAutofill
-import androidx.compose.ui.platform.AmbientAutofillTree
+import androidx.compose.ui.platform.LocalAutofill
+import androidx.compose.ui.platform.LocalAutofillTree
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.unit.dp
@@ -51,7 +51,7 @@
     Column {
         val nameState = remember { mutableStateOf("Enter name here") }
         val emailState = remember { mutableStateOf("Enter email here") }
-        val autofill = AmbientAutofill.current
+        val autofill = LocalAutofill.current
         val labelStyle = MaterialTheme.typography.subtitle1
         val textStyle = MaterialTheme.typography.h6
 
@@ -118,7 +118,7 @@
 ) {
     val autofillNode = AutofillNode(onFill = onFill, autofillTypes = autofillTypes)
 
-    val autofillTree = AmbientAutofillTree.current
+    val autofillTree = LocalAutofillTree.current
     autofillTree += autofillNode
 
     Box(
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt
index b871bfd..7c17291 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInDialogDemo.kt
@@ -31,7 +31,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color.Companion.LightGray
 import androidx.compose.ui.graphics.Color.Companion.White
-import androidx.compose.ui.platform.AmbientWindowInfo
+import androidx.compose.ui.platform.LocalWindowInfo
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Dialog
@@ -41,7 +41,7 @@
     var showDialog by remember { mutableStateOf(false) }
     var mainText by remember { mutableStateOf(TextFieldValue("Enter Value")) }
     var dialogText by remember { mutableStateOf(TextFieldValue("Enter Value")) }
-    val windowInfo = AmbientWindowInfo.current
+    val windowInfo = LocalWindowInfo.current
 
     Column(Modifier.background(if (windowInfo.isWindowFocused) White else LightGray)) {
         Text("Click the button to show the dialog. Click outside the dialog to dismiss it.")
@@ -70,6 +70,6 @@
 
 @Composable
 private fun FocusStatus() {
-    val windowInfo = AmbientWindowInfo.current
+    val windowInfo = LocalWindowInfo.current
     Text("Status: Window ${if (windowInfo.isWindowFocused) "is" else "is not"} focused.")
 }
\ No newline at end of file
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt
index a48d3d7..2388878 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusInPopupDemo.kt
@@ -32,7 +32,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color.Companion.LightGray
 import androidx.compose.ui.graphics.Color.Companion.White
-import androidx.compose.ui.platform.AmbientWindowInfo
+import androidx.compose.ui.platform.LocalWindowInfo
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Popup
@@ -42,7 +42,7 @@
     var showPopup by remember { mutableStateOf(false) }
     var mainText by remember { mutableStateOf(TextFieldValue("Enter Value")) }
     var popupText by remember { mutableStateOf(TextFieldValue("Enter Value")) }
-    val windowInfo = AmbientWindowInfo.current
+    val windowInfo = LocalWindowInfo.current
 
     Column(Modifier.background(if (windowInfo.isWindowFocused) White else LightGray)) {
         Text("Click the button to show the popup. Click outside the popup to dismiss it.")
@@ -75,6 +75,6 @@
 
 @Composable
 private fun FocusStatus() {
-    val windowInfo = AmbientWindowInfo.current
+    val windowInfo = LocalWindowInfo.current
     Text("Status: Window ${if (windowInfo.isWindowFocused) "is" else "is not"} focused.")
 }
\ No newline at end of file
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
index 2d02b59..3d721f2 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
@@ -51,7 +51,7 @@
 import androidx.compose.ui.graphics.Color.Companion.Black
 import androidx.compose.ui.graphics.Color.Companion.Green
 import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.platform.AmbientFocusManager
+import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -59,7 +59,7 @@
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 fun FocusManagerMoveFocusDemo() {
-    val focusManager = AmbientFocusManager.current
+    val focusManager = LocalFocusManager.current
     Column {
         Text(
             text = "Use the buttons to move focus",
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
index e1bacaf..f75c9bc 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
@@ -32,7 +32,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
 /**
@@ -44,7 +44,7 @@
     val offset = remember { mutableStateOf(Offset.Zero) }
 
     val (offsetX, offsetY) =
-        with(AmbientDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
+        with(LocalDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
 
     Column {
         Text("Demonstrates combining dragging with scaling.")
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
index 7fdd571..bfa87c0 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
@@ -17,6 +17,9 @@
 package androidx.compose.ui.demos.gestures
 
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.awaitTouchSlopOrCancellation
+import androidx.compose.foundation.gestures.forEachGesture
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -28,13 +31,13 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.Direction
-import androidx.compose.ui.gesture.dragSlopExceededGestureFilter
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.consumeAllChanges
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.dp
 
 /**
- * Simple [dragSlopExceededGestureFilter] demo.
+ * Simple [awaitTouchSlopOrCancellation] demo.
  */
 @Composable
 fun DragSlopExceededGestureFilterDemo() {
@@ -42,50 +45,15 @@
     val verticalColor = Color(0xfff44336)
     val horizontalColor = Color(0xff2196f3)
 
-    val orientationVertical = remember { mutableStateOf(true) }
+    val alternativeColor = remember { mutableStateOf(false) }
 
-    // This would be more efficient if onTouchSlopExceeded were memoized because it's
-    // value doesn't need to change for each new composition.  Like this, every time
-    // we recompose, a new lambda is created.  Here we aren't memoizing to demonstrate
-    // that TouchSlopExceededGestureDetector behaves correctly when it is recomposed
-    // because onTouchSlopExceeded changes.
-    val onTouchSlopExceeded =
-        {
-            orientationVertical.value = !orientationVertical.value
-        }
-
-    val canDrag =
-        if (orientationVertical.value) {
-            { direction: Direction ->
-                when (direction) {
-                    Direction.UP -> true
-                    Direction.DOWN -> true
-                    else -> false
-                }
-            }
-        } else {
-            { direction: Direction ->
-                when (direction) {
-                    Direction.LEFT -> true
-                    Direction.RIGHT -> true
-                    else -> false
-                }
-            }
-        }
-
-    val color =
-        if (orientationVertical.value) {
-            verticalColor
-        } else {
-            horizontalColor
-        }
+    val color = if (alternativeColor.value) verticalColor else horizontalColor
 
     Column {
         Text(
             "Demonstrates functionality of Modifier.dragSlopExceededGestureFilter, which calls " +
                 "its callback when touch slop has been exceeded by the average distance" +
-                " change of all pointers.  This also demonstrates controlling which" +
-                " directions can be dragged to exceed touch slop."
+                " change of all pointers."
         )
         Text(
             "When red, a drag on the box will turn the box blue only when you drag up or down on" +
@@ -96,7 +64,17 @@
             Modifier.fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .preferredSize(192.dp)
-                .dragSlopExceededGestureFilter(onTouchSlopExceeded, canDrag)
+                .pointerInput {
+                    forEachGesture {
+                        awaitPointerEventScope {
+                            val down = awaitFirstDown(requireUnconsumed = false)
+                            awaitTouchSlopOrCancellation(down.id) { change, _ ->
+                                alternativeColor.value = !alternativeColor.value
+                                change.consumeAllChanges()
+                            }
+                        }
+                    }
+                }
                 .background(color)
         )
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
index 5730e23..eef08d0 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
@@ -19,6 +19,8 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.gestures.rememberScrollableController
+import androidx.compose.foundation.gestures.scrollable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -31,9 +33,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.Direction
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollGestureFilter
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
@@ -84,41 +83,29 @@
     val offset = remember { mutableStateOf(maxOffset) }
     val minOffset = remember { mutableStateOf(0f) }
 
-    val scrollObserver = object : ScrollCallback {
-        override fun onScroll(scrollDistance: Float): Float {
-            val resultingOffset = offset.value + scrollDistance
-            val toConsume =
-                when {
-                    resultingOffset > maxOffset -> {
-                        maxOffset - offset.value
-                    }
-                    resultingOffset < minOffset.value -> {
-                        minOffset.value - offset.value
-                    }
-                    else -> {
-                        scrollDistance
-                    }
-                }
-            offset.value = offset.value + toConsume
-            return toConsume
-        }
-    }
-
-    val canDrag: (Direction) -> Boolean = { direction ->
-        when {
-            direction == Direction.LEFT && offset.value > minOffset.value -> true
-            direction == Direction.UP && offset.value > minOffset.value -> true
-            direction == Direction.RIGHT && offset.value < maxOffset -> true
-            direction == Direction.DOWN && offset.value < maxOffset -> true
-            else -> false
-        }
-    }
-
     Layout(
         content = content,
-        modifier = Modifier.scrollGestureFilter(scrollObserver, orientation, canDrag).then(
-            ClipModifier
-        ),
+        modifier = Modifier.scrollable(
+            orientation = orientation,
+            controller = rememberScrollableController { scrollDistance ->
+                val resultingOffset = offset.value + scrollDistance
+                val toConsume =
+                    when {
+                        resultingOffset > maxOffset -> {
+                            maxOffset - offset.value
+                        }
+                        resultingOffset < minOffset.value -> {
+                            minOffset.value - offset.value
+                        }
+                        else -> {
+                            scrollDistance
+                        }
+                    }
+                offset.value = offset.value + toConsume
+                toConsume
+            }
+        )
+            .then(ClipModifier),
         measureBlock = { measurables, constraints ->
             val placeable =
                 when (orientation) {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
index 8410b39..30641c3 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.demos.gestures
 
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -30,13 +31,13 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.LongPressDragObserver
-import androidx.compose.ui.gesture.longPressDragGestureFilter
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.input.pointer.consumeAllChanges
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
 /**
- * Simple [longPressDragGestureFilter] demo.
+ * Simple [detectDragGesturesAfterLongPress] demo.
  */
 @Composable
 fun LongPressDragGestureFilterDemo() {
@@ -44,30 +45,8 @@
     val offset = remember { mutableStateOf(Offset.Zero) }
     val color = remember { mutableStateOf(Grey) }
 
-    val longPressDragObserver =
-        object : LongPressDragObserver {
-
-            override fun onLongPress(pxPosition: Offset) {
-                color.value = Red
-            }
-
-            override fun onDragStart() {
-                super.onDragStart()
-                color.value = Blue
-            }
-
-            override fun onDrag(dragDistance: Offset): Offset {
-                offset.value += dragDistance
-                return dragDistance
-            }
-
-            override fun onStop(velocity: Offset) {
-                color.value = Grey
-            }
-        }
-
     val (offsetX, offsetY) =
-        with(AmbientDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
+        with(LocalDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
 
     Column {
         Text("Demonstrates dragging that only begins once a long press has occurred!")
@@ -77,7 +56,16 @@
                 .fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .preferredSize(192.dp)
-                .longPressDragGestureFilter(longPressDragObserver)
+                .pointerInput {
+                    detectDragGesturesAfterLongPress(
+                        onDragStart = { color.value = Blue },
+                        onDragEnd = { color.value = Grey },
+                        onDragCancel = { color.value = Grey }
+                    ) { change, dragAmount ->
+                        offset.value += dragAmount
+                        change.consumeAllChanges()
+                    }
+                }
                 .background(color.value)
         )
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
index ac2a641..a3a9f8ea 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
@@ -20,6 +20,8 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.gestures.rememberScrollableController
+import androidx.compose.foundation.gestures.scrollable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -32,9 +34,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.Direction
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollGestureFilter
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.pointer.pointerInput
@@ -81,38 +80,29 @@
     val offset = remember { mutableStateOf(0f) }
     val maxOffset = remember { mutableStateOf(0f) }
 
-    val scrollObserver = object : ScrollCallback {
-        override fun onScroll(scrollDistance: Float): Float {
-            val resultingOffset = offset.value + scrollDistance
-            val dyToConsume =
-                when {
-                    resultingOffset > 0f -> {
-                        0f - offset.value
-                    }
-                    resultingOffset < maxOffset.value -> {
-                        maxOffset.value - offset.value
-                    }
-                    else -> {
-                        scrollDistance
-                    }
-                }
-            offset.value += dyToConsume
-            return dyToConsume
-        }
-    }
-
-    val canDrag = { direction: Direction ->
-        when (direction) {
-            Direction.UP -> true
-            Direction.DOWN -> true
-            else -> false
-        }
-    }
-
     Layout(
         content = content,
         modifier = Modifier
-            .scrollGestureFilter(scrollObserver, Orientation.Vertical, canDrag)
+            .scrollable(
+                orientation = Orientation.Vertical,
+                controller = rememberScrollableController { scrollDistance ->
+                    val resultingOffset = offset.value + scrollDistance
+                    val dyToConsume =
+                        when {
+                            resultingOffset > 0f -> {
+                                0f - offset.value
+                            }
+                            resultingOffset < maxOffset.value -> {
+                                maxOffset.value - offset.value
+                            }
+                            else -> {
+                                scrollDistance
+                            }
+                        }
+                    offset.value += dyToConsume
+                    dyToConsume
+                }
+            )
             .clipToBounds(),
         measureBlock = { measurables, constraints ->
             val placeable =
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
index 9b4bce7..8d22636 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.demos.gestures
 
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectDragGestures
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.preferredSize
@@ -28,9 +29,9 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.consumeAllChanges
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.round
@@ -41,15 +42,6 @@
     // TODO fix this demo in RTL (check when draggable handles RTL)
     val offset = remember { mutableStateOf(Offset.Zero) }
 
-    val observer = remember {
-        object : DragObserver {
-            override fun onDrag(dragDistance: Offset): Offset {
-                offset.value = offset.value + dragDistance
-                return dragDistance
-            }
-        }
-    }
-
     Column {
         Text("That is a pop up with a dragGestureFilter on it.  You can drag it around!")
         Popup(
@@ -59,7 +51,12 @@
             Box {
                 Box(
                     Modifier
-                        .dragGestureFilter(observer)
+                        .pointerInput {
+                            detectDragGestures { change, dragAmount ->
+                                offset.value = offset.value + dragAmount
+                                change.consumeAllChanges()
+                            }
+                        }
                         .preferredSize(70.dp)
                         .background(Color.Green, CircleShape),
                     contentAlignment = Alignment.Center
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
index 52197f7..c020f9b 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
@@ -17,6 +17,9 @@
 package androidx.compose.ui.demos.gestures
 
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.drag
+import androidx.compose.foundation.gestures.forEachGesture
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -30,27 +33,21 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.input.pointer.consumeAllChanges
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.input.pointer.positionChange
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
 /**
- * Simple [rawDragGestureFilter] demo.
+ * Simple [drag] demo.
  */
 @Composable
 fun RawDragGestureFilterDemo() {
     val offset = remember { mutableStateOf(Offset.Zero) }
 
-    val dragObserver = object : DragObserver {
-        override fun onDrag(dragDistance: Offset): Offset {
-            offset.value += dragDistance
-            return dragDistance
-        }
-    }
-
     val (offsetX, offsetY) =
-        with(AmbientDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
+        with(LocalDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
 
     Column {
         Text("Demonstrates dragging that starts immediately (no slop or anything else).")
@@ -60,7 +57,17 @@
                 .wrapContentSize(Alignment.Center)
                 .offset(offsetX, offsetY)
                 .preferredSize(192.dp)
-                .rawDragGestureFilter(dragObserver)
+                .pointerInput {
+                    forEachGesture {
+                        awaitPointerEventScope {
+                            val down = awaitFirstDown(requireUnconsumed = false)
+                            drag(down.id) { change ->
+                                offset.value += change.positionChange()
+                                change.consumeAllChanges()
+                            }
+                        }
+                    }
+                }
                 .background(Grey)
         )
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
index e63b42f..1ce8b4d 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
@@ -17,6 +17,8 @@
 package androidx.compose.ui.demos.gestures
 
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.rememberScrollableController
+import androidx.compose.foundation.gestures.scrollable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -29,12 +31,9 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollGestureFilter
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
@@ -70,29 +69,9 @@
     val color = remember { mutableStateOf(idleColor) }
     val offsetPx = remember { mutableStateOf(0f) }
 
-    val offsetDp = with(AmbientDensity.current) {
+    val offsetDp = with(LocalDensity.current) {
         offsetPx.value.toDp()
     }
-
-    val scrollCallback: ScrollCallback = object : ScrollCallback {
-        override fun onStart(downPosition: Offset) {
-            color.value = activeColor
-        }
-
-        override fun onScroll(scrollDistance: Float): Float {
-            offsetPx.value += scrollDistance
-            return scrollDistance
-        }
-
-        override fun onStop(velocity: Float) {
-            color.value = idleColor
-        }
-
-        override fun onCancel() {
-            color.value = idleColor
-        }
-    }
-
     val (offsetX, offsetY) = when (orientation) {
         Orientation.Horizontal -> offsetDp to Dp.Hairline
         Orientation.Vertical -> Dp.Hairline to offsetDp
@@ -102,7 +81,19 @@
         Modifier.offset(offsetX, offsetY)
             .fillMaxSize()
             .wrapContentSize(Alignment.Center)
-            .scrollGestureFilter(scrollCallback, orientation)
+            .scrollable(
+                orientation = orientation,
+                onScrollStarted = {
+                    color.value = activeColor
+                },
+                onScrollStopped = {
+                    color.value = idleColor
+                },
+                controller = rememberScrollableController { scrollDistance ->
+                    offsetPx.value += scrollDistance
+                    scrollDistance
+                }
+            )
             .preferredSize(size)
             .background(color.value)
     ) {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
index 3a9635c..f6d699e 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
@@ -17,6 +17,8 @@
 package androidx.compose.ui.demos.gestures
 
 import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectHorizontalDragGestures
+import androidx.compose.foundation.gestures.detectVerticalDragGestures
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -30,15 +32,14 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.Direction
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.input.pointer.consumeAllChanges
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 
 /**
- * Simple [dragGestureFilter] demo.
+ * Simple [detectVerticalDragGestures] and [detectHorizontalDragGestures] demo.
  */
 @Composable
 fun DragGestureFilterDemo() {
@@ -49,54 +50,6 @@
     val offset = remember { mutableStateOf(Offset.Zero) }
     val canStartVertically = remember { mutableStateOf(true) }
 
-    val dragObserver =
-        if (canStartVertically.value) {
-            object : DragObserver {
-                override fun onDrag(dragDistance: Offset): Offset {
-                    offset.value =
-                        Offset(x = offset.value.x, y = offset.value.y + dragDistance.y)
-                    return dragDistance
-                }
-
-                override fun onStop(velocity: Offset) {
-                    canStartVertically.value = !canStartVertically.value
-                    super.onStop(velocity)
-                }
-            }
-        } else {
-            object : DragObserver {
-                override fun onDrag(dragDistance: Offset): Offset {
-                    offset.value =
-                        Offset(x = offset.value.x + dragDistance.x, y = offset.value.y)
-                    return dragDistance
-                }
-
-                override fun onStop(velocity: Offset) {
-                    canStartVertically.value = !canStartVertically.value
-                    super.onStop(velocity)
-                }
-            }
-        }
-
-    val canDrag =
-        if (canStartVertically.value) {
-            { direction: Direction ->
-                when (direction) {
-                    Direction.DOWN -> true
-                    Direction.UP -> true
-                    else -> false
-                }
-            }
-        } else {
-            { direction: Direction ->
-                when (direction) {
-                    Direction.LEFT -> true
-                    Direction.RIGHT -> true
-                    else -> false
-                }
-            }
-        }
-
     val color =
         if (canStartVertically.value) {
             verticalColor
@@ -105,7 +58,7 @@
         }
 
     val (offsetX, offsetY) =
-        with(AmbientDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
+        with(LocalDensity.current) { offset.value.x.toDp() to offset.value.y.toDp() }
 
     Column {
         Text(
@@ -121,7 +74,25 @@
                 .fillMaxSize()
                 .wrapContentSize(Alignment.Center)
                 .preferredSize(192.dp)
-                .dragGestureFilter(dragObserver, canDrag)
+                .pointerInput {
+                    if (canStartVertically.value) {
+                        detectVerticalDragGestures(
+                            onDragEnd = { canStartVertically.value = !canStartVertically.value }
+                        ) { change, dragDistance ->
+                            offset.value =
+                                Offset(x = offset.value.x, y = offset.value.y + dragDistance)
+                            change.consumeAllChanges()
+                        }
+                    } else {
+                        detectHorizontalDragGestures(
+                            onDragEnd = { canStartVertically.value = !canStartVertically.value }
+                        ) { change, dragDistance ->
+                            offset.value =
+                                Offset(x = offset.value.x + dragDistance, y = offset.value.y)
+                            change.consumeAllChanges()
+                        }
+                    }
+                }
                 .background(color)
         )
     }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
index 2ae219a..b6bda14 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
@@ -19,6 +19,8 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.gestures.rememberScrollableController
+import androidx.compose.foundation.gestures.scrollable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
@@ -38,16 +40,13 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.gesture.Direction
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollGestureFilter
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
 import androidx.compose.ui.graphics.drawscope.clipRect
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -81,32 +80,24 @@
 private fun DrawerLayout(drawerWidth: Dp, content: @Composable ColumnScope.() -> Unit) {
 
     val minOffset =
-        with(AmbientDensity.current) {
+        with(LocalDensity.current) {
             -drawerWidth.toPx()
         }
 
     val currentOffset = remember { mutableStateOf(minOffset) }
     val maxOffset = 0f
 
-    val scrollObserver = object : ScrollCallback {
-        override fun onScroll(scrollDistance: Float): Float {
-            val originalOffset = currentOffset.value
-            currentOffset.value =
-                (currentOffset.value + scrollDistance).coerceIn(minOffset, maxOffset)
-            return currentOffset.value - originalOffset
-        }
-    }
-
-    val canDrag: (Direction) -> Boolean =
-        { direction ->
-            when (direction) {
-                Direction.LEFT -> currentOffset.value > minOffset
-                Direction.RIGHT -> currentOffset.value < 0
-                else -> false
+    Box(
+        Modifier.scrollable(
+            orientation = Orientation.Horizontal,
+            controller = rememberScrollableController { scrollDistance ->
+                val originalOffset = currentOffset.value
+                currentOffset.value =
+                    (currentOffset.value + scrollDistance).coerceIn(minOffset, maxOffset)
+                currentOffset.value - originalOffset
             }
-        }
-
-    Box(Modifier.scrollGestureFilter(scrollObserver, Orientation.Horizontal, canDrag)) {
+        )
+    ) {
         Column {
             content()
         }
@@ -136,41 +127,28 @@
     val offset = remember { mutableStateOf(maxOffset) }
     val minOffset = remember { mutableStateOf(0f) }
 
-    val scrollObserver = object : ScrollCallback {
-        override fun onScroll(scrollDistance: Float): Float {
-            val resultingOffset = offset.value + scrollDistance
-            val toConsume =
-                when {
-                    resultingOffset > maxOffset -> {
-                        maxOffset - offset.value
-                    }
-                    resultingOffset < minOffset.value -> {
-                        minOffset.value - offset.value
-                    }
-                    else -> {
-                        scrollDistance
-                    }
-                }
-            offset.value = offset.value + toConsume
-            return toConsume
-        }
-    }
-
-    val canDrag: (Direction) -> Boolean = { direction ->
-        when {
-            direction == Direction.LEFT && offset.value > minOffset.value -> true
-            direction == Direction.UP && offset.value > minOffset.value -> true
-            direction == Direction.RIGHT && offset.value < maxOffset -> true
-            direction == Direction.DOWN && offset.value < maxOffset -> true
-            else -> false
-        }
-    }
-
     Layout(
         content = content,
-        modifier = Modifier.scrollGestureFilter(scrollObserver, orientation, canDrag).then(
-            ClipModifier
-        ),
+        modifier = Modifier.scrollable(
+            orientation = orientation,
+            controller = rememberScrollableController { scrollDistance ->
+                val resultingOffset = offset.value + scrollDistance
+                val toConsume =
+                    when {
+                        resultingOffset > maxOffset -> {
+                            maxOffset - offset.value
+                        }
+                        resultingOffset < minOffset.value -> {
+                            minOffset.value - offset.value
+                        }
+                        else -> {
+                            scrollDistance
+                        }
+                    }
+                offset.value = offset.value + toConsume
+                toConsume
+            }
+        ).then(ClipModifier),
         measureBlock = { measurables, constraints ->
             val placeable =
                 when (orientation) {
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
index 5500315..a21be08d 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
@@ -34,7 +34,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
 import androidx.compose.ui.graphics.nativeCanvas
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.core.content.ContextCompat
@@ -56,7 +56,7 @@
 @Sampled
 @Composable
 fun AndroidDrawableInDrawScopeSample() {
-    val drawable = ContextCompat.getDrawable(AmbientContext.current, R.drawable.sample_drawable)
+    val drawable = ContextCompat.getDrawable(LocalContext.current, R.drawable.sample_drawable)
     Box(
         modifier = Modifier.size(100.dp)
             .drawBehind {
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
index 224d685..3dc1313 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/NestedScrollSamples.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.samples
 
 import androidx.annotation.Sampled
diff --git a/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml b/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml
index 5179b0f..b6b7f01 100644
--- a/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml
+++ b/compose/ui/ui/src/androidAndroidTest/AndroidManifest.xml
@@ -15,7 +15,9 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.compose.ui">
-    <application>
+    <application
+        android:supportsRtl="true"
+        >
         <activity
             android:name="androidx.compose.ui.test.TestActivity"
             android:theme="@android:style/Theme.Material.NoActionBar.Fullscreen" />
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt
index 9a187f8..775a03d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AccessibilityIteratorsTest.kt
@@ -26,7 +26,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.platform.AccessibilityIterators
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -426,8 +426,8 @@
     ): TextLayoutResult {
         var textLayoutResult: TextLayoutResult? = null
         rule.setContent {
-            // TODO(yingleiw): use predefined DensityAmbient.current when b/163142237 is fixed.
-            with(AmbientDensity.current) {
+            // TODO(yingleiw): use predefined LocalDensity.current when b/163142237 is fixed.
+            with(LocalDensity.current) {
                 BasicText(
                     style = TextStyle(
                         fontSize = fontSize,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
index d503b0f..e550312 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
@@ -25,9 +25,9 @@
 import androidx.activity.ComponentActivity
 import androidx.compose.ui.node.InnerPlaceable
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.platform.AmbientClipboardManager
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat
+import androidx.compose.ui.platform.LocalClipboardManager
 import androidx.compose.ui.semantics.ProgressBarRangeInfo
 import androidx.compose.ui.semantics.ScrollAxisRange
 import androidx.compose.ui.semantics.SemanticsModifierCore
@@ -35,6 +35,7 @@
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsWrapper
+import androidx.compose.ui.semantics.collapse
 import androidx.compose.ui.semantics.heading
 import androidx.compose.ui.semantics.copyText
 import androidx.compose.ui.semantics.cutText
@@ -42,6 +43,7 @@
 import androidx.compose.ui.semantics.stateDescription
 import androidx.compose.ui.semantics.progressBarRangeInfo
 import androidx.compose.ui.semantics.dismiss
+import androidx.compose.ui.semantics.expand
 import androidx.compose.ui.semantics.focused
 import androidx.compose.ui.semantics.getTextLayoutResult
 import androidx.compose.ui.semantics.horizontalScrollAxisRange
@@ -112,7 +114,7 @@
             accessibilityDelegate.accessibilityForceEnabledForTesting = true
         }
         rule.setContent {
-            AmbientClipboardManager.current.setText(AnnotatedString("test"))
+            LocalClipboardManager.current.setText(AnnotatedString("test"))
         }
         info = AccessibilityNodeInfoCompat.obtain()
     }
@@ -126,12 +128,16 @@
     fun testPopulateAccessibilityNodeInfoProperties_general() {
         val clickActionLabel = "click"
         val dismissActionLabel = "dismiss"
+        val expandActionLabel = "expand"
+        val collapseActionLabel = "collapse"
         val stateDescription = "checked"
         val semanticsNode = createSemanticsNodeWithProperties(1, true) {
             this.stateDescription = stateDescription
             heading()
             onClick(clickActionLabel) { true }
             dismiss(dismissActionLabel) { true }
+            expand(expandActionLabel) { true }
+            collapse(collapseActionLabel) { true }
         }
         accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, semanticsNode)
         assertEquals("android.view.View", info.className)
@@ -153,6 +159,24 @@
                 )
             )
         )
+        assertTrue(
+            containsAction(
+                info,
+                AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+                    AccessibilityNodeInfoCompat.ACTION_EXPAND,
+                    expandActionLabel
+                )
+            )
+        )
+        assertTrue(
+            containsAction(
+                info,
+                AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+                    AccessibilityNodeInfoCompat.ACTION_COLLAPSE,
+                    collapseActionLabel
+                )
+            )
+        )
         val stateDescriptionResult = when {
             Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
                 info.unwrap().stateDescription
@@ -177,7 +201,7 @@
         val semanticsNode = createSemanticsNodeWithProperties(1, true) {
             disabled()
             text = AnnotatedString("text")
-            horizontalScrollAxisRange = ScrollAxisRange(0f, 5f)
+            horizontalScrollAxisRange = ScrollAxisRange({ 0f }, { 5f })
             onClick { true }
             onLongClick { true }
             copyText { true }
@@ -186,6 +210,8 @@
             setText { true }
             setSelection { _, _, _ -> true }
             dismiss { true }
+            expand { true }
+            collapse { true }
         }
         accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, semanticsNode)
         assertTrue(info.isClickable)
@@ -242,6 +268,18 @@
         assertFalse(
             containsAction(
                 info,
+                AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_EXPAND
+            )
+        )
+        assertFalse(
+            containsAction(
+                info,
+                AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_COLLAPSE
+            )
+        )
+        assertFalse(
+            containsAction(
+                info,
                 AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_FORWARD
             )
         )
@@ -449,7 +487,7 @@
     @Test
     fun notSendScrollEvent_whenOnlyScrollAxisRangeMaxValueChanges() {
         val oldSemanticsNode = createSemanticsNodeWithProperties(1, true) {
-            this.verticalScrollAxisRange = ScrollAxisRange(0f, 0f, false)
+            this.verticalScrollAxisRange = ScrollAxisRange({ 0f }, { 0f }, false)
         }
         accessibilityDelegate.previousSemanticsNodes[1] =
             AndroidComposeViewAccessibilityDelegateCompat.SemanticsNodeCopy(
@@ -457,7 +495,7 @@
                 mapOf()
             )
         val newSemanticsNode = createSemanticsNodeWithProperties(1, true) {
-            this.verticalScrollAxisRange = ScrollAxisRange(0f, 5f, false)
+            this.verticalScrollAxisRange = ScrollAxisRange({ 0f }, { 5f }, false)
         }
         val newNodes = mutableMapOf<Int, SemanticsNode>()
         newNodes[1] = newSemanticsNode
@@ -476,7 +514,7 @@
     @Test
     fun sendScrollEvent_whenScrollAxisRangeValueChanges() {
         val oldSemanticsNode = createSemanticsNodeWithProperties(2, false) {
-            this.verticalScrollAxisRange = ScrollAxisRange(0f, 5f, false)
+            this.verticalScrollAxisRange = ScrollAxisRange({ 0f }, { 5f }, false)
         }
         accessibilityDelegate.previousSemanticsNodes[2] =
             AndroidComposeViewAccessibilityDelegateCompat.SemanticsNodeCopy(
@@ -484,7 +522,7 @@
                 mapOf()
             )
         val newSemanticsNode = createSemanticsNodeWithProperties(2, false) {
-            this.verticalScrollAxisRange = ScrollAxisRange(2f, 5f, false)
+            this.verticalScrollAxisRange = ScrollAxisRange({ 2f }, { 5f }, false)
         }
         val newNodes = mutableMapOf<Int, SemanticsNode>()
         newNodes[2] = newSemanticsNode
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index 4eca29f..68ad08d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -82,11 +82,11 @@
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.Owner
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.RenderNodeApi23
 import androidx.compose.ui.platform.RenderNodeApi29
 import androidx.compose.ui.platform.ViewCompositionStrategy
@@ -1999,7 +1999,7 @@
         val layoutDirection = Ref<LayoutDirection>()
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     FixedSize(
                         size = 50,
                         modifier = Modifier.drawBehind {
@@ -2032,7 +2032,7 @@
         }
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     FixedSize(
                         size = 50,
                         modifier = layoutModifier
@@ -2820,7 +2820,7 @@
         var zIndex by mutableStateOf(0f)
         activityTestRule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     FixedSize(
                         size = 30,
                         modifier = Modifier.background(color = Color.Blue).drawLatchModifier()
@@ -3044,7 +3044,7 @@
                 ViewCompositionStrategy.DisposeOnLifecycleDestroyed(activity)
             )
             view.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier
                             .background(Color.Blue)
@@ -3088,7 +3088,7 @@
         activityTestRule.runOnUiThread {
             view = ComposeView(activity)
             view.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier
                             .background(Color.Blue)
@@ -3141,7 +3141,7 @@
         val sizeModifier = Modifier.layout { measurable, constraints ->
             measuredSize = size
             layoutLatch.countDown()
-            val pxSize = size.toIntPx()
+            val pxSize = size.roundToPx()
             layout(pxSize, pxSize) {
                 measurable.measure(constraints).place(0, 0)
             }
@@ -3346,7 +3346,7 @@
             activity.setContent {
                 FixedSize(30, Modifier.background(Color.Blue)) {
                     FixedSize(30, Modifier.graphicsLayer()) {
-                        with(AmbientDensity.current) {
+                        with(LocalDensity.current) {
                             Canvas(Modifier.size(10.toDp())) {
                                 drawRect(color)
                                 drawLatch.countDown()
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt
index 8119ae9..ecc7b203 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/autofill/AndroidAutoFillTest.kt
@@ -24,9 +24,9 @@
 import androidx.compose.testutils.fake.FakeViewStructure
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.platform.AmbientAutofill
-import androidx.compose.ui.platform.AmbientAutofillTree
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalAutofill
+import androidx.compose.ui.platform.LocalAutofillTree
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
@@ -51,27 +51,27 @@
     @Before
     fun setup() {
         rule.setContent {
-            ownerView = AmbientView.current
-            autofill = AmbientAutofill.current
-            autofillTree = AmbientAutofillTree.current
+            ownerView = LocalView.current
+            autofill = LocalAutofill.current
+            autofillTree = LocalAutofillTree.current
         }
     }
 
     @SdkSuppress(maxSdkVersion = 25)
     @Test
-    fun autofillAmbient_belowApi26_isNull() {
+    fun autofillCompositionLocal_belowApi26_isNull() {
         assertThat(autofill).isNull()
     }
 
     @SdkSuppress(minSdkVersion = 26)
     @Test
-    fun autofillAmbient_isNotNull() {
+    fun autofillCompositionLocal_isNotNull() {
         assertThat(autofill).isNotNull()
     }
 
     @SdkSuppress(minSdkVersion = 26)
     @Test
-    fun autofillAmbient_returnsAnInstanceOfAndroidAutofill() {
+    fun autofillCompositionLocal_returnsAnInstanceOfAndroidAutofill() {
         assertThat(autofill).isInstanceOf(AndroidAutofill::class.java)
     }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
index b27892f..ea70e78 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
@@ -40,7 +40,7 @@
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.padding
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.runOnUiThreadIR
 import androidx.compose.ui.test.TestActivity
@@ -485,7 +485,7 @@
 
         rule.runOnUiThreadIR {
             activity.setContent {
-                Providers(AmbientLayoutDirection provides direction.value) {
+                Providers(LocalLayoutDirection provides direction.value) {
                     AtLeastSize(
                         size = 30,
                         modifier = Modifier.fillColor(Color.Green)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
index ea680c0..fc75a60 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawModifierTest.kt
@@ -33,8 +33,8 @@
 import androidx.compose.ui.graphics.asAndroidBitmap
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.SemanticsNodeInteraction
@@ -275,7 +275,7 @@
         var layoutDirection by mutableStateOf(LayoutDirection.Ltr)
         var realLayoutDirection: LayoutDirection? = null
         rule.setContent {
-            Providers(AmbientLayoutDirection provides layoutDirection) {
+            Providers(LocalLayoutDirection provides layoutDirection) {
                 AtLeastSize(
                     size = 10,
                     modifier = Modifier.drawWithCache {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
index e330766..919897f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
@@ -46,7 +46,7 @@
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.layout.positionInWindow
 import androidx.compose.ui.padding
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.test.captureToImage
@@ -298,7 +298,7 @@
         var coords1: LayoutCoordinates? = null
         var coords2: LayoutCoordinates? = null
         rule.setContent {
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 Box(
                     Modifier.size(25.toDp())
                         .graphicsLayer(
@@ -460,7 +460,7 @@
         var testDpConversion = 0f
         var testFontScaleConversion = 0f
         rule.setContent {
-            density = AmbientDensity.current
+            density = LocalDensity.current
             // Verify that the current density is passed to the graphics layer
             // implementation and that density dependent methods are consuming it
             Box(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
index 0c5a30f..4640edb 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
@@ -172,7 +172,7 @@
 @Composable
 private fun MeasureInLayoutBlock(content: @Composable () -> Unit) {
     Layout(content = content) { measurables, constraints ->
-        val size = 5.dp.toIntPx()
+        val size = 5.dp.roundToPx()
         layout(size, size) {
             measurables.first().measure(constraints).place(0, 0)
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt
index 381020a..b33c285 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/PainterModifierTest.kt
@@ -60,9 +60,9 @@
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
@@ -494,8 +494,8 @@
         var composableWidth = 0f
         var composableHeight = 0f
         rule.setContent {
-            composableWidth = composableWidthPx / AmbientDensity.current.density
-            composableHeight = composableHeightPx / AmbientDensity.current.density
+            composableWidth = composableWidthPx / LocalDensity.current.density
+            composableHeight = composableHeightPx / LocalDensity.current.density
             // Because the painter is told to fit inside the constraints, the width should
             // match that of the provided fixed width and the height should match that of the
             // composable as no scaling is being done
@@ -540,8 +540,8 @@
                 modifier = Modifier
                     .testTag(testTag)
                     .background(color = Color.Gray)
-                    .width((boxWidth / AmbientDensity.current.density).dp)
-                    .height((boxHeight / AmbientDensity.current.density).dp)
+                    .width((boxWidth / LocalDensity.current.density).dp)
+                    .height((boxHeight / LocalDensity.current.density).dp)
                     .paint(ImagePainter(srcImage), contentScale = ContentScale.FillHeight)
             )
         }
@@ -585,8 +585,8 @@
                 modifier = Modifier
                     .testTag(testTag)
                     .background(color = Color.Gray)
-                    .width((boxWidth / AmbientDensity.current.density).dp)
-                    .height((boxHeight / AmbientDensity.current.density).dp)
+                    .width((boxWidth / LocalDensity.current.density).dp)
+                    .height((boxHeight / LocalDensity.current.density).dp)
                     .paint(ImagePainter(srcImage), contentScale = ContentScale.FillBounds)
             )
         }
@@ -608,12 +608,12 @@
         val vectorWidth = 100
         val vectorHeight = 200
         rule.setContent {
-            val vectorWidthDp = (vectorWidth / AmbientDensity.current.density).dp
-            val vectorHeightDp = (vectorHeight / AmbientDensity.current.density).dp
+            val vectorWidthDp = (vectorWidth / LocalDensity.current.density).dp
+            val vectorHeightDp = (vectorHeight / LocalDensity.current.density).dp
             Box(
                 modifier = Modifier.background(color = Color.Gray)
-                    .width((boxWidth / AmbientDensity.current.density).dp)
-                    .height((boxHeight / AmbientDensity.current.density).dp)
+                    .width((boxWidth / LocalDensity.current.density).dp)
+                    .height((boxHeight / LocalDensity.current.density).dp)
                     .paint(
                         rememberVectorPainter(
                             defaultWidth = vectorWidthDp,
@@ -679,7 +679,7 @@
     ) {
         val p = TestPainter(containerWidth, containerHeight)
         val layoutDirection = if (rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
-        Providers(AmbientLayoutDirection provides layoutDirection) {
+        Providers(LocalLayoutDirection provides layoutDirection) {
             AtLeastSize(
                 modifier = Modifier.background(Color.White)
                     .paint(p, alpha = alpha, colorFilter = colorFilter),
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
index 65d53ce..3419f1a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
@@ -31,8 +31,8 @@
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.luminance
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.setContent
@@ -168,7 +168,7 @@
         rule.runOnUiThreadIR {
             activity.setContent {
                 AtLeastSize(size = 12, modifier = Modifier.background(Color.White)) {
-                    val elevation = with(AmbientDensity.current) { 4.dp.toPx() }
+                    val elevation = with(LocalDensity.current) { 4.dp.toPx() }
                     AtLeastSize(
                         size = 10,
                         modifier = Modifier.graphicsLayer(
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 8bf3664..57e720e 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
@@ -31,7 +31,7 @@
 import androidx.compose.ui.input.key.Key.Companion.DirectionRight
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.nativeKeyCode
-import androidx.compose.ui.platform.AmbientFocusManager
+import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onRoot
 import androidx.compose.ui.test.performKeyPress
@@ -64,7 +64,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(
                     Modifier
@@ -111,7 +111,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(
                     Modifier
@@ -159,7 +159,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Column {
                 Box(
                     Modifier
@@ -207,7 +207,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Column {
                 Box(
                     Modifier
@@ -255,7 +255,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(
                     Modifier
@@ -303,7 +303,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(
                     Modifier
@@ -342,7 +342,7 @@
         }
     }
 
-    // TODO(b/176847718): Verify that this test works correctly when the AmbientLayoutDirection
+    // TODO(b/176847718): Verify that this test works correctly when the LocalLayoutDirection
     //  changes.
     @Test
     fun focusOrder_start() {
@@ -353,7 +353,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(
                     Modifier
@@ -392,7 +392,7 @@
         }
     }
 
-    // TODO(b/176847718): Verify that this test works correctly when the AmbientLayoutDirection
+    // TODO(b/176847718): Verify that this test works correctly when the LocalLayoutDirection
     //  changes.
     @Test
     fun focusOrder_end() {
@@ -403,7 +403,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(
                     Modifier
@@ -452,7 +452,7 @@
         val (item1, item3, item4) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(Modifier.focusOrder { next = item4 }) {
                     Box(
@@ -508,7 +508,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(Modifier.focusOrder { next = FocusRequester.Default }) {
                     Box(
@@ -559,7 +559,7 @@
         val (item1, item3) = FocusRequester.createRefs()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Row {
                 Box(Modifier.focusOrder { }) {
                     Box(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
index 0ac562c..61f5624 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusState.Inactive
 import androidx.compose.ui.focus.FocusState.Active
-import androidx.compose.ui.platform.AmbientFocusManager
+import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -122,7 +122,7 @@
         val focusRequester = FocusRequester()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
index a141dbf..a1ee37e 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusState.Inactive
 import androidx.compose.ui.focus.FocusState.Active
-import androidx.compose.ui.platform.AmbientFocusManager
+import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -128,7 +128,7 @@
         val focusRequester = FocusRequester()
         lateinit var focusManager: FocusManager
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             Box(
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerAmbientTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
similarity index 94%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerAmbientTest.kt
rename to compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
index befabec..da8e12d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerAmbientTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
@@ -21,7 +21,7 @@
 import androidx.compose.ui.focus.FocusState.Active
 import androidx.compose.ui.focus.FocusState.ActiveParent
 import androidx.compose.ui.focus.FocusState.Inactive
-import androidx.compose.ui.platform.AmbientFocusManager
+import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -32,7 +32,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class FocusManagerAmbientTest {
+class FocusManagerCompositionLocalTest {
     @get:Rule
     val rule = createComposeRule()
 
@@ -43,7 +43,7 @@
         lateinit var focusRequester: FocusRequester
         var focusState = Inactive
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             focusRequester = FocusRequester()
             Box(
                 modifier = Modifier
@@ -73,7 +73,7 @@
         var parentFocusState = Inactive
         var grandparentFocusState = Inactive
         rule.setFocusableContent {
-            focusManager = AmbientFocusManager.current
+            focusManager = LocalFocusManager.current
             focusRequester = FocusRequester()
             Box(
                 modifier = Modifier
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
index f88d22f..2817d61 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusState.Active
 import androidx.compose.ui.focus.FocusState.Inactive
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -259,7 +259,7 @@
         var focusState = Inactive
         val (focusRequester1, focusRequester2) = FocusRequester.createRefs()
         rule.setFocusableContent {
-            hostView = AmbientView.current
+            hostView = LocalView.current
             Column(
                 modifier = Modifier.onFocusChanged { focusState = it }
             ) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
index 8a8ff4f..b171637 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
@@ -21,7 +21,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusState.Active
 import androidx.compose.ui.focus.FocusState.Inactive
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -46,7 +46,7 @@
         lateinit var ownerView: View
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
@@ -73,7 +73,7 @@
         var focusState = Inactive
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
@@ -101,7 +101,7 @@
         var focusState = Inactive
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
@@ -128,7 +128,7 @@
         var focusState = Inactive
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
@@ -158,7 +158,7 @@
         var focusState = Inactive
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
@@ -188,7 +188,7 @@
         var didViewFocusChange = false
         lateinit var ownerView: View
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(Modifier.testTag(nonClickable))
         }
         rule.runOnIdle {
@@ -218,7 +218,7 @@
         var didViewFocusChange = false
         lateinit var ownerView: View
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(Modifier.testTag(nonClickable))
         }
         rule.runOnIdle { assertThat(ownerView.isFocused).isFalse() }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilterTest.kt
index 11f062a..62637532 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilterTest.kt
@@ -13,6 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import android.view.MotionEvent
@@ -49,6 +52,7 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
+
 class LongPressDragGestureFilterTest {
     @Suppress("DEPRECATION")
     @get:Rule
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterComposeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterComposeTest.kt
index 1c831a9..b40af3a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterComposeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterComposeTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.ui.Modifier
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilterComposeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilterComposeTest.kt
index 17cfbce..a10ae48 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilterComposeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilterComposeTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.ui.Modifier
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/ScrollGestureFilterComposeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/ScrollGestureFilterComposeTest.kt
index 20ae38b..9a7d4c1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/ScrollGestureFilterComposeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/ScrollGestureFilterComposeTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.ui.Modifier
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/TouchSlopDragGestureFilterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/TouchSlopDragGestureFilterTest.kt
index 6c82d04..917da4b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/TouchSlopDragGestureFilterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/gesture/TouchSlopDragGestureFilterTest.kt
@@ -13,6 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import android.view.MotionEvent
@@ -22,7 +25,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.test.TestActivity
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -265,7 +268,7 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 Box {
-                    touchSlop = with(AmbientDensity.current) { TouchSlop.toPx() }
+                    touchSlop = with(LocalDensity.current) { TouchSlop.toPx() }
                     Layout(
                         modifier = Modifier.dragGestureFilter(
                             dragObserver,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
index 39fc20b..c444d72 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
@@ -25,7 +25,7 @@
 import androidx.compose.ui.draw.paint
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.res.loadVectorResource
 import androidx.compose.ui.test.R
 
@@ -48,12 +48,12 @@
         vectorState = state
 
         val imageVector = loadVectorResource(state.value)
-        with(AmbientDensity.current) {
+        with(LocalDensity.current) {
             imageVector.resource.resource?.let {
                 val width = it.defaultWidth
-                vectorSize = width.toIntPx()
+                vectorSize = width.roundToPx()
                 AtLeastSize(
-                    size = width.toIntPx(),
+                    size = width.roundToPx(),
                     modifier = WhiteBackground.paint(rememberVectorPainter(it))
                 ) {
                     measured = true
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
index 3847526..3bb8f81 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
@@ -39,7 +39,7 @@
 import androidx.compose.ui.graphics.asAndroidBitmap
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.layout.ContentScale
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -326,7 +326,7 @@
         tintColor: Color = Color.Unspecified
     ): VectorPainter {
         val sizePx = size.toFloat()
-        val sizeDp = (size / AmbientDensity.current.density).dp
+        val sizeDp = (size / LocalDensity.current.density).dp
         return rememberVectorPainter(
             defaultWidth = sizeDp,
             defaultHeight = sizeDp,
@@ -352,7 +352,7 @@
         alignment: Alignment = Alignment.Center
     ) {
         val sizePx = size.toFloat()
-        val sizeDp = (size / AmbientDensity.current.density).dp
+        val sizeDp = (size / LocalDensity.current.density).dp
         val background = Modifier.paint(
             rememberVectorPainter(
                 defaultWidth = sizeDp,
@@ -405,7 +405,7 @@
         alignment: Alignment = Alignment.Center
     ) {
         val sizePx = size.toFloat()
-        val sizeDp = (size / AmbientDensity.current.density).dp
+        val sizeDp = (size / LocalDensity.current.density).dp
         val background = Modifier.paint(
             rememberVectorPainter(
                 defaultWidth = sizeDp,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
index 91f9ae1..750100f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.input.key.Key.Companion.A
 import androidx.compose.ui.input.key.KeyEventType.KeyDown
 import androidx.compose.ui.input.key.KeyEventType.KeyUp
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
@@ -62,7 +62,7 @@
         var receivedKeyEvent: KeyEvent? = null
         val focusRequester = FocusRequester()
         rule.setFocusableContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt
index 3d6a2c6..6614cf7 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/ClipPointerInputTest.kt
@@ -28,7 +28,7 @@
 import androidx.compose.ui.gesture.PointerCoords
 import androidx.compose.ui.gesture.PointerProperties
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.runOnUiThreadIR
 import androidx.compose.ui.test.TestActivity
@@ -223,7 +223,7 @@
         rule.runOnUiThreadIR {
             activity.setContent {
 
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
 
                     val children = @Composable {
                         Child(Modifier.offset((-1f).toDp(), (-1f).toDp()).then(loggingPim1))
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
index d492eac..e8cce0f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
@@ -34,7 +34,7 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.down
@@ -87,11 +87,11 @@
 
             val latchDrawModifier = Modifier.drawBehind { latch?.countDown() }
 
-            val containerDp = (200.0f / AmbientDensity.current.density).dp
-            val boxDp = (50.0f / AmbientDensity.current.density).dp
+            val containerDp = (200.0f / LocalDensity.current.density).dp
+            val boxDp = (50.0f / LocalDensity.current.density).dp
 
-            val offsetX = (270.0f / AmbientDensity.current.density).dp
-            val offsetY = (120.0f / AmbientDensity.current.density).dp
+            val offsetX = (270.0f / LocalDensity.current.density).dp
+            val offsetY = (120.0f / LocalDensity.current.density).dp
             Box(Modifier.testTag(testTag)) {
                 SimpleLayout(
                     modifier = Modifier.fillMaxSize().offset(offsetX, offsetY)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt
index 190561d..0e3ba43 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterAndroidViewOffsetsTest.kt
@@ -26,8 +26,8 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.padding
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.compose.ui.unit.dp
@@ -90,7 +90,7 @@
                 )
                 setPadding(3, 13, 0, 0)
                 setContent {
-                    with(AmbientDensity.current) {
+                    with(LocalDensity.current) {
                         // Box is "three"
                         Box(
                             Modifier.padding(start = (2f / density).dp, top = (12f / density).dp)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt
index ab8ec19..00fcd3d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilterComposeHookupTest.kt
@@ -25,8 +25,8 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -63,7 +63,7 @@
 
             val parent = ComposeView(activity).apply {
                 setContent {
-                    with(AmbientDensity.current) {
+                    with(LocalDensity.current) {
                         Box(
                             modifier = Modifier
                                 .spyGestureFilter {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/LayoutDensityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/LayoutDensityTest.kt
index 06d73c6..4571566 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/LayoutDensityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/LayoutDensityTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.Density
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -38,14 +38,14 @@
     val rule = createComposeRule()
 
     @Test
-    fun layoutReadsAmbientDensity() {
-        var ambientDensity by mutableStateOf(5f)
-        var ambientFontScale by mutableStateOf(7f)
+    fun layoutReadsCompositionLocalDensity() {
+        var localDensity by mutableStateOf(5f)
+        var localFontScale by mutableStateOf(7f)
 
         var measureScopeDensity = 0f
         var measureScopeFontScale = 0f
         rule.setContent {
-            Providers(AmbientDensity provides Density(ambientDensity, ambientFontScale)) {
+            Providers(LocalDensity provides Density(localDensity, localFontScale)) {
                 Layout({}) { _, _ ->
                     measureScopeDensity = density
                     measureScopeFontScale = fontScale
@@ -55,15 +55,15 @@
         }
 
         rule.runOnIdle {
-            Assert.assertEquals(ambientDensity, measureScopeDensity)
-            Assert.assertEquals(ambientFontScale, measureScopeFontScale)
-            ambientDensity = 9f
-            ambientFontScale = 11f
+            Assert.assertEquals(localDensity, measureScopeDensity)
+            Assert.assertEquals(localFontScale, measureScopeFontScale)
+            localDensity = 9f
+            localFontScale = 11f
         }
 
         rule.runOnIdle {
-            Assert.assertEquals(ambientDensity, measureScopeDensity)
-            Assert.assertEquals(ambientFontScale, measureScopeFontScale)
+            Assert.assertEquals(localDensity, measureScopeDensity)
+            Assert.assertEquals(localFontScale, measureScopeFontScale)
         }
     }
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
index 8d0b574..8024c086 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
@@ -37,8 +37,8 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.padding
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.runOnUiThreadIR
 import androidx.compose.ui.test.TestActivity
@@ -399,7 +399,7 @@
 
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     DelayedMeasure(50) {
                         Box(Modifier.size(25.toDp())) {
                             Box(
@@ -445,7 +445,7 @@
         val positionedLatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier.fillMaxSize()
                             .padding(start = paddingLeftPx.toDp(), top = paddingTopPx.toDp())
@@ -474,7 +474,7 @@
         val positionedLatch = CountDownLatch(2)
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier.padding(start = firstPaddingPx.toDp()).then(
                             Modifier.onGloballyPositioned {
@@ -575,7 +575,7 @@
         var positionedLatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box {
                         Box(
                             Modifier.onGloballyPositioned {
@@ -608,7 +608,7 @@
         var positionedLatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box {
                         Offset(left) {
                             Box(Modifier.size(10.toDp())) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt
index 186a2b0..50a78e1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnSizeChangedTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.unit.IntSize
@@ -64,7 +64,7 @@
 
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier.padding(10.toDp()).onSizeChanged {
                             changedSize = it
@@ -100,7 +100,7 @@
 
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier.padding(10.toDp())
                             .onSizeChanged {
@@ -136,7 +136,7 @@
 
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier.padding(sizePx.toDp()).onSizeChanged {
                             changedSize = it
@@ -169,7 +169,7 @@
 
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     Box(
                         Modifier.padding(10.toDp()).onSizeChanged {
                             changedSize = it
@@ -208,7 +208,7 @@
 
         rule.runOnUiThread {
             activity.setContent {
-                with(AmbientDensity.current) {
+                with(LocalDensity.current) {
                     val mod = if (addModifier) Modifier.onSizeChanged {
                         changedSize2 = it
                         latch2.countDown()
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
index 7ea1393..04ee7f2 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RtlLayoutTest.kt
@@ -27,7 +27,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.node.Ref
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.runOnUiThreadIR
 import androidx.compose.ui.test.TestActivity
@@ -178,7 +178,7 @@
                         layout(100, 100) {}
                     }
                 }
-                Providers(AmbientLayoutDirection provides direction.value) {
+                Providers(LocalLayoutDirection provides direction.value) {
                     Layout(children) { measurables, constraints ->
                         layout(100, 100) {
                             measurables.first().measure(constraints).placeRelative(0, 0)
@@ -203,7 +203,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Layout(content = {}) { _, _ ->
                         resultLayoutDirection.value = layoutDirection
                         latch.countDown()
@@ -225,7 +225,7 @@
         activityTestRule.runOnUiThread {
             activity.setContent {
                 @OptIn(ExperimentalLayout::class)
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Layout(
                         content = {},
                         modifier = Modifier.preferredWidth(IntrinsicSize.Max),
@@ -256,10 +256,10 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                val initialLayoutDirection = AmbientLayoutDirection.current
-                Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+                val initialLayoutDirection = LocalLayoutDirection.current
+                Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                     Box {
-                        Providers(AmbientLayoutDirection provides initialLayoutDirection) {
+                        Providers(LocalLayoutDirection provides initialLayoutDirection) {
                             Layout({}) { _, _ ->
                                 resultLayoutDirection.value = layoutDirection
                                 latch.countDown()
@@ -280,7 +280,7 @@
         absolutePositioning: Boolean,
         testLayoutDirection: LayoutDirection
     ) {
-        Providers(AmbientLayoutDirection provides testLayoutDirection) {
+        Providers(LocalLayoutDirection provides testLayoutDirection) {
             Layout(
                 content = {
                     FixedSize(size, modifier = Modifier.saveLayoutInfo(position[0], countDownLatch))
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
index f08b696..3c760bc 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
@@ -32,9 +32,9 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asAndroidBitmap
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertIsDisplayed
@@ -460,8 +460,8 @@
         rule.setContent {
             val size = 50.dp
             val density = Density(3f)
-            val sizeIpx = with(density) { size.toIntPx() }
-            Providers(AmbientDensity provides density) {
+            val sizeIpx = with(density) { size.roundToPx() }
+            Providers(LocalDensity provides density) {
                 SubcomposeLayout(
                     Modifier.size(size).onGloballyPositioned {
                         assertThat(it.size).isEqualTo(IntSize(sizeIpx, sizeIpx))
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt
index e0421da..1c8015a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/HotReloadTests.kt
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.runtime.simulateHotReload
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.contentDescription
@@ -66,7 +66,7 @@
         var value = "First value"
 
         @Composable fun text(text: String, id: Int = -1) {
-            val context = AmbientContext.current
+            val context = LocalContext.current
             ComposeNode<TextView, UiApplier>(
                 factory = { TextView(context) },
                 update = {
@@ -77,7 +77,7 @@
         }
 
         @Composable fun column(content: @Composable () -> Unit) {
-            val context = AmbientContext.current
+            val context = LocalContext.current
             ComposeNode<LinearLayout, UiApplier>(
                 factory = { LinearLayout(context) },
                 update = {},
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt
index f1b0d20..3374eb9 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInAppCompatActivityTest.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.owners
 
 import androidx.appcompat.app.AppCompatActivity
-import androidx.compose.ui.platform.AmbientLifecycleOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.platform.setContent
 import androidx.lifecycle.LifecycleOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -54,7 +54,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
@@ -72,7 +72,7 @@
             val view = ComposeView(activity)
             activity.setContentView(view)
             view.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt
index da001b6..6f2a166 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInComponentActivityTest.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.owners
 
 import androidx.activity.ComponentActivity
-import androidx.compose.ui.platform.AmbientLifecycleOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.platform.setContent
 import androidx.lifecycle.LifecycleOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -54,7 +54,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
@@ -72,7 +72,7 @@
             val view = ComposeView(activity)
             activity.setContentView(view)
             view.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt
index 0142e37..3e11511 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/LifecycleOwnerInFragmentTest.kt
@@ -19,8 +19,8 @@
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.ViewGroup
-import androidx.compose.ui.platform.AmbientLifecycleOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentContainerView
@@ -80,7 +80,7 @@
         savedInstanceState: Bundle?
     ) = ComposeView(requireContext()).apply {
         setContent {
-            owner = AmbientLifecycleOwner.current
+            owner = LocalLifecycleOwner.current
             latch.countDown()
         }
     }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt
index d038d6e..d2c50f5 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInAppCompatActivityTest.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.owners
 
 import androidx.appcompat.app.AppCompatActivity
-import androidx.compose.ui.platform.AmbientSavedStateRegistryOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
 import androidx.compose.ui.platform.setContent
 import androidx.savedstate.SavedStateRegistryOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -54,7 +54,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                owner = AmbientSavedStateRegistryOwner.current
+                owner = LocalSavedStateRegistryOwner.current
                 latch.countDown()
             }
         }
@@ -72,7 +72,7 @@
             val view = ComposeView(activity)
             activity.setContentView(view)
             view.setContent {
-                owner = AmbientSavedStateRegistryOwner.current
+                owner = LocalSavedStateRegistryOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt
index fd42773..90538ec 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInComponentActivityTest.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.owners
 
 import androidx.activity.ComponentActivity
-import androidx.compose.ui.platform.AmbientSavedStateRegistryOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
 import androidx.compose.ui.platform.setContent
 import androidx.savedstate.SavedStateRegistryOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -54,7 +54,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                owner = AmbientSavedStateRegistryOwner.current
+                owner = LocalSavedStateRegistryOwner.current
                 latch.countDown()
             }
         }
@@ -72,7 +72,7 @@
             val view = ComposeView(activity)
             activity.setContentView(view)
             view.setContent {
-                owner = AmbientSavedStateRegistryOwner.current
+                owner = LocalSavedStateRegistryOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt
index 09691f9..59b7685 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/owners/SavedStateRegistryOwnerInFragmentTest.kt
@@ -19,8 +19,8 @@
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.ViewGroup
-import androidx.compose.ui.platform.AmbientSavedStateRegistryOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentContainerView
@@ -80,7 +80,7 @@
             savedInstanceState: Bundle?
         ) = ComposeView(requireContext()).apply {
             setContent {
-                owner = AmbientSavedStateRegistryOwner.current
+                owner = LocalSavedStateRegistryOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
index 2d40db5..61ed923 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-@file:Suppress("Deprecation")
-
 package androidx.compose.ui.platform
 
 import android.content.Context
@@ -32,20 +30,17 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Applier
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.runtime.getValue
-import androidx.compose.runtime.key
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.assertPixels
 import androidx.compose.ui.Align
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.background
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
@@ -71,9 +66,7 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
-import androidx.compose.ui.viewinterop.emitView
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
@@ -408,7 +401,7 @@
         var size by mutableStateOf(20)
         rule.setContent {
             Box(Modifier.graphicsLayer().fillMaxSize()) {
-                val context = AmbientContext.current
+                val context = LocalContext.current
                 val view = remember { View(context) }
                 AndroidView({ view }, Modifier.testTag("view"))
                 view.layoutParams = ViewGroup.LayoutParams(size, size)
@@ -438,7 +431,7 @@
 
         rule.setContent {
             Box(Modifier.onGloballyPositioned { outer = it.positionInWindow() }) {
-                val paddingDp = with(AmbientDensity.current) { padding.toDp() }
+                val paddingDp = with(LocalDensity.current) { padding.toDp() }
                 Box(Modifier.padding(paddingDp)) {
                     AndroidView(::ComposeView) {
                         it.setContent {
@@ -478,7 +471,7 @@
 
             view.setContent {
                 Box {
-                    val paddingDp = with(AmbientDensity.current) { padding.toDp() }
+                    val paddingDp = with(LocalDensity.current) { padding.toDp() }
                     Box(Modifier.padding(paddingDp)) {
                         AndroidView(::ComposeView) {
                             it.setContent {
@@ -502,77 +495,6 @@
     }
 
     @Test
-    @Suppress("Deprecation")
-    fun testComposeInsideView_simpleLayout() {
-        val padding = 10f
-        val paddingDp = with(rule.density) { padding.toDp() }
-        val size = 20f
-        val sizeDp = with(rule.density) { size.toDp() }
-
-        var outer: Offset = Offset.Zero
-        var inner1: Offset = Offset.Zero
-        var inner2: Offset = Offset.Zero
-        rule.setContent {
-            Box(Modifier.onGloballyPositioned { outer = it.positionInWindow() }) {
-                Box(Modifier.padding(start = paddingDp, top = paddingDp)) {
-                    emitView(::LinearLayout, {}) {
-                        Box(
-                            Modifier.size(sizeDp).background(Color.Blue).onGloballyPositioned {
-                                inner1 = it.positionInWindow()
-                            }
-                        )
-                        Box(
-                            Modifier.size(sizeDp).background(Color.Gray).onGloballyPositioned {
-                                inner2 = it.positionInWindow()
-                            }
-                        )
-                    }
-                }
-            }
-        }
-
-        rule.runOnIdle {
-            assertEquals(Offset(padding, padding), inner1 - outer)
-            assertEquals(Offset(padding + size, padding), inner2 - outer)
-        }
-    }
-
-    @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    @Suppress("Deprecation")
-    fun testComposeInsideView_simpleDraw() {
-        val padding = 10f
-        val paddingDp = with(rule.density) { padding.toDp() }
-        val size = 20f
-        val sizeDp = with(rule.density) { size.toDp() }
-
-        rule.setContent {
-            Box(Modifier.testTag("box")) {
-                Box(Modifier.background(Color.Blue).padding(paddingDp)) {
-                    emitView(::LinearLayout, {}) {
-                        Box(Modifier.size(sizeDp).background(Color.White))
-                        Box(Modifier.size(sizeDp).background(Color.Gray))
-                    }
-                }
-            }
-        }
-
-        rule.onNodeWithTag("box").captureToImage().assertPixels(
-            IntSize((padding * 2 + size * 2).roundToInt(), (padding * 2 + size).roundToInt())
-        ) { offset ->
-            if (offset.y < padding || offset.y >= padding + size || offset.x < padding ||
-                offset.x >= padding + size * 2
-            ) {
-                Color.Blue
-            } else if (offset.x >= padding && offset.x < padding + size) {
-                Color.White
-            } else {
-                Color.Gray
-            }
-        }
-    }
-
-    @Test
     @OptIn(ExperimentalComposeApi::class)
     fun testComposeInsideView_attachingAndDetaching() {
         var composeContent by mutableStateOf(true)
@@ -640,78 +562,6 @@
         }
     }
 
-    @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    @Suppress("Deprecation")
-    fun testComposeInsideView_remove() {
-        val size = 40.dp
-        val sizePx = with(rule.density) { size.toIntPx() }
-
-        var first by mutableStateOf(true)
-        rule.setContent {
-            Box(Modifier.testTag("view")) {
-                emitView(::LinearLayout, {}) {
-                    if (first) {
-                        Box(Modifier.size(size).background(Color.Green))
-                    } else {
-                        Box(Modifier.size(size).background(Color.Blue))
-                    }
-                }
-            }
-        }
-
-        rule.onNodeWithTag("view")
-            .captureToImage().assertPixels(IntSize(sizePx, sizePx)) { Color.Green }
-
-        rule.runOnIdle { first = false }
-
-        rule.onNodeWithTag("view")
-            .captureToImage().assertPixels(IntSize(sizePx, sizePx)) { Color.Blue }
-    }
-
-    @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    @Suppress("Deprecation")
-    fun testComposeInsideView_move() {
-        val size = 40.dp
-        val sizePx = with(rule.density) { size.toIntPx() }
-
-        var first by mutableStateOf(true)
-        rule.setContent {
-            Box(Modifier.testTag("view")) {
-                emitView(::LinearLayout, {}) {
-                    if (first) {
-                        key("green") {
-                            Box(Modifier.size(size).background(Color.Green))
-                        }
-                        key("blue") {
-                            Box(Modifier.size(size).background(Color.Blue))
-                        }
-                    } else {
-                        key("blue") {
-                            Box(Modifier.size(size).background(Color.Blue))
-                        }
-                        key("green") {
-                            Box(Modifier.size(size).background(Color.Green))
-                        }
-                    }
-                }
-            }
-        }
-
-        rule.onNodeWithTag("view").captureToImage()
-            .assertPixels(IntSize(sizePx * 2, sizePx)) {
-                if (it.x < sizePx) Color.Green else Color.Blue
-            }
-
-        rule.runOnIdle { first = false }
-
-        rule.onNodeWithTag("view").captureToImage()
-            .assertPixels(IntSize(sizePx * 2, sizePx)) {
-                if (it.x < sizePx) Color.Blue else Color.Green
-            }
-    }
-
     class ColoredSquareView(context: Context) : View(context) {
         var size: Int = 100
             set(value) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowInfoAmbientTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt
similarity index 93%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowInfoAmbientTest.kt
rename to compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt
index accdec5..f6f5dc0 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowInfoAmbientTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowInfoCompositionLocalTest.kt
@@ -33,7 +33,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class WindowInfoAmbientTest {
+class WindowInfoCompositionLocalTest {
     @get:Rule
     val rule = createComposeRule()
 
@@ -45,7 +45,7 @@
         val windowFocusGain = CountDownLatch(1)
         rule.setContent {
             BasicText("Main Window")
-            windowInfo = AmbientWindowInfo.current
+            windowInfo = LocalWindowInfo.current
             @Suppress("DEPRECATION")
             WindowFocusObserver { if (it) windowFocusGain.countDown() }
         }
@@ -68,12 +68,12 @@
         val showPopup = mutableStateOf(false)
         rule.setContent {
             BasicText("Main Window")
-            mainWindowInfo = AmbientWindowInfo.current
+            mainWindowInfo = LocalWindowInfo.current
             WindowFocusObserver { if (!it) mainWindowFocusLoss.countDown() }
             if (showPopup.value) {
                 Popup(isFocusable = true, onDismissRequest = { showPopup.value = false }) {
                     BasicText("Popup Window")
-                    popupWindowInfo = AmbientWindowInfo.current
+                    popupWindowInfo = LocalWindowInfo.current
                     WindowFocusObserver { if (it) popupFocusGain.countDown() }
                 }
             }
@@ -99,7 +99,7 @@
         val showPopup = mutableStateOf(false)
         rule.setContent {
             BasicText(text = "Main Window")
-            mainWindowInfo = AmbientWindowInfo.current
+            mainWindowInfo = LocalWindowInfo.current
             WindowFocusObserver { if (it) mainWindowFocusGain.countDown() }
             if (showPopup.value) {
                 Popup(isFocusable = true, onDismissRequest = { showPopup.value = false }) {
@@ -132,12 +132,12 @@
         val showDialog = mutableStateOf(false)
         rule.setContent {
             BasicText("Main Window")
-            mainWindowInfo = AmbientWindowInfo.current
+            mainWindowInfo = LocalWindowInfo.current
             WindowFocusObserver { if (!it) mainWindowFocusLoss.countDown() }
             if (showDialog.value) {
                 Dialog(onDismissRequest = { showDialog.value = false }) {
                     BasicText("Popup Window")
-                    dialogWindowInfo = AmbientWindowInfo.current
+                    dialogWindowInfo = LocalWindowInfo.current
                     WindowFocusObserver { if (it) dialogFocusGain.countDown() }
                 }
             }
@@ -163,7 +163,7 @@
         val showDialog = mutableStateOf(false)
         rule.setContent {
             BasicText(text = "Main Window")
-            mainWindowInfo = AmbientWindowInfo.current
+            mainWindowInfo = LocalWindowInfo.current
             WindowFocusObserver { if (it) mainWindowFocusGain.countDown() }
             if (showDialog.value) {
                 Dialog(onDismissRequest = { showDialog.value = false }) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
index bfbf0b8..261b72f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.SideEffect
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.currentRecomposeScope
 import androidx.compose.runtime.rememberCompositionReference
 import androidx.compose.ui.test.TestActivity
@@ -154,14 +154,14 @@
         activityScenario.onActivity {
             val frameLayout = FrameLayout(it)
             it.setContent {
-                val ambient = ambientOf<Float>()
-                Providers(ambient provides 1f) {
+                val compositionLocal = compositionLocalOf<Float>()
+                Providers(compositionLocal provides 1f) {
                     val composition = rememberCompositionReference()
 
                     AndroidView({ frameLayout })
                     SideEffect {
                         frameLayout.setContent(composition) {
-                            value = ambient.current
+                            value = compositionLocal.current
                             composedLatch.countDown()
                         }
                     }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt
index 8de8d7e..4f7e4e3 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ColorResourcesTest.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.R
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -41,7 +41,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(colorResource(R.color.color_resource))
                     .isEqualTo(Color(0x12345678))
             }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/FontResourcesTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/FontResourcesTest.kt
index bbf6e70..c09aa7e 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/FontResourcesTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/FontResourcesTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.res
 
 import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
@@ -49,7 +49,7 @@
         var syncLoadedTypeface: Typeface? = null
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
 
                 // async API
                 result = loadFontResource(
@@ -77,7 +77,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 loadFontResource(
                     fontFamily = Font(R.font.sample_font).toFontFamily(),
                     pendingFontFamily = Font(R.font.sample_font).toFontFamily(),
@@ -92,7 +92,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 loadFontResource(
                     fontFamily = Font(R.font.sample_font).toFontFamily(),
                     pendingFontFamily = FontFamily.Serif,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt
index e836941..d5e84d3 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/PrimitiveResourcesTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.res
 
 import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.R
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
@@ -41,7 +41,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(integerResource(R.integer.integer_value)).isEqualTo(123)
             }
         }
@@ -52,7 +52,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(integerArrayResource(R.array.integer_array))
                     .isEqualTo(intArrayOf(234, 345))
             }
@@ -64,7 +64,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(booleanResource(R.bool.boolean_value)).isTrue()
             }
         }
@@ -75,7 +75,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(dimensionResource(R.dimen.dimension_value)).isEqualTo(32.dp)
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ResourcesTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ResourcesTest.kt
index ab7dc0b..244d0d0 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ResourcesTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/ResourcesTest.kt
@@ -16,18 +16,21 @@
 
 package androidx.compose.ui.res
 
+import android.graphics.drawable.BitmapDrawable
 import android.util.LruCache
 import androidx.compose.runtime.Providers
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asAndroidBitmap
 import androidx.compose.ui.graphics.imageFromResource
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.R
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -54,6 +57,21 @@
     }
 
     @Test
+    fun ensureImageBitmapIsLoadedFromResourceCache() {
+        var bitmapDrawable: BitmapDrawable? = null
+        var imageBitmap: ImageBitmap? = null
+        rule.setContent {
+            val resource = LocalContext.current.resources
+            bitmapDrawable = resource.getDrawable(R.drawable.loaded_image, null) as BitmapDrawable
+            imageBitmap = imageResource(R.drawable.loaded_image)
+        }
+
+        assertNotNull(bitmapDrawable)
+        assertNotNull(imageBitmap)
+        assertTrue(bitmapDrawable?.bitmap === imageBitmap?.asAndroidBitmap())
+    }
+
+    @Test
     fun asyncLoadingTest() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val resource = context.resources
@@ -70,7 +88,7 @@
         var res: DeferredResource<ImageBitmap>? = null
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 res = loadResourceInternal(
                     key = "random key string",
                     pendingResource = pendingImage,
@@ -133,7 +151,7 @@
         var res: DeferredResource<ImageBitmap>? = null
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 res = loadResourceInternal(
                     key = "random key string",
                     pendingResource = pendingImage,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt
index 8bcbfcc..2016bb2 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/res/StringResourcesTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.res
 
 import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.R
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -53,7 +53,7 @@
     fun stringResource_not_localized_defaultLocale() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(stringResource(R.string.not_localized)).isEqualTo(NotLocalizedText)
             }
         }
@@ -70,7 +70,7 @@
         )
 
         rule.setContent {
-            Providers(AmbientContext provides spanishContext) {
+            Providers(LocalContext provides spanishContext) {
                 assertThat(stringResource(R.string.not_localized)).isEqualTo(NotLocalizedText)
             }
         }
@@ -80,7 +80,7 @@
     fun stringResource_localized_defaultLocale() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(stringResource(R.string.localized))
                     .isEqualTo(DefaultLocalizedText)
             }
@@ -98,7 +98,7 @@
         )
 
         rule.setContent {
-            Providers(AmbientContext provides spanishContext) {
+            Providers(LocalContext provides spanishContext) {
                 assertThat(stringResource(R.string.localized))
                     .isEqualTo(SpanishLocalizedText)
             }
@@ -109,7 +109,7 @@
     fun stringResource_not_localized_format_defaultLocale() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(stringResource(R.string.not_localized_format, FormatValue))
                     .isEqualTo(NotLocalizedFormatText)
             }
@@ -127,7 +127,7 @@
         )
 
         rule.setContent {
-            Providers(AmbientContext provides spanishContext) {
+            Providers(LocalContext provides spanishContext) {
                 assertThat(stringResource(R.string.not_localized_format, FormatValue))
                     .isEqualTo(NotLocalizedFormatText)
             }
@@ -138,7 +138,7 @@
     fun stringResource_localized_format_defaultLocale() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(stringResource(R.string.localized_format, FormatValue))
                     .isEqualTo(DefaultLocalizedFormatText)
             }
@@ -156,7 +156,7 @@
         )
 
         rule.setContent {
-            Providers(AmbientContext provides spanishContext) {
+            Providers(LocalContext provides spanishContext) {
                 assertThat(stringResource(R.string.localized_format, FormatValue))
                     .isEqualTo(SpanishLocalizedFormatText)
             }
@@ -168,7 +168,7 @@
         val context = InstrumentationRegistry.getInstrumentation().targetContext
 
         rule.setContent {
-            Providers(AmbientContext provides context) {
+            Providers(LocalContext provides context) {
                 assertThat(stringArrayResource(R.array.string_array))
                     .isEqualTo(arrayOf("string1", "string2"))
             }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
index 951a5e1..bd2b7ce 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
@@ -31,6 +31,7 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Providers
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
@@ -38,9 +39,11 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientDensity
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ViewCompositionStrategy
+import androidx.compose.ui.platform.findViewTreeCompositionReference
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.R
 import androidx.compose.ui.test.captureToImage
@@ -49,6 +52,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.assertion.ViewAssertions.matches
@@ -329,8 +333,8 @@
         rule.setContent {
             val size = 50.dp
             val density = Density(3f)
-            val sizeIpx = with(density) { size.toIntPx() }
-            Providers(AmbientDensity provides density) {
+            val sizeIpx = with(density) { size.roundToPx() }
+            Providers(LocalDensity provides density) {
                 AndroidView(
                     { FrameLayout(it) },
                     Modifier.size(size).onGloballyPositioned {
@@ -342,6 +346,86 @@
         rule.waitForIdle()
     }
 
+    @Test
+    fun androidView_propagatesViewTreeCompositionReference() {
+        lateinit var parentComposeView: ComposeView
+        lateinit var compositionChildView: View
+        rule.activityRule.scenario.onActivity { activity ->
+            parentComposeView = ComposeView(activity).apply {
+                setContent {
+                    AndroidView(::View) {
+                        compositionChildView = it
+                    }
+                }
+                activity.setContentView(this)
+            }
+        }
+        rule.runOnIdle {
+            assertThat(compositionChildView.findViewTreeCompositionReference())
+                .isNotEqualTo(parentComposeView.findViewTreeCompositionReference())
+        }
+    }
+
+    @Test
+    fun androidView_propagatesAmbientsToComposeViewChildren() {
+        val ambient = compositionLocalOf { "unset" }
+        var childComposedAmbientValue = "uncomposed"
+        rule.setContent {
+            Providers(ambient provides "setByParent") {
+                AndroidView(
+                    viewBlock = {
+                        ComposeView(it).apply {
+                            setContent {
+                                childComposedAmbientValue = ambient.current
+                            }
+                        }
+                    }
+                )
+            }
+        }
+        rule.runOnIdle {
+            assertThat(childComposedAmbientValue).isEqualTo("setByParent")
+        }
+    }
+
+    @Test
+    fun androidView_propagatesLayoutDirectionToComposeViewChildren() {
+        var childViewLayoutDirection: Int = Int.MIN_VALUE
+        var childCompositionLayoutDirection: LayoutDirection? = null
+        rule.setContent {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                AndroidView(
+                    viewBlock = {
+                        FrameLayout(it).apply {
+                            addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
+                                childViewLayoutDirection = layoutDirection
+                            }
+                            addView(
+                                ComposeView(it).apply {
+                                    // The view hierarchy's layout direction should always override
+                                    // the ambient layout direction from the parent composition.
+                                    layoutDirection = android.util.LayoutDirection.LTR
+                                    setContent {
+                                        childCompositionLayoutDirection =
+                                            LocalLayoutDirection.current
+                                    }
+                                },
+                                ViewGroup.LayoutParams(
+                                    ViewGroup.LayoutParams.MATCH_PARENT,
+                                    ViewGroup.LayoutParams.MATCH_PARENT
+                                )
+                            )
+                        }
+                    }
+                )
+            }
+        }
+        rule.runOnIdle {
+            assertThat(childViewLayoutDirection).isEqualTo(android.util.LayoutDirection.RTL)
+            assertThat(childCompositionLayoutDirection).isEqualTo(LayoutDirection.Ltr)
+        }
+    }
+
     private fun Dp.toPx(displayMetrics: DisplayMetrics) =
         TypedValue.applyDimension(
             TypedValue.COMPLEX_UNIT_DIP,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt
index 5b07d5e..b0eb458 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/EditTextInteropTest.kt
@@ -20,7 +20,7 @@
 import android.view.View
 import android.widget.EditText
 import androidx.activity.ComponentActivity
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.compose.ui.text.InternalTextApi
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -43,7 +43,7 @@
         lateinit var editText: EditText
         lateinit var ownerView: View
         rule.setContent {
-            ownerView = AmbientView.current
+            ownerView = LocalView.current
             AndroidView({
                 EditText(it).apply { width = 500; editText = this }
             })
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInAppCompatActivityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInAppCompatActivityTest.kt
index 548434f8..dcc2d01 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInAppCompatActivityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInAppCompatActivityTest.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.viewinterop
 
 import androidx.appcompat.app.AppCompatActivity
-import androidx.compose.ui.platform.AmbientLifecycleOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.platform.setContent
 import androidx.lifecycle.LifecycleOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -54,7 +54,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
@@ -72,7 +72,7 @@
             val view = ComposeView(activity)
             activity.setContentView(view)
             view.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInComponentActivityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInComponentActivityTest.kt
index 5a5d8b2..ddd0f03 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInComponentActivityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelInComponentActivityTest.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.viewinterop
 
 import androidx.activity.ComponentActivity
-import androidx.compose.ui.platform.AmbientLifecycleOwner
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.platform.setContent
 import androidx.lifecycle.LifecycleOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -54,7 +54,7 @@
 
         activityTestRule.runOnUiThread {
             activity.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
@@ -72,7 +72,7 @@
             val view = ComposeView(activity)
             activity.setContentView(view)
             view.setContent {
-                owner = AmbientLifecycleOwner.current
+                owner = LocalLifecycleOwner.current
                 latch.countDown()
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelTest.kt
index 57b10df..4347258 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ViewModelTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.viewinterop
 
 import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AmbientViewModelStoreOwner
+import androidx.compose.ui.platform.LocalViewModelStoreOwner
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.lifecycle.HasDefaultViewModelProviderFactory
 import androidx.lifecycle.ViewModel
@@ -42,7 +42,7 @@
     fun viewModelCreatedViaDefaultFactory() {
         val owner = FakeViewModelStoreOwner()
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 viewModel<TestViewModel>()
             }
         }
@@ -55,7 +55,7 @@
         val owner = FakeViewModelStoreOwner()
         var createdInComposition: Any? = null
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 createdInComposition = viewModel<TestViewModel>()
             }
         }
@@ -70,7 +70,7 @@
         val owner = FakeViewModelStoreOwner()
         var createdInComposition: Any? = null
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 createdInComposition = viewModel<TestViewModel>()
             }
         }
@@ -85,7 +85,7 @@
         val owner = FakeViewModelStoreOwner()
         var createdInComposition: Any? = null
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 createdInComposition = viewModel<TestViewModel>(key = "test")
             }
         }
@@ -100,7 +100,7 @@
         val owner = FakeViewModelStoreOwner()
         val customFactory = FakeViewModelProviderFactory()
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 viewModel<TestViewModel>(factory = customFactory)
             }
         }
@@ -113,7 +113,7 @@
         val owner = FakeViewModelStoreOwner()
         val customFactory = FakeViewModelProviderFactory()
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 viewModel<TestViewModel>(factory = customFactory)
             }
         }
@@ -127,7 +127,7 @@
         var createdInComposition: Any? = null
         val customFactory = FakeViewModelProviderFactory()
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 createdInComposition = viewModel<TestViewModel>()
             }
         }
@@ -143,7 +143,7 @@
         var createdInComposition: Any? = null
         val customFactory = FakeViewModelProviderFactory()
         rule.setContent {
-            Providers(AmbientViewModelStoreOwner provides owner) {
+            Providers(LocalViewModelStoreOwner provides owner) {
                 createdInComposition = viewModel<TestViewModel>(key = "test")
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
index 027e5c4..6ea928c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogScreenshotTest.kt
@@ -25,7 +25,7 @@
 import androidx.compose.ui.background
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.isDialog
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -71,7 +71,7 @@
     fun dialogWithElevation() {
         rule.setContent {
             Dialog(onDismissRequest = {}) {
-                val elevation = with(AmbientDensity.current) { 16.dp.toPx() }
+                val elevation = with(LocalDensity.current) { 16.dp.toPx() }
                 Box(
                     Modifier
                         .graphicsLayer(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
index 285f48d..b6c2184 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
@@ -18,7 +18,7 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
@@ -122,7 +122,7 @@
         // Click outside the dialog to dismiss it
         val outsideX = 0
         val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.toIntPx() / 2
+            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
         }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
@@ -146,7 +146,7 @@
         // Click outside the dialog to try to dismiss it
         val outsideX = 0
         val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.toIntPx() / 2
+            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
         }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
@@ -176,7 +176,7 @@
         // Click outside the dialog to try to dismiss it
         val outsideX = 0
         val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.toIntPx() / 2
+            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
         }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
@@ -256,13 +256,13 @@
     }
 
     @Test
-    fun dialog_preservesAmbients() {
-        val ambient = ambientOf<Float>()
+    fun dialog_preservesCompositionLocals() {
+        val compositionLocal = compositionLocalOf<Float>()
         var value = 0f
         rule.setContent {
-            Providers(ambient provides 1f) {
+            Providers(compositionLocal provides 1f) {
                 Dialog(onDismissRequest = {}) {
-                    value = ambient.current
+                    value = compositionLocal.current
                 }
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt
index a0de7cc..ef0e67d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupAlignmentTest.kt
@@ -23,10 +23,10 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientLayoutDirection
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -52,7 +52,7 @@
     private val testTag = "testedPopup"
     private val offset = IntOffset(10, 10)
     private val popupSize = IntSize(40, 20)
-    private val parentBounds = IntBounds(50, 50, 150, 150)
+    private val parentBounds = IntRect(50, 50, 150, 150)
     private val parentSize = IntSize(parentBounds.width, parentBounds.height)
 
     private var composeViewAbsolutePos = IntOffset(0, 0)
@@ -307,7 +307,7 @@
 
             rule.setContent {
                 // Get the compose view position on screen
-                val composeView = AmbientView.current
+                val composeView = LocalView.current
                 val positionArray = IntArray(2)
                 composeView.getLocationOnScreen(positionArray)
                 composeViewAbsolutePos = IntOffset(
@@ -319,7 +319,7 @@
                 // position of the parent to be (0, 0)
                 TestAlign {
                     val layoutDirection = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
-                    Providers(AmbientLayoutDirection provides layoutDirection) {
+                    Providers(LocalLayoutDirection provides layoutDirection) {
                         SimpleContainer(width = parentWidthDp, height = parentHeightDp) {
                             PopupTestTag(testTag) {
                                 Popup(alignment = alignment, offset = offset) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt
index 7ab8fb2..428da11 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupDismissTest.kt
@@ -106,8 +106,8 @@
         with(rule.density) {
             // Need to click via UiDevice as this click has to propagate to multiple windows
             device.click(
-                btnPos.x.toInt() + btnBounds.width.toIntPx() / 2,
-                btnPos.y.toInt() + btnBounds.height.toIntPx() / 2
+                btnPos.x.toInt() + btnBounds.width.roundToPx() / 2,
+                btnPos.y.toInt() + btnBounds.height.roundToPx() / 2
             )
         }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt
index 207aed8..68565fb 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt
@@ -22,7 +22,7 @@
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
@@ -30,7 +30,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.node.Owner
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
@@ -205,13 +205,13 @@
     }
 
     @Test
-    fun preservesAmbients() {
-        val ambient = ambientOf<Float>()
+    fun preservesCompositionLocals() {
+        val compositionLocal = compositionLocalOf<Float>()
         var value = 0f
         rule.setContent {
-            Providers(ambient provides 1f) {
+            Providers(compositionLocal provides 1f) {
                 Popup {
-                    value = ambient.current
+                    value = compositionLocal.current
                 }
             }
         }
@@ -224,9 +224,9 @@
     fun preservesLayoutDirection() {
         var value = LayoutDirection.Ltr
         rule.setContent {
-            Providers(AmbientLayoutDirection provides LayoutDirection.Rtl) {
+            Providers(LocalLayoutDirection provides LayoutDirection.Rtl) {
                 Popup {
-                    value = AmbientLayoutDirection.current
+                    value = LocalLayoutDirection.current
                 }
             }
         }
@@ -254,7 +254,7 @@
         // Click outside the popup
         val outsideX = 0
         val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.toIntPx() / 2
+            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
         }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
@@ -312,7 +312,7 @@
         // Click outside the popup
         val outsideX = 0
         val outsideY = with(rule.density) {
-            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.toIntPx() / 2
+            rule.onAllNodes(isRoot()).onFirst().getUnclippedBoundsInRoot().height.roundToPx() / 2
         }
         UiDevice.getInstance(getInstrumentation()).click(outsideX, outsideY)
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt
index 301912c..4450492 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTestUtils.kt
@@ -93,10 +93,10 @@
     Layout(content, modifier) { measurables, incomingConstraints ->
         val containerConstraints = Constraints()
             .copy(
-                width?.toIntPx() ?: 0,
-                width?.toIntPx() ?: Constraints.Infinity,
-                height?.toIntPx() ?: 0,
-                height?.toIntPx() ?: Constraints.Infinity
+                width?.roundToPx() ?: 0,
+                width?.roundToPx() ?: Constraints.Infinity,
+                height?.roundToPx() ?: 0,
+                height?.roundToPx() ?: Constraints.Infinity
             )
             .enforce(incomingConstraints)
         val childConstraints = containerConstraints.copy(minWidth = 0, minHeight = 0)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
index c1c0f14..a201006 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
@@ -26,7 +26,7 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInWindow
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -65,7 +65,7 @@
             window.attributes = layoutParams
         }
         rule.setContent {
-            with(AmbientDensity.current) {
+            with(LocalDensity.current) {
                 Box(Modifier.size(size.toDp()).onGloballyPositioned { coordinates = it })
             }
         }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.kt
index ad68373..157fd50 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerInteropFilter.kt
@@ -30,7 +30,6 @@
 import androidx.compose.ui.util.fastAny
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.viewinterop.AndroidViewHolder
-import androidx.compose.ui.viewinterop.InternalInteropApi
 
 /**
  * A special PointerInputModifier that provides access to the underlying [MotionEvent]s originally
@@ -88,7 +87,6 @@
  * Similar to the 2 argument overload of [pointerInteropFilter], but connects
  * directly to an [AndroidViewHolder] for more seamless interop with Android.
  */
-@OptIn(InternalInteropApi::class)
 internal fun Modifier.pointerInteropFilter(view: AndroidViewHolder): Modifier {
     val filter = PointerInteropFilter()
     filter.onTouchEvent = { motionEvent ->
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.kt
index 92a0968..98e70d1 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/UiApplier.kt
@@ -23,7 +23,6 @@
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.viewinterop.AndroidViewHolder
-import androidx.compose.ui.viewinterop.InternalInteropApi
 import androidx.compose.ui.viewinterop.ViewBlockHolder
 
 class UiApplier(root: Any) : AbstractApplier<Any>(root) {
@@ -69,7 +68,6 @@
                     is View -> {
                         // Wrap the instance in an AndroidViewHolder, unless the instance
                         // itself is already one.
-                        @OptIn(InternalInteropApi::class)
                         val androidViewHolder =
                             if (instance is AndroidViewHolder) {
                                 instance
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.kt
index 720d3896..3126227 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/node/ViewInterop.kt
@@ -19,23 +19,8 @@
 import android.view.View
 import android.view.ViewGroup
 import androidx.annotation.RestrictTo
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.drawBehind
-import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
-import androidx.compose.ui.graphics.nativeCanvas
-import androidx.compose.ui.input.pointer.pointerInteropFilter
-import androidx.compose.ui.layout.Measurable
-import androidx.compose.ui.layout.MeasureResult
-import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.layout.positionInRoot
-import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AndroidComposeView
-import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.util.fastFirstOrNull
 import androidx.compose.ui.util.fastForEach
-import androidx.compose.ui.viewinterop.AndroidViewHolder
-import androidx.compose.ui.viewinterop.InternalInteropApi
-import kotlin.math.roundToInt
 
 /**
  * @suppress
@@ -60,121 +45,6 @@
     return getViewAdapter().get(id, factory)
 }
 
-/**
- * Intersects [Constraints] and [View] LayoutParams to obtain the suitable [View.MeasureSpec]
- * for measuring the [View].
- */
-private fun obtainMeasureSpec(
-    min: Int,
-    max: Int,
-    preferred: Int
-): Int = when {
-    preferred >= 0 || min == max -> {
-        // Fixed size due to fixed size layout param or fixed constraints.
-        View.MeasureSpec.makeMeasureSpec(
-            preferred.coerceIn(min, max),
-            View.MeasureSpec.EXACTLY
-        )
-    }
-    preferred == ViewGroup.LayoutParams.WRAP_CONTENT && max != Constraints.Infinity -> {
-        // Wrap content layout param with finite max constraint. If max constraint is infinite,
-        // we will measure the child with UNSPECIFIED.
-        View.MeasureSpec.makeMeasureSpec(max, View.MeasureSpec.AT_MOST)
-    }
-    preferred == ViewGroup.LayoutParams.MATCH_PARENT && max != Constraints.Infinity -> {
-        // Match parent layout param, so we force the child to fill the available space.
-        View.MeasureSpec.makeMeasureSpec(max, View.MeasureSpec.EXACTLY)
-    }
-    else -> {
-        // max constraint is infinite and layout param is WRAP_CONTENT or MATCH_PARENT.
-        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
-    }
-}
-
-/**
- * Builds a [LayoutNode] tree representation for an Android [View].
- * The component nodes will proxy the Compose core calls to the [View].
- */
-@OptIn(InternalInteropApi::class)
-internal fun AndroidViewHolder.toLayoutNode(): LayoutNode {
-    // TODO(soboleva): add layout direction here?
-    // TODO(popam): forward pointer input, accessibility, focus
-    // Prepare layout node that proxies measure and layout passes to the View.
-    val layoutNode = LayoutNode()
-
-    val coreModifier = Modifier
-        .pointerInteropFilter(this)
-        .drawBehind {
-            drawIntoCanvas { canvas ->
-                (layoutNode.owner as? AndroidComposeView)
-                    ?.drawAndroidView(this@toLayoutNode, canvas.nativeCanvas)
-            }
-        }.onGloballyPositioned {
-            // The global position of this LayoutNode can change with it being replaced. For these
-            // cases, we need to inform the View.
-            layoutAccordingTo(layoutNode)
-        }
-    layoutNode.modifier = modifier.then(coreModifier)
-    onModifierChanged = { layoutNode.modifier = it.then(coreModifier) }
-
-    layoutNode.density = density
-    onDensityChanged = { layoutNode.density = it }
-
-    var viewRemovedOnDetach: View? = null
-    layoutNode.onAttach = { owner ->
-        (owner as? AndroidComposeView)?.addAndroidView(this, layoutNode)
-        if (viewRemovedOnDetach != null) view = viewRemovedOnDetach
-    }
-    layoutNode.onDetach = { owner ->
-        (owner as? AndroidComposeView)?.removeAndroidView(this)
-        viewRemovedOnDetach = view
-        view = null
-    }
-
-    layoutNode.measureBlocks = object : LayoutNode.NoIntrinsicsMeasureBlocks(
-        "Intrinsics not supported for Android views"
-    ) {
-        override fun measure(
-            measureScope: MeasureScope,
-            measurables: List<Measurable>,
-            constraints: Constraints
-        ): MeasureResult {
-            if (constraints.minWidth != 0) {
-                getChildAt(0).minimumWidth = constraints.minWidth
-            }
-            if (constraints.minHeight != 0) {
-                getChildAt(0).minimumHeight = constraints.minHeight
-            }
-            // TODO (soboleva): native view should get LD value from Compose?
-
-            // TODO(shepshapard): !! necessary?
-            measure(
-                obtainMeasureSpec(
-                    constraints.minWidth,
-                    constraints.maxWidth,
-                    layoutParams!!.width
-                ),
-                obtainMeasureSpec(
-                    constraints.minHeight,
-                    constraints.maxHeight,
-                    layoutParams!!.height
-                )
-            )
-            return measureScope.layout(measuredWidth, measuredHeight) {
-                layoutAccordingTo(layoutNode)
-            }
-        }
-    }
-    return layoutNode
-}
-
-private fun View.layoutAccordingTo(layoutNode: LayoutNode) {
-    val position = layoutNode.coordinates.positionInRoot()
-    val x = position.x.roundToInt()
-    val y = position.y.roundToInt()
-    layout(x, y, x + measuredWidth, y + measuredHeight)
-}
-
 internal class MergedViewAdapter : ViewAdapter {
     override val id = 0
     val adapters = mutableListOf<ViewAdapter>()
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
index 88b2a04..6f0bbfc 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
@@ -25,15 +25,15 @@
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.neverEqualPolicy
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.saveable.AmbientSaveableStateRegistry
+import androidx.compose.runtime.saveable.LocalSaveableStateRegistry
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStoreOwner
@@ -43,7 +43,20 @@
  * The Android [Configuration]. The [Configuration] is useful for determining how to organize the
  * UI.
  */
-val AmbientConfiguration = ambientOf<Configuration>(
+@Deprecated(
+    "Renamed to LocalConfiguration",
+    replaceWith = ReplaceWith(
+        "LocalConfiguration",
+        "androidx.compose.ui.platform.LocalConfiguration"
+    )
+)
+val AmbientConfiguration get() = LocalConfiguration
+
+/**
+ * The Android [Configuration]. The [Configuration] is useful for determining how to organize the
+ * UI.
+ */
+val LocalConfiguration = compositionLocalOf<Configuration>(
     @OptIn(ExperimentalComposeApi::class)
     neverEqualPolicy()
 )
@@ -51,31 +64,94 @@
 /**
  * Provides a [Context] that can be used by Android applications.
  */
-val AmbientContext = staticAmbientOf<Context>()
+@Deprecated(
+    "Renamed to LocalContext",
+    replaceWith = ReplaceWith(
+        "LocalContext",
+        "androidx.compose.ui.platform.LocalContext"
+    )
+)
+val AmbientContext get() = LocalContext
 
 /**
- * The ambient containing the current [LifecycleOwner].
+ * Provides a [Context] that can be used by Android applications.
  */
-val AmbientLifecycleOwner = staticAmbientOf<LifecycleOwner>()
+val LocalContext = staticCompositionLocalOf<Context>()
 
 /**
- * The ambient containing the current [SavedStateRegistryOwner].
+ * The CompositionLocal containing the current [LifecycleOwner].
  */
-val AmbientSavedStateRegistryOwner = staticAmbientOf<SavedStateRegistryOwner>()
+@Deprecated(
+    "Renamed to LocalLifecycleOwner",
+    replaceWith = ReplaceWith(
+        "LocalLifecycleOwner",
+        "androidx.compose.ui.platform.LocalLifecycleOwner"
+    )
+)
+val AmbientLifecycleOwner get() = LocalLifecycleOwner
 
 /**
- * The ambient containing the current Compose [View].
+ * The CompositionLocal containing the current [LifecycleOwner].
  */
-val AmbientView = staticAmbientOf<View>()
+val LocalLifecycleOwner = staticCompositionLocalOf<LifecycleOwner>()
 
 /**
- * The ambient containing the current [ViewModelStoreOwner].
+ * The CompositionLocal containing the current [SavedStateRegistryOwner].
  */
-val AmbientViewModelStoreOwner = staticAmbientOf<ViewModelStoreOwner>()
+@Deprecated(
+    "Renamed to LocalSavedStateRegistryOwner",
+    replaceWith = ReplaceWith(
+        "LocalSavedStateRegistryOwner",
+        "androidx.compose.ui.platform.LocalSavedStateRegistryOwner"
+    )
+)
+val AmbientSavedStateRegistryOwner get() = LocalSavedStateRegistryOwner
+
+/**
+ * The CompositionLocal containing the current [SavedStateRegistryOwner].
+ */
+val LocalSavedStateRegistryOwner = staticCompositionLocalOf<SavedStateRegistryOwner>()
+
+/**
+ * The CompositionLocal containing the current Compose [View].
+ */
+@Deprecated(
+    "Renamed to LocalView",
+    replaceWith = ReplaceWith(
+        "LocalView",
+        "androidx.compose.ui.platform.LocalView"
+    )
+)
+val AmbientView get() = LocalView
+
+/**
+ * The CompositionLocal containing the current Compose [View].
+ */
+val LocalView = staticCompositionLocalOf<View>()
+
+/**
+ * The CompositionLocal containing the current [ViewModelStoreOwner].
+ */
+@Deprecated(
+    "Renamed to LocalViewModelStoreOwner",
+    replaceWith = ReplaceWith(
+        "LocalViewModelStoreOwner",
+        "androidx.compose.ui.platform.LocalViewModelStoreOwner"
+    )
+)
+val AmbientViewModelStoreOwner get() = LocalViewModelStoreOwner
+
+/**
+ * The CompositionLocal containing the current [ViewModelStoreOwner].
+ */
+val LocalViewModelStoreOwner = staticCompositionLocalOf<ViewModelStoreOwner>()
 
 @Composable
 @OptIn(ExperimentalComposeUiApi::class, InternalAnimationApi::class)
-internal fun ProvideAndroidAmbients(owner: AndroidComposeView, content: @Composable () -> Unit) {
+internal fun ProvideAndroidCompositionLocals(
+    owner: AndroidComposeView,
+    content: @Composable () -> Unit
+) {
     val view = owner
     val context = view.context
     val scope = rememberCoroutineScope()
@@ -108,15 +184,15 @@
     }
 
     Providers(
-        AmbientConfiguration provides configuration,
-        AmbientContext provides context,
-        AmbientLifecycleOwner provides viewTreeOwners.lifecycleOwner,
-        AmbientSavedStateRegistryOwner provides viewTreeOwners.savedStateRegistryOwner,
-        AmbientSaveableStateRegistry provides saveableStateRegistry,
-        AmbientView provides owner.view,
-        AmbientViewModelStoreOwner provides viewTreeOwners.viewModelStoreOwner
+        LocalConfiguration provides configuration,
+        LocalContext provides context,
+        LocalLifecycleOwner provides viewTreeOwners.lifecycleOwner,
+        LocalSavedStateRegistryOwner provides viewTreeOwners.savedStateRegistryOwner,
+        LocalSaveableStateRegistry provides saveableStateRegistry,
+        LocalView provides owner.view,
+        LocalViewModelStoreOwner provides viewTreeOwners.viewModelStoreOwner
     ) {
-        ProvideCommonAmbients(
+        ProvideCommonCompositionLocals(
             owner = owner,
             animationClock = rootAnimationClock,
             uriHandler = uriHandler,
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.kt
index 626a971..ec8747e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.kt
@@ -34,6 +34,9 @@
 import android.view.inputmethod.InputConnection
 import androidx.annotation.RequiresApi
 import androidx.compose.runtime.ExperimentalComposeApi
+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.autofill.AndroidAutofill
@@ -92,7 +95,6 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.util.trace
 import androidx.compose.ui.viewinterop.AndroidViewHolder
-import androidx.compose.ui.viewinterop.InternalInteropApi
 import androidx.core.view.ViewCompat
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
@@ -179,15 +181,15 @@
     // private val ownerScope = CoroutineScope(Dispatchers.Main.immediate + Job())
 
     /**
-     * Used for updating the ConfigurationAmbient when configuration changes - consume the
-     * configuration ambient instead of changing this observer if you are writing a component
-     * that adapts to configuration changes.
+     * Used for updating LocalConfiguration when configuration changes - consume LocalConfiguration
+     * instead of changing this observer if you are writing a component that adapts to
+     * configuration changes.
      */
     var configurationChangeObserver: (Configuration) -> Unit = {}
 
     private val _autofill = if (autofillSupported()) AndroidAutofill(this, autofillTree) else null
 
-    // Used as an ambient for performing autofill.
+    // Used as a CompositionLocal for performing autofill.
     override val autofill: Autofill? get() = _autofill
 
     private var observationClearRequested = false
@@ -279,7 +281,10 @@
 
     override val fontLoader: Font.ResourceLoader = AndroidFontResourceLoader(context)
 
-    override var layoutDirection = context.resources.configuration.localeLayoutDirection
+    // Backed by mutableStateOf so that the ambient provider recomposes when it changes
+    override var layoutDirection by mutableStateOf(
+        context.resources.configuration.localeLayoutDirection
+    )
         private set
 
     /**
@@ -376,7 +381,6 @@
      * Called to inform the owner that a new Android [View] was [attached][Owner.onAttach]
      * to the hierarchy.
      */
-    @OptIn(InternalInteropApi::class)
     fun addAndroidView(view: AndroidViewHolder, layoutNode: LayoutNode) {
         androidViewsHandler.layoutNode[view] = layoutNode
         androidViewsHandler.addView(view)
@@ -386,7 +390,6 @@
      * Called to inform the owner that an Android [View] was [detached][Owner.onDetach]
      * from the hierarchy.
      */
-    @OptIn(InternalInteropApi::class)
     fun removeAndroidView(view: AndroidViewHolder) {
         androidViewsHandler.removeView(view)
         androidViewsHandler.layoutNode.remove(view)
@@ -395,7 +398,6 @@
     /**
      * Called to ask the owner to draw a child Android [View] to [canvas].
      */
-    @OptIn(InternalInteropApi::class)
     fun drawAndroidView(view: AndroidViewHolder, canvas: android.graphics.Canvas) {
         androidViewsHandler.drawView(view, canvas)
     }
@@ -715,10 +717,13 @@
     override fun onConfigurationChanged(newConfig: Configuration) {
         super.onConfigurationChanged(newConfig)
         density = Density(context)
-        layoutDirection = context.resources.configuration.localeLayoutDirection
         configurationChangeObserver(newConfig)
     }
 
+    override fun onRtlPropertiesChanged(layoutDirection: Int) {
+        this.layoutDirection = layoutDirectionFromInt(layoutDirection)
+    }
+
     private fun autofillSupported() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
 
     public override fun dispatchHoverEvent(event: MotionEvent): Boolean {
@@ -780,10 +785,10 @@
     // be resolved since the composables may be composed without attaching to the RootViewImpl.
     // In Jetpack Compose, use the locale layout direction (i.e. layoutDirection came from
     // configuration) as a default layout direction.
-    get() = when (layoutDirection) {
-        android.util.LayoutDirection.LTR -> LayoutDirection.Ltr
-        android.util.LayoutDirection.RTL -> LayoutDirection.Rtl
-        // Configuration#getLayoutDirection should only return a resolved layout direction, LTR
-        // or RTL. Fallback to LTR for unexpected return value.
-        else -> LayoutDirection.Ltr
-    }
+    get() = layoutDirectionFromInt(layoutDirection)
+
+private fun layoutDirectionFromInt(layoutDirection: Int): LayoutDirection = when (layoutDirection) {
+    android.util.LayoutDirection.LTR -> LayoutDirection.Ltr
+    android.util.LayoutDirection.RTL -> LayoutDirection.Rtl
+    else -> LayoutDirection.Ltr
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.kt
index ea17709..8ff28a2 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.kt
@@ -469,17 +469,20 @@
             semanticsNode.config.getOrNull(SemanticsProperties.HorizontalScrollAxisRange)
         val scrollAction = semanticsNode.config.getOrNull(SemanticsActions.ScrollBy)
         if (xScrollState != null && scrollAction != null) {
+            val value = xScrollState.value()
+            val maxValue = xScrollState.maxValue()
+            val reverseScrolling = xScrollState.reverseScrolling
             // Talkback defines SCROLLABLE_ROLE_FILTER_FOR_DIRECTION_NAVIGATION, so we need to
             // assign a role for auto scroll to work.
             info.className = "android.widget.HorizontalScrollView"
-            if (xScrollState.maxValue > 0f) {
+            if (maxValue > 0f) {
                 info.isScrollable = true
             }
-            if (semanticsNode.enabled() && xScrollState.value < xScrollState.maxValue) {
+            if (semanticsNode.enabled() && value < maxValue) {
                 info.addAction(
                     AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_FORWARD
                 )
-                if (!xScrollState.reverseScrolling) {
+                if (!reverseScrolling) {
                     info.addAction(
                         AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_RIGHT
                     )
@@ -489,11 +492,11 @@
                     )
                 }
             }
-            if (semanticsNode.enabled() && xScrollState.value > 0f) {
+            if (semanticsNode.enabled() && value > 0f) {
                 info.addAction(
                     AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_BACKWARD
                 )
-                if (!xScrollState.reverseScrolling) {
+                if (!reverseScrolling) {
                     info.addAction(
                         AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_LEFT
                     )
@@ -507,17 +510,20 @@
         val yScrollState =
             semanticsNode.config.getOrNull(SemanticsProperties.VerticalScrollAxisRange)
         if (yScrollState != null && scrollAction != null) {
+            val value = yScrollState.value()
+            val maxValue = yScrollState.maxValue()
+            val reverseScrolling = yScrollState.reverseScrolling
             // Talkback defines SCROLLABLE_ROLE_FILTER_FOR_DIRECTION_NAVIGATION, so we need to
             // assign a role for auto scroll to work.
             info.className = "android.widget.ScrollView"
-            if (yScrollState.maxValue > 0f) {
+            if (maxValue > 0f) {
                 info.isScrollable = true
             }
-            if (semanticsNode.enabled() && yScrollState.value < yScrollState.maxValue) {
+            if (semanticsNode.enabled() && value < maxValue) {
                 info.addAction(
                     AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_FORWARD
                 )
-                if (!yScrollState.reverseScrolling) {
+                if (!reverseScrolling) {
                     info.addAction(
                         AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_DOWN
                     )
@@ -527,11 +533,11 @@
                     )
                 }
             }
-            if (semanticsNode.enabled() && yScrollState.value > 0f) {
+            if (semanticsNode.enabled() && value > 0f) {
                 info.addAction(
                     AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_BACKWARD
                 )
-                if (!yScrollState.reverseScrolling) {
+                if (!reverseScrolling) {
                     info.addAction(
                         AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_UP
                     )
@@ -546,6 +552,24 @@
         info.paneTitle = semanticsNode.config.getOrNull(SemanticsProperties.PaneTitle)
 
         if (semanticsNode.enabled()) {
+            semanticsNode.config.getOrNull(SemanticsActions.Expand)?.let {
+                info.addAction(
+                    AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_EXPAND,
+                        it.label
+                    )
+                )
+            }
+
+            semanticsNode.config.getOrNull(SemanticsActions.Collapse)?.let {
+                info.addAction(
+                    AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_COLLAPSE,
+                        it.label
+                    )
+                )
+            }
+
             semanticsNode.config.getOrNull(SemanticsActions.Dismiss)?.let {
                 info.addAction(
                     AccessibilityNodeInfoCompat.AccessibilityActionCompat(
@@ -889,7 +913,7 @@
                                 ) ||
                             (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
                         ) &&
-                        xScrollState.value < xScrollState.maxValue
+                        xScrollState.value() < xScrollState.maxValue()
                     ) {
                         return scrollAction.action(
                             node.globalBounds.right - node.globalBounds.left,
@@ -907,7 +931,7 @@
                                 ) ||
                             (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
                         ) &&
-                        xScrollState.value > 0
+                        xScrollState.value() > 0
                     ) {
                         return scrollAction.action(
                             -(node.globalBounds.right - node.globalBounds.left),
@@ -929,7 +953,7 @@
                                 ) ||
                             (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
                         ) &&
-                        yScrollState.value < yScrollState.maxValue
+                        yScrollState.value() < yScrollState.maxValue()
                     ) {
                         return scrollAction.action(
                             0f,
@@ -947,7 +971,7 @@
                                 ) ||
                             (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
                         ) &&
-                        yScrollState.value > 0
+                        yScrollState.value() > 0
                     ) {
                         return scrollAction.action(
                             0f,
@@ -992,6 +1016,16 @@
                     it.action()
                 } ?: false
             }
+            AccessibilityNodeInfoCompat.ACTION_EXPAND -> {
+                return node.config.getOrNull(SemanticsActions.Expand)?.let {
+                    it.action()
+                } ?: false
+            }
+            AccessibilityNodeInfoCompat.ACTION_COLLAPSE -> {
+                return node.config.getOrNull(SemanticsActions.Collapse)?.let {
+                    it.action()
+                } ?: false
+            }
             AccessibilityNodeInfoCompat.ACTION_DISMISS -> {
                 return node.config.getOrNull(SemanticsActions.Dismiss)?.let {
                     it.action()
@@ -1502,12 +1536,12 @@
                         )
                         notifySubtreeAccessibilityStateChangedIfNeeded(newNode.layoutNode)
                         val deltaX = if (newXState != null && oldXState != null) {
-                            newXState.value - oldXState.value
+                            newXState.value() - oldXState.value()
                         } else {
                             0f
                         }
                         val deltaY = if (newYState != null && oldYState != null) {
-                            newYState.value - oldYState.value
+                            newYState.value() - oldYState.value()
                         } else {
                             0f
                         }
@@ -1517,12 +1551,12 @@
                                 AccessibilityEvent.TYPE_VIEW_SCROLLED
                             )
                             if (newXState != null) {
-                                event.scrollX = newXState.value.toInt()
-                                event.maxScrollX = newXState.maxValue.toInt()
+                                event.scrollX = newXState.value().toInt()
+                                event.maxScrollX = newXState.maxValue().toInt()
                             }
                             if (newYState != null) {
-                                event.scrollY = newYState.value.toInt()
-                                event.maxScrollY = newYState.maxValue.toInt()
+                                event.scrollY = newYState.value().toInt()
+                                event.maxScrollY = newYState.maxValue().toInt()
                             }
                             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                                 Api28Impl.setScrollEventDelta(event, deltaX.toInt(), deltaY.toInt())
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.kt
index 34b1cd2..4c3ee8f 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.kt
@@ -25,7 +25,6 @@
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNode.LayoutState.NeedsRemeasure
 import androidx.compose.ui.viewinterop.AndroidViewHolder
-import androidx.compose.ui.viewinterop.InternalInteropApi
 
 /**
  * Used by [AndroidComposeView] to handle the Android [View]s attached to its hierarchy.
@@ -70,7 +69,6 @@
         layoutNode.keys.forEach { it.layout(it.left, it.top, it.right, it.bottom) }
     }
 
-    @OptIn(InternalInteropApi::class)
     fun drawView(view: AndroidViewHolder, canvas: Canvas) {
         // The canvas is already translated by the Compose logic. But the position of the
         // AndroidViewHolder is also set on it inside the AndroidViewsHandler, for correct
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.kt
index 5727f47..2b68829 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.kt
@@ -237,6 +237,14 @@
         )
     }
 
+    override fun onRtlPropertiesChanged(layoutDirection: Int) {
+        // Force the single child for our composition to have the same LayoutDirection
+        // that we do. We will get onRtlPropertiesChanged eagerly as the value changes,
+        // but the composition child view won't until it measures. This can be too late
+        // to catch the composition pass for that frame, so propagate it eagerly.
+        getChildAt(0)?.layoutDirection = layoutDirection
+    }
+
     // Below: enforce restrictions on adding child views to this ViewGroup
 
     override fun addView(child: View?) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt
index d702ebf..77cc50e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.snapshots.SnapshotWriteObserver
+import androidx.compose.runtime.snapshots.ObserverHandle
 import androidx.compose.ui.platform.GlobalSnapshotManager.ensureStarted
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.SupervisorJob
@@ -39,7 +39,7 @@
 internal object GlobalSnapshotManager {
     private val started = AtomicBoolean(false)
     private var commitPending = false
-    private var removeWriteObserver: (() -> Unit)? = null
+    private var removeWriteObserver: ObserverHandle? = null
 
     private val scheduleScope = CoroutineScope(AndroidUiDispatcher.Main + SupervisorJob())
 
@@ -51,7 +51,7 @@
     }
 
     @OptIn(ExperimentalComposeApi::class)
-    private val globalWriteObserver: SnapshotWriteObserver = {
+    private val globalWriteObserver: (Any) -> Unit = {
         // Race, but we don't care too much if we end up with multiple calls scheduled.
         if (!commitPending) {
             commitPending = true
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
index 988c6f0..52130e6 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
@@ -31,7 +31,7 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.Recomposer
 import androidx.compose.runtime.currentComposer
-import androidx.compose.runtime.tooling.InspectionTables
+import androidx.compose.runtime.tooling.LocalInspectionTables
 import androidx.compose.ui.R
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.UiApplier
@@ -93,7 +93,7 @@
  * Composes the given composable into the given view.
  *
  * The new composition can be logically "linked" to an existing one, by providing a
- * [parent]. This will ensure that invalidations and ambients will flow through
+ * [parent]. This will ensure that invalidations and CompositionLocals will flow through
  * the two compositions as if they were not separate.
  *
  * Note that this [ViewGroup] should have an unique id for the saved instance state mechanism to
@@ -195,8 +195,8 @@
                         LaunchedEffect(owner) { owner.keyboardVisibilityEventLoop() }
                         LaunchedEffect(owner) { owner.boundsUpdatesEventLoop() }
 
-                        Providers(InspectionTables provides inspectionTable) {
-                            ProvideAndroidAmbients(owner, content)
+                        Providers(LocalInspectionTables provides inspectionTable) {
+                            ProvideAndroidCompositionLocals(owner, content)
                         }
                     }
                 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.kt
index 8bc1caf..9a6108e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.kt
@@ -20,7 +20,7 @@
 import androidx.annotation.ColorRes
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 
 /**
  * Load a color resource.
@@ -30,7 +30,7 @@
  */
 @Composable
 fun colorResource(@ColorRes id: Int): Color {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     return if (Build.VERSION.SDK_INT >= 23) {
         Color(context.resources.getColor(id, context.theme))
     } else {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.kt
index ffef346..c2092de 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/FontResources.kt
@@ -20,7 +20,7 @@
 import android.util.TypedValue
 import androidx.annotation.GuardedBy
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.text.font.Typeface
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontListFontFamily
@@ -46,7 +46,7 @@
  */
 @Composable
 fun fontResource(fontFamily: FontFamily): Typeface {
-    return fontResourceFromContext(AmbientContext.current, fontFamily)
+    return fontResourceFromContext(LocalContext.current, fontFamily)
 }
 
 internal fun fontResourceFromContext(context: Context, fontFamily: FontFamily): Typeface {
@@ -84,7 +84,7 @@
     pendingFontFamily: FontFamily? = null,
     failedFontFamily: FontFamily? = null
 ): DeferredResource<Typeface> {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val pendingTypeface = if (pendingFontFamily == null) {
         null
     } else if (!pendingFontFamily.canLoadSynchronously) {
@@ -137,7 +137,7 @@
     pendingTypeface: Typeface? = null,
     failedTypeface: Typeface? = null
 ): DeferredResource<Typeface> {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     if (fontFamily.canLoadSynchronously) {
         val typeface = synchronized(cacheLock) {
             syncLoadedTypefaces.getOrPut(fontFamily) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.kt
index b8ad9f3..dc1e877 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/ImageResources.kt
@@ -22,7 +22,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.imageFromResource
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.util.trace
 
 /**
@@ -37,7 +37,7 @@
  */
 @Composable
 fun imageResource(@DrawableRes id: Int): ImageBitmap {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val value = remember { TypedValue() }
     context.resources.getValue(id, value, true)
     // We use the file path as a key of the request cache.
@@ -64,7 +64,7 @@
     pendingImage: ImageBitmap? = null,
     failedImage: ImageBitmap? = null
 ): DeferredResource<ImageBitmap> {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val res = context.resources
     val value = remember { TypedValue() }
     res.getValue(id, value, true)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.kt
index d8af23f..e2b2e26f 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.kt
@@ -31,7 +31,7 @@
 import androidx.compose.ui.graphics.vector.rememberVectorPainter
 import androidx.compose.ui.graphics.vector.VectorPainter
 import androidx.compose.ui.graphics.vector.compat.seekToStartTag
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 
 /**
  * Create a [Painter] from an Android resource id. This can load either an instance of
@@ -55,7 +55,7 @@
  */
 @Composable
 fun painterResource(@DrawableRes id: Int): Painter {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val res = context.resources
     val value = remember { TypedValue() }
     res.getValue(id, value, true)
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PrimitiveResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PrimitiveResources.kt
index 4011080..6c2fb81 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PrimitiveResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PrimitiveResources.kt
@@ -21,8 +21,8 @@
 import androidx.annotation.DimenRes
 import androidx.annotation.IntegerRes
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.AmbientContext
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Dp
 
 /**
@@ -33,7 +33,7 @@
  */
 @Composable
 fun integerResource(@IntegerRes id: Int): Int {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     return context.resources.getInteger(id)
 }
 
@@ -45,7 +45,7 @@
  */
 @Composable
 fun integerArrayResource(@ArrayRes id: Int): IntArray {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     return context.resources.getIntArray(id)
 }
 
@@ -57,7 +57,7 @@
  */
 @Composable
 fun booleanResource(@BoolRes id: Int): Boolean {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     return context.resources.getBoolean(id)
 }
 
@@ -69,8 +69,8 @@
  */
 @Composable
 fun dimensionResource(@DimenRes id: Int): Dp {
-    val context = AmbientContext.current
-    val density = AmbientDensity.current
+    val context = LocalContext.current
+    val density = LocalDensity.current
     val pxValue = context.resources.getDimension(id)
     return Dp(pxValue / density.density)
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.kt
index bb7e61a..70e41c5 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/StringResources.kt
@@ -20,8 +20,8 @@
 import androidx.annotation.ArrayRes
 import androidx.annotation.StringRes
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.AmbientConfiguration
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
 
 /**
  * Load a string resource.
@@ -66,6 +66,6 @@
  */
 @Composable
 private fun resources(): Resources {
-    AmbientConfiguration.current
-    return AmbientContext.current.resources
+    LocalConfiguration.current
+    return LocalContext.current.resources
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.kt
index 3fd252b..5730588 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.kt
@@ -28,7 +28,7 @@
 import androidx.compose.ui.graphics.vector.compat.isAtEnd
 import androidx.compose.ui.graphics.vector.compat.parseCurrentVectorNode
 import androidx.compose.ui.graphics.vector.compat.seekToStartTag
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.util.trace
 import org.xmlpull.v1.XmlPullParserException
 
@@ -44,7 +44,7 @@
  */
 @Composable
 fun vectorResource(@DrawableRes id: Int): ImageVector {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val res = context.resources
     val theme = context.theme
     return remember(id) {
@@ -72,7 +72,7 @@
     pendingResource: ImageVector? = null,
     failedResource: ImageVector? = null
 ): DeferredResource<ImageVector> {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val res = context.resources
     val theme = context.theme
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.kt
index 3ede46f..cc37b15 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.kt
@@ -225,9 +225,8 @@
             ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
             ImeAction.Send -> EditorInfo.IME_ACTION_SEND
             ImeAction.Done -> EditorInfo.IME_ACTION_DONE
-            else -> throw IllegalArgumentException(
-                "Unknown ImeAction: ${imeOptions.imeAction}"
-            )
+            // Note: Don't use an else in this when block. These are specified explicitly so
+            // that we don't forget to update this when imeActions are added/removed.
         }
         when (imeOptions.keyboardType) {
             KeyboardType.Text -> outInfo.inputType = InputType.TYPE_CLASS_TEXT
@@ -250,9 +249,8 @@
                 outInfo.inputType =
                     InputType.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD
             }
-            else -> throw IllegalArgumentException(
-                "Unknown KeyboardType: ${imeOptions.keyboardType}"
-            )
+            // Note: Don't use an else in this when block. These are specified explicitly so
+            // that we don't forget to update this when keyboardTypes are added/removed.
         }
 
         if (!imeOptions.singleLine) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.kt
index 1b8095c..e85083b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidView.kt
@@ -19,13 +19,20 @@
 import android.content.Context
 import android.view.View
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.currentComposer
 import androidx.compose.runtime.ComposeNode
+import androidx.compose.runtime.CompositionReference
+import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCompositionReference
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.materialize
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.node.Ref
 import androidx.compose.ui.node.UiApplier
-import androidx.compose.ui.platform.AmbientContext
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.LayoutDirection
 
 /**
  * Composes an Android [View] obtained from [viewBlock]. The [viewBlock] block will be called
@@ -49,16 +56,30 @@
     modifier: Modifier = Modifier,
     update: (T) -> Unit = NoOpUpdate
 ) {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val materialized = currentComposer.materialize(modifier)
-    val density = AmbientDensity.current
-    ComposeNode<ViewBlockHolder<T>, UiApplier>(
-        factory = { ViewBlockHolder(context) },
+    val density = LocalDensity.current
+    val layoutDirection = LocalLayoutDirection.current
+    val parentReference = rememberCompositionReference()
+    val viewBlockHolderRef = remember { Ref<ViewBlockHolder<T>>() }
+    ComposeNode<LayoutNode, UiApplier>(
+        factory = {
+            val viewBlockHolder = ViewBlockHolder<T>(context, parentReference)
+            viewBlockHolder.viewBlock = viewBlock
+            viewBlockHolderRef.value = viewBlockHolder
+            viewBlockHolder.toLayoutNode()
+        },
         update = {
-            set(viewBlock) { this.viewBlock = it }
-            set(materialized) { this.modifier = it }
-            set(density) { this.density = it }
-            set(update) { this.updateBlock = it }
+            set(viewBlock) { viewBlockHolderRef.value!!.viewBlock = it }
+            set(materialized) { viewBlockHolderRef.value!!.modifier = it }
+            set(density) { viewBlockHolderRef.value!!.density = it }
+            set(update) { viewBlockHolderRef.value!!.updateBlock = it }
+            set(layoutDirection) {
+                viewBlockHolderRef.value!!.layoutDirection = when (it) {
+                    LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                    LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+                }
+            }
         }
     )
 }
@@ -68,10 +89,11 @@
  */
 val NoOpUpdate: View.() -> Unit = {}
 
-@OptIn(InternalInteropApi::class)
 internal class ViewBlockHolder<T : View>(
-    context: Context
-) : AndroidViewHolder(context) {
+    context: Context,
+    parentReference: CompositionReference? = null
+) : AndroidViewHolder(context, parentReference) {
+
     private var typedView: T? = null
 
     var viewBlock: ((Context) -> T)? = null
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.kt
index 48fb0f6..e7ce699 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.kt
@@ -20,10 +20,25 @@
 import android.os.Looper
 import android.view.View
 import android.view.ViewGroup
+import androidx.compose.runtime.CompositionReference
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.snapshots.SnapshotStateObserver
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.input.pointer.pointerInteropFilter
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.platform.AndroidComposeView
+import androidx.compose.ui.platform.compositionReference
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
+import kotlin.math.roundToInt
 
 /**
  * A base class used to host a [View] inside Compose.
@@ -32,10 +47,19 @@
  */
 // Opt in snapshot observing APIs.
 @OptIn(ExperimentalComposeApi::class)
-@InternalInteropApi
-abstract class AndroidViewHolder(context: Context) : ViewGroup(context) {
+internal abstract class AndroidViewHolder(
+    context: Context,
+    parentReference: CompositionReference?
+) : ViewGroup(context) {
     init {
         clipChildren = false
+
+        // Any [Abstract]ComposeViews that are descendants of this view will host
+        // subcompositions of the host composition.
+        // UiApplier doesn't supply this, only AndroidView.
+        parentReference?.let {
+            compositionReference = it
+        }
     }
 
     /**
@@ -106,9 +130,7 @@
     @OptIn(ExperimentalComposeApi::class)
     private val runUpdate: () -> Unit = {
         if (hasUpdateBlock) {
-            snapshotObserver.observeReads(this, onCommitAffectingUpdate) {
-                update()
-            }
+            snapshotObserver.observeReads(this, onCommitAffectingUpdate, update)
         }
     }
 
@@ -144,16 +166,115 @@
         // remove all observations:
         snapshotObserver.clear()
     }
+
+    /**
+     * Builds a [LayoutNode] tree representation for this Android [View] holder.
+     * The [LayoutNode] will proxy the Compose core calls to the [View].
+     */
+    fun toLayoutNode(): LayoutNode {
+        // TODO(soboleva): add layout direction here?
+        // TODO(popam): forward pointer input, accessibility, focus
+        // Prepare layout node that proxies measure and layout passes to the View.
+        val layoutNode = LayoutNode()
+
+        val coreModifier = Modifier
+            .pointerInteropFilter(this)
+            .drawBehind {
+                drawIntoCanvas { canvas ->
+                    (layoutNode.owner as? AndroidComposeView)
+                        ?.drawAndroidView(this@AndroidViewHolder, canvas.nativeCanvas)
+                }
+            }.onGloballyPositioned {
+                // The global position of this LayoutNode can change with it being replaced. For
+                // these cases, we need to inform the View.
+                layoutAccordingTo(layoutNode)
+            }
+        layoutNode.modifier = modifier.then(coreModifier)
+        onModifierChanged = { layoutNode.modifier = it.then(coreModifier) }
+
+        layoutNode.density = density
+        onDensityChanged = { layoutNode.density = it }
+
+        var viewRemovedOnDetach: View? = null
+        layoutNode.onAttach = { owner ->
+            (owner as? AndroidComposeView)?.addAndroidView(this, layoutNode)
+            if (viewRemovedOnDetach != null) view = viewRemovedOnDetach
+        }
+        layoutNode.onDetach = { owner ->
+            (owner as? AndroidComposeView)?.removeAndroidView(this)
+            viewRemovedOnDetach = view
+            view = null
+        }
+
+        layoutNode.measureBlocks = object : LayoutNode.NoIntrinsicsMeasureBlocks(
+            "Intrinsics not supported for Android views"
+        ) {
+            override fun measure(
+                measureScope: MeasureScope,
+                measurables: List<Measurable>,
+                constraints: Constraints
+            ): MeasureResult {
+                if (constraints.minWidth != 0) {
+                    getChildAt(0).minimumWidth = constraints.minWidth
+                }
+                if (constraints.minHeight != 0) {
+                    getChildAt(0).minimumHeight = constraints.minHeight
+                }
+                // TODO (soboleva): native view should get LD value from Compose?
+
+                // TODO(shepshapard): !! necessary?
+                measure(
+                    obtainMeasureSpec(
+                        constraints.minWidth,
+                        constraints.maxWidth,
+                        layoutParams!!.width
+                    ),
+                    obtainMeasureSpec(
+                        constraints.minHeight,
+                        constraints.maxHeight,
+                        layoutParams!!.height
+                    )
+                )
+                return measureScope.layout(measuredWidth, measuredHeight) {
+                    layoutAccordingTo(layoutNode)
+                }
+            }
+        }
+        return layoutNode
+    }
+
+    /**
+     * Intersects [Constraints] and [View] LayoutParams to obtain the suitable [View.MeasureSpec]
+     * for measuring the [View].
+     */
+    private fun obtainMeasureSpec(
+        min: Int,
+        max: Int,
+        preferred: Int
+    ): Int = when {
+        preferred >= 0 || min == max -> {
+            // Fixed size due to fixed size layout param or fixed constraints.
+            MeasureSpec.makeMeasureSpec(preferred.coerceIn(min, max), MeasureSpec.EXACTLY)
+        }
+        preferred == LayoutParams.WRAP_CONTENT && max != Constraints.Infinity -> {
+            // Wrap content layout param with finite max constraint. If max constraint is infinite,
+            // we will measure the child with UNSPECIFIED.
+            MeasureSpec.makeMeasureSpec(max, MeasureSpec.AT_MOST)
+        }
+        preferred == LayoutParams.MATCH_PARENT && max != Constraints.Infinity -> {
+            // Match parent layout param, so we force the child to fill the available space.
+            MeasureSpec.makeMeasureSpec(max, MeasureSpec.EXACTLY)
+        }
+        else -> {
+            // max constraint is infinite and layout param is WRAP_CONTENT or MATCH_PARENT.
+            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
+        }
+    }
 }
 
-@RequiresOptIn(
-    level = RequiresOptIn.Level.ERROR,
-    message = "This is an experimental API for Compose UI LayoutNode and is likely to change " +
-        "before becoming stable."
-)
-@Target(
-    AnnotationTarget.CLASS,
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY
-)
-annotation class InternalInteropApi
+private fun View.layoutAccordingTo(layoutNode: LayoutNode) {
+    val position = layoutNode.coordinates.positionInRoot()
+    val x = position.x.roundToInt()
+    val y = position.y.roundToInt()
+    layout(x, y, x + measuredWidth, y + measuredHeight)
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/EmitView.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/EmitView.kt
index 7cf7d64..5686ab9 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/EmitView.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/EmitView.kt
@@ -22,7 +22,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.ui.node.UiApplier
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 
 @Suppress("ComposableNaming")
 @Composable
@@ -35,7 +35,7 @@
     ctor: (Context) -> T,
     update: (T) -> Unit
 ) {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     ComposeNode<T, UiApplier>(
         factory = { ctor(context) },
         update = {
@@ -56,7 +56,7 @@
     update: (T) -> Unit,
     children: @Composable () -> Unit
 ) {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     ComposeNode<T, UiApplier>(
         factory = { ctor(context) },
         update = {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/ViewModel.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/ViewModel.kt
index ffacdc6..5e8c29794 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/ViewModel.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/ViewModel.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.viewinterop
 
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.AmbientViewModelStoreOwner
+import androidx.compose.ui.platform.LocalViewModelStoreOwner
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelStoreOwner
@@ -57,7 +57,7 @@
     modelClass: Class<T>,
     key: String? = null,
     factory: ViewModelProvider.Factory? = null
-): T = AmbientViewModelStoreOwner.current.get(modelClass, key, factory)
+): T = LocalViewModelStoreOwner.current.get(modelClass, key, factory)
 
 private fun <T : ViewModel> ViewModelStoreOwner.get(
     javaClass: Class<T>,
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.kt
index 6779455..4a7a9b6 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidDialog.kt
@@ -41,11 +41,13 @@
 import androidx.compose.ui.R
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.platform.AbstractComposeView
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.semantics.dialog
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastMap
@@ -110,8 +112,8 @@
     properties: DialogProperties?,
     content: @Composable () -> Unit
 ) {
-    val view = AmbientView.current
-    val density = AmbientDensity.current
+    val view = LocalView.current
+    val density = LocalDensity.current
     val composition = rememberCompositionReference()
     val currentContent by rememberUpdatedState(content)
     val dialog = remember(view, density) {
@@ -139,8 +141,15 @@
         }
     }
 
+    val layoutDirection = LocalLayoutDirection.current
     SideEffect {
         dialog.onDismissRequest = onDismissRequest
+        dialog.setLayoutDirection(
+            when (layoutDirection) {
+                LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+            }
+        )
         dialog.setProperties(properties)
     }
 }
@@ -242,6 +251,10 @@
         )
     }
 
+    fun setLayoutDirection(layoutDirection: Int) {
+        dialogLayout.layoutDirection = layoutDirection
+    }
+
     // TODO(b/159900354): Make the Android Dialog full screen and the scrim fully transparent
 
     fun setContent(parentComposition: CompositionReference, children: @Composable () -> Unit) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.kt
index 050c347..83b7db3 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.kt
@@ -46,12 +46,13 @@
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.layout.positionInWindow
 import androidx.compose.ui.platform.AbstractComposeView
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientView
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.semantics.popup
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -122,9 +123,9 @@
     properties: PopupProperties?,
     content: @Composable () -> Unit
 ) {
-    val view = AmbientView.current
-    val density = AmbientDensity.current
-    val testTag = AmbientPopupTestTag.current
+    val view = LocalView.current
+    val density = LocalDensity.current
+    val testTag = LocalPopupTestTag.current
     val parentComposition = rememberCompositionReference()
     val currentContent by rememberUpdatedState(content)
 
@@ -149,6 +150,7 @@
     }
 
     DisposableEffect(popupLayout) {
+        popupLayout.show()
         onDispose {
             popupLayout.disposeComposition()
             // Remove the window
@@ -156,10 +158,17 @@
         }
     }
 
+    val layoutDirection = LocalLayoutDirection.current
     SideEffect {
         popupLayout.apply {
             this.onDismissRequest = onDismissRequest
             this.testTag = testTag
+            this.superSetLayoutDirection(
+                when (layoutDirection) {
+                    LayoutDirection.Ltr -> android.util.LayoutDirection.LTR
+                    LayoutDirection.Rtl -> android.util.LayoutDirection.RTL
+                }
+            )
             setIsFocusable(isFocusable)
             setProperties(properties)
         }
@@ -183,7 +192,7 @@
             val position = coordinates.positionInWindow()
             val layoutPosition = IntOffset(position.x.roundToInt(), position.y.roundToInt())
 
-            popupLayout.parentBounds = IntBounds(layoutPosition, layoutSize)
+            popupLayout.parentBounds = IntRect(layoutPosition, layoutSize)
             // Update the popup's position
             popupLayout.updatePosition()
         }
@@ -252,7 +261,7 @@
 
     // Position params
     var parentLayoutDirection: LayoutDirection = LayoutDirection.Ltr
-    var parentBounds: IntBounds? by mutableStateOf(null)
+    var parentBounds: IntRect? by mutableStateOf(null)
     var popupContentSize: IntSize? by mutableStateOf(null)
 
     var properties: AndroidPopupProperties = AndroidPopupProperties()
@@ -284,8 +293,6 @@
                 result.alpha = 0f
             }
         }
-
-        windowManager.addView(this, params)
     }
 
     private var content: @Composable () -> Unit by mutableStateOf({})
@@ -293,11 +300,14 @@
     override var shouldCreateCompositionOnAttachedToWindow: Boolean = false
         private set
 
+    fun show() {
+        windowManager.addView(this, params)
+    }
+
     fun setContent(parent: CompositionReference, content: @Composable () -> Unit) {
         setParentCompositionReference(parent)
         this.content = content
         shouldCreateCompositionOnAttachedToWindow = true
-        createComposition()
     }
 
     @Composable
@@ -420,6 +430,17 @@
         return super.onTouchEvent(event)
     }
 
+    override fun setLayoutDirection(layoutDirection: Int) {
+        // Do nothing. ViewRootImpl will call this method attempting to set the layout direction
+        // from the context's locale, but we have one already from the parent composition.
+    }
+
+    // Called by composition side effect to set the "real" layout direction for our content
+    // that we obtain from the parent composition.
+    fun superSetLayoutDirection(layoutDirection: Int) {
+        super.setLayoutDirection(layoutDirection)
+    }
+
     /**
      * Initialize the LayoutParams specific to [android.widget.PopupWindow].
      */
@@ -454,7 +475,7 @@
         }
     }
 
-    private fun Rect.toIntBounds() = IntBounds(
+    private fun Rect.toIntBounds() = IntRect(
         left = left,
         top = top,
         right = right,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt
index 32bdaca..981a975 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/autofill/Autofill.kt
@@ -22,9 +22,9 @@
 /**
  * Autofill API.
  *
- * This interface is available to all composables via an ambient. The composable can then request
- * or cancel autofill as required. For instance, the [TextField] can call [requestAutofillForNode]
- * when it gains focus, and [cancelAutofillForNode] when it loses focus.
+ * This interface is available to all composables via a CompositionLocal. The composable can then
+ * request or cancel autofill as required. For instance, the [TextField] can call
+ * [requestAutofillForNode] when it gains focus, and [cancelAutofillForNode] when it loses focus.
  */
 @ExperimentalComposeUiApi
 interface Autofill {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt
index b8a8cfd..892199b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/Shadow.kt
@@ -22,7 +22,7 @@
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -61,7 +61,7 @@
         }
     ) {
         graphicsLayer(
-            shadowElevation = with(AmbientDensity.current) { elevation.toPx() },
+            shadowElevation = with(LocalDensity.current) { elevation.toPx() },
             shape = shape,
             clip = clip
         )
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragGestureFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragGestureFilter.kt
index 2066d92..a58fe9b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragGestureFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragGestureFilter.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file: Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.runtime.remember
@@ -55,6 +57,7 @@
  * should be set to true when the child of the GestureDetector is animating, such that when a finger
  * touches it, dragging is immediately started so the animation stops and dragging can occur.
  */
+@Deprecated("Use Modifier.pointerInput{ detectDragGestures(... )} instead")
 fun Modifier.dragGestureFilter(
     dragObserver: DragObserver,
     canDrag: ((Direction) -> Boolean)? = null,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragSlopExceededGestureFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragSlopExceededGestureFilter.kt
index 141b8ec..245a96d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragSlopExceededGestureFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/DragSlopExceededGestureFilter.kt
@@ -30,7 +30,7 @@
 import androidx.compose.ui.input.pointer.PointerInputFilter
 import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed
 import androidx.compose.ui.input.pointer.positionChange
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.IntSize
 import kotlin.math.abs
@@ -57,6 +57,7 @@
  * those that are included in the given orientation and does not consider pointers that are locked
  * to other orientations.
  */
+@Deprecated("Use Modifier.pointerInput{ } and awaitTouchSlopOrCancellation function")
 fun Modifier.dragSlopExceededGestureFilter(
     onDragSlopExceeded: () -> Unit,
     canDrag: ((Direction) -> Boolean)? = null,
@@ -69,7 +70,7 @@
         properties["orientation"] = orientation
     }
 ) {
-    val touchSlop = with(AmbientDensity.current) { TouchSlop.toPx() }
+    val touchSlop = with(LocalDensity.current) { TouchSlop.toPx() }
     val filter = remember {
         DragSlopExceededGestureFilter(touchSlop)
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/GestureUtils.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/GestureUtils.kt
index ca61dfd..f760c94 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/GestureUtils.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/GestureUtils.kt
@@ -32,7 +32,7 @@
  *
  * @return True if at least one pointer is in bounds.
  */
-fun List<PointerInputChange>.anyPointersInBounds(bounds: IntSize) =
+internal fun List<PointerInputChange>.anyPointersInBounds(bounds: IntSize) =
     fastAny {
         it.pressed &&
             it.position.x >= 0 &&
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilter.kt
index 02729d1..d62a92a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/LongPressDragGestureFilter.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.runtime.remember
@@ -27,6 +29,7 @@
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.IntSize
 
+@Deprecated("Use Modifier.pointerInput {detectDragGesturesAfterLongPress(...)} instead")
 interface LongPressDragObserver {
 
     /**
@@ -117,7 +120,7 @@
  * @param longPressDragObserver The callback interface to report all events.
  * @see LongPressDragObserver
  */
-@Suppress("DEPRECATION")
+@Deprecated("Use Modifier.pointerInput { detectDragGesturesAfterLongPress(...)} instead.")
 fun Modifier.longPressDragGestureFilter(
     longPressDragObserver: LongPressDragObserver
 ): Modifier = composed(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawDragGestureFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawDragGestureFilter.kt
index 8723333..4747b9f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawDragGestureFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawDragGestureFilter.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.runtime.remember
@@ -44,6 +46,8 @@
 /**
  * Defines the callbacks associated with dragging.
  */
+
+@Deprecated("Use Modifier.pointerInput { detectDragGestures(...) }")
 interface DragObserver {
 
     /**
@@ -145,6 +149,7 @@
 
 // TODO(b/129784010): Consider also allowing onStart, onDrag, and onStop to be set individually
 //  (instead of all being set via DragObserver).
+@Deprecated("use Modifier.pointerInput { } with awaitFirstDown() and drag() functions")
 fun Modifier.rawDragGestureFilter(
     dragObserver: DragObserver,
     canStartDragging: (() -> Boolean)? = null,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilter.kt
index d639313..a1bfe51 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/RawPressStartGestureFilter.kt
@@ -51,6 +51,7 @@
  * @param executionPass The [PointerEventPass] during which this GestureDetector will attempt to
  * react to and consume down changes.  Defaults to [PointerEventPass.Main].
  */
+@Deprecated("Use Modifier.pointerInput{} with custom gesture detection code")
 fun Modifier.rawPressStartGestureFilter(
     onPressStart: (Offset) -> Unit,
     enabled: Boolean = false,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/ScrollGestureFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/ScrollGestureFilter.kt
index 0e569c1..fa96d54 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/ScrollGestureFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/ScrollGestureFilter.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.runtime.remember
@@ -28,6 +30,10 @@
 /**
  * Defines the callbacks associated with scrolling.
  */
+@Deprecated(
+    "Use Modifier.scrollable instead. Alternatively, use Modifier.pointerInput with " +
+        "detectDragGestures function and calculate velocity by hand"
+)
 interface ScrollCallback {
 
     /**
@@ -113,6 +119,10 @@
  */
 // TODO(shepshapard): Consider breaking up ScrollCallback such that the onScroll lambda can be
 //  the final parameter.
+@Deprecated(
+    "Use Modifier.scrollable instead. Alternatively, use Modifier.pointerInput with " +
+        "detectDragGestures function and calculate velocity by hand"
+)
 fun Modifier.scrollGestureFilter(
     scrollCallback: ScrollCallback,
     orientation: Orientation,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
index 95807e3..b1bd0a7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
@@ -30,7 +30,7 @@
 import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Dp
 
 /**
@@ -66,7 +66,7 @@
     tintBlendMode: BlendMode = BlendMode.SrcIn,
     content: @Composable (viewportWidth: Float, viewportHeight: Float) -> Unit
 ): VectorPainter {
-    val density = AmbientDensity.current
+    val density = LocalDensity.current
     val widthPx = with(density) { defaultWidth.toPx() }
     val heightPx = with(density) { defaultHeight.toPx() }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
index 8fc5e32..fc8fa7e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
@@ -21,8 +21,8 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientViewConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Density
@@ -133,8 +133,8 @@
         this.properties["block"] = block
     }
 ) {
-    val density = AmbientDensity.current
-    val viewConfiguration = AmbientViewConfiguration.current
+    val density = LocalDensity.current
+    val viewConfiguration = LocalViewConfiguration.current
     remember(density) { SuspendingPointerInputFilter(viewConfiguration, density) }.apply {
         LaunchedEffect(this) {
             block()
@@ -152,7 +152,7 @@
  * a LayoutNode.
  *
  * [SuspendingPointerInputFilter] implements the [PointerInputScope] used to offer the
- * [Modifier.pointerInput] DSL and carries the [Density] from [AmbientDensity] at the point of
+ * [Modifier.pointerInput] DSL and carries the [Density] from [LocalDensity] at the point of
  * the modifier's materialization. Even if this value were returned to the [PointerInputFilter]
  * callbacks, we would still need the value at composition time in order for [Modifier.pointerInput]
  * to begin its internal [LaunchedEffect] for the provided code block.
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 7277de7..34c0b46 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
@@ -31,8 +31,8 @@
 import androidx.compose.ui.node.LayoutEmitHelper
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.MeasureBlocks
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.simpleIdentityToString
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
@@ -225,8 +225,8 @@
     modifier: Modifier = Modifier
 ) {
     @OptIn(ExperimentalComposeApi::class)
-    val density = AmbientDensity.current
-    val layoutDirection = AmbientLayoutDirection.current
+    val density = LocalDensity.current
+    val layoutDirection = LocalLayoutDirection.current
     ComposeNode<LayoutNode, Applier<Any>>(
         factory = LayoutEmitHelper.constructor,
         update = {
@@ -262,8 +262,8 @@
 ) {
     val measureBlocks = remember(measureBlock) { MeasuringIntrinsicsMeasureBlocks(measureBlock) }
     val materialized = currentComposer.materialize(modifier)
-    val density = AmbientDensity.current
-    val layoutDirection = AmbientLayoutDirection.current
+    val density = LocalDensity.current
+    val layoutDirection = LocalLayoutDirection.current
 
     @OptIn(ExperimentalComposeApi::class)
     ComposeNode<LayoutNode, Applier<Any>>(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
index 14f8ce2..0165bf0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
@@ -69,3 +69,14 @@
     val coordinates: LayoutCoordinates,
     val extra: Any? = null
 )
+
+/**
+ * The info about the graphics layers used by tooling.
+ */
+interface GraphicLayerInfo {
+    /**
+     * The ID of the layer. This is used by tooling to match a layer to the associated
+     * LayoutNode.
+     */
+    val layerId: Long
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
index d2777f9..abe490a2 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
@@ -32,8 +32,8 @@
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNode.LayoutState
 import androidx.compose.ui.node.MeasureBlocks
-import androidx.compose.ui.platform.AmbientDensity
-import androidx.compose.ui.platform.AmbientLayoutDirection
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.subcomposeInto
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.LayoutDirection
@@ -67,8 +67,8 @@
     state.compositionRef = rememberCompositionReference()
 
     val materialized = currentComposer.materialize(modifier)
-    val density = AmbientDensity.current
-    val layoutDirection = AmbientLayoutDirection.current
+    val density = LocalDensity.current
+    val layoutDirection = LocalLayoutDirection.current
     ComposeNode<LayoutNode, Applier<Any>>(
         factory = LayoutEmitHelper.constructor,
         update = {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index c4b79fe..0db033a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -19,10 +19,10 @@
 import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.DrawModifier
-import androidx.compose.ui.focus.FocusModifier
-import androidx.compose.ui.focus.FocusRequesterModifier
 import androidx.compose.ui.focus.FocusEventModifier
+import androidx.compose.ui.focus.FocusModifier
 import androidx.compose.ui.focus.FocusOrderModifier
+import androidx.compose.ui.focus.FocusRequesterModifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.nestedscroll.NestedScrollDelegatingWrapper
 import androidx.compose.ui.gesture.nestedscroll.NestedScrollModifier
@@ -61,7 +61,6 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.util.deleteAt
 import kotlin.math.roundToInt
 
 /**
@@ -410,11 +409,13 @@
             tree.append(child.debugTreeToString(depth + 1))
         }
 
+        var treeString = tree.toString()
         if (depth == 0) {
             // Delete trailing newline
-            tree.deleteAt(tree.length - 1)
+            treeString = treeString.substring(0, treeString.length - 1)
         }
-        return tree.toString()
+
+        return treeString
     }
 
     internal abstract class NoIntrinsicsMeasureBlocks(private val error: String) : MeasureBlocks {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
index dcc372f..5be6bfd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
@@ -16,10 +16,11 @@
 
 package androidx.compose.ui.node
 
-import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Matrix
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.graphics.TransformOrigin
+import androidx.compose.ui.layout.GraphicLayerInfo
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -27,12 +28,7 @@
 /**
  * A layer returned by [Owner.createLayer] to separate drawn content.
  */
-interface OwnedLayer {
-    /**
-     * The ID of the layer. This is used by tooling to match a layer to the associated
-     * LayoutNode.
-     */
-    val layerId: Long
+internal interface OwnedLayer : GraphicLayerInfo {
 
     /**
      * Applies the new layer properties and causing this layer to be redrawn.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
index 67963a8..eebbda9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
@@ -73,7 +73,8 @@
     val autofillTree: AutofillTree
 
     /**
-     * The [Autofill] class can be used to perform autofill operations. It is used as an ambient.
+     * The [Autofill] class can be used to perform autofill operations. It is used as a
+     * CompositionLocal.
      */
     @get:ExperimentalComposeUiApi
     @ExperimentalComposeUiApi
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerScope.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerScope.kt
index 3a4e1f8..7c375b7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerScope.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerScope.kt
@@ -22,7 +22,7 @@
  *
  * @see Owner.observeReads
  */
-interface OwnerScope {
+internal interface OwnerScope {
     /**
      * `true` when the scope is still in the hierarchy and `false` once it has been removed and
      * observations are no longer necessary.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt
index b7bec7f..2e4301b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnerSnapshotObserver.kt
@@ -23,10 +23,9 @@
  * Performs snapshot observation for blocks like draw and layout which should be re-invoked
  * automatically when the snapshot value has been changed.
  */
-// TODO make it internal once Owner is internal
 @OptIn(ExperimentalComposeApi::class)
 @Suppress("CallbackName") // TODO rename this and SnapshotStateObserver. b/173401548
-class OwnerSnapshotObserver(onChangedExecutor: (callback: () -> Unit) -> Unit) {
+internal class OwnerSnapshotObserver(onChangedExecutor: (callback: () -> Unit) -> Unit) {
 
     private val observer = SnapshotStateObserver(onChangedExecutor)
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Ambients.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Ambients.kt
index 54c4b7d..57b5964 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Ambients.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/Ambients.kt
@@ -19,7 +19,7 @@
 import androidx.compose.animation.core.AnimationClockObservable
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.autofill.Autofill
 import androidx.compose.ui.autofill.AutofillTree
@@ -34,110 +34,296 @@
 /**
  * The default animation clock used for animations when an explicit clock isn't provided.
  */
-val AmbientAnimationClock = staticAmbientOf<AnimationClockObservable>()
+@Deprecated(
+    "Renamed to LocalAnimationClock",
+    replaceWith = ReplaceWith(
+        "LocalAnimationClock",
+        "androidx.compose.ui.platform.LocalAnimationClock"
+    )
+)
+val AmbientAnimationClock get() = LocalAnimationClock
 
 /**
- * The ambient that can be used to trigger autofill actions. Eg. [Autofill.requestAutofillForNode].
+ * The default animation clock used for animations when an explicit clock isn't provided.
+ */
+val LocalAnimationClock = staticCompositionLocalOf<AnimationClockObservable>()
+
+/**
+ * The CompositionLocal that can be used to trigger autofill actions.
+ * Eg. [Autofill.requestAutofillForNode].
  */
 @get:ExperimentalComposeUiApi
 @ExperimentalComposeUiApi
-val AmbientAutofill = staticAmbientOf<Autofill?>()
+@Deprecated(
+    "Renamed to LocalAutofill",
+    replaceWith = ReplaceWith(
+        "LocalAutofill",
+        "androidx.compose.ui.platform.LocalAutofill"
+    )
+)
+val AmbientAutofill get() = LocalAutofill
 
 /**
- * The ambient that can be used to add
+ * The CompositionLocal that can be used to trigger autofill actions.
+ * Eg. [Autofill.requestAutofillForNode].
+ */
+@get:ExperimentalComposeUiApi
+@ExperimentalComposeUiApi
+val LocalAutofill = staticCompositionLocalOf<Autofill?>()
+
+/**
+ * The CompositionLocal that can be used to add
  * [AutofillNode][import androidx.compose.ui.autofill.AutofillNode]s to the autofill tree. The
  * [AutofillTree] is a temporary data structure that will be replaced by Autofill Semantics
  * (b/138604305).
  */
 @get:ExperimentalComposeUiApi
 @ExperimentalComposeUiApi
-val AmbientAutofillTree = staticAmbientOf<AutofillTree>()
+@Deprecated(
+    "Renamed to LocalAutofillTree",
+    replaceWith = ReplaceWith(
+        "LocalAutofillTree",
+        "androidx.compose.ui.platform.LocalAutofillTree"
+    )
+)
+val AmbientAutofillTree get() = LocalAutofillTree
 
 /**
- * The ambient to provide communication with platform clipboard service.
+ * The CompositionLocal that can be used to add
+ * [AutofillNode][import androidx.compose.ui.autofill.AutofillNode]s to the autofill tree. The
+ * [AutofillTree] is a temporary data structure that will be replaced by Autofill Semantics
+ * (b/138604305).
  */
-val AmbientClipboardManager = staticAmbientOf<ClipboardManager>()
+@get:ExperimentalComposeUiApi
+@ExperimentalComposeUiApi
+val LocalAutofillTree = staticCompositionLocalOf<AutofillTree>()
+
+/**
+ * The CompositionLocal to provide communication with platform clipboard service.
+ */
+@Deprecated(
+    "Renamed to LocalClipboardManager",
+    replaceWith = ReplaceWith(
+        "LocalClipboardManager",
+        "androidx.compose.ui.platform.LocalClipboardManager"
+    )
+)
+val AmbientClipboardManager get() = LocalClipboardManager
+
+/**
+ * The CompositionLocal to provide communication with platform clipboard service.
+ */
+val LocalClipboardManager = staticCompositionLocalOf<ClipboardManager>()
 
 /**
  * Provides the [Density] to be used to transform between [density-independent pixel
  * units (DP)][androidx.compose.ui.unit.Dp] and [pixel units][androidx.compose.ui.unit.Px] or
  * [scale-independent pixel units (SP)][androidx.compose.ui.unit.TextUnit] and
- * [pixel units][androidx.compose.ui.unit.Px]. This is typically used when a [DP][androidx.compose.ui.unit.Dp]
- * is provided and it must be converted in the body of [Layout] or [DrawModifier].
+ * [pixel units][androidx.compose.ui.unit.Px]. This is typically used when a
+ * [DP][androidx.compose.ui.unit.Dp] is provided and it must be converted in the body of [Layout]
+ * or [DrawModifier].
  */
-val AmbientDensity = staticAmbientOf<Density>()
+@Deprecated(
+    "Renamed to LocalDensity",
+    replaceWith = ReplaceWith(
+        "LocalDensity",
+        "androidx.compose.ui.platform.LocalDensity"
+    )
+)
+val AmbientDensity get() = LocalDensity
 
 /**
- * The ambient that can be used to control focus within Compose.
+ * Provides the [Density] to be used to transform between [density-independent pixel
+ * units (DP)][androidx.compose.ui.unit.Dp] and [pixel units][androidx.compose.ui.unit.Px] or
+ * [scale-independent pixel units (SP)][androidx.compose.ui.unit.TextUnit] and
+ * [pixel units][androidx.compose.ui.unit.Px]. This is typically used when a
+ * [DP][androidx.compose.ui.unit.Dp] is provided and it must be converted in the body of [Layout]
+ * or [DrawModifier].
  */
-val AmbientFocusManager = staticAmbientOf<FocusManager>()
+val LocalDensity = staticCompositionLocalOf<Density>()
 
 /**
- * The ambient to provide platform font loading methods.
+ * The CompositionLocal that can be used to control focus within Compose.
+ */
+@Deprecated(
+    "Renamed to LocalFocusManager",
+    replaceWith = ReplaceWith(
+        "LocalFocusManager",
+        "androidx.compose.ui.platform.LocalFocusManager"
+    )
+)
+val AmbientFocusManager get() = LocalFocusManager
+
+/**
+ * The CompositionLocal that can be used to control focus within Compose.
+ */
+val LocalFocusManager = staticCompositionLocalOf<FocusManager>()
+
+/**
+ * The CompositionLocal to provide platform font loading methods.
  *
  * Use [androidx.compose.ui.res.fontResource] instead.
  * @suppress
  */
-val AmbientFontLoader = staticAmbientOf<Font.ResourceLoader>()
+@Deprecated(
+    "Renamed to LocalFontLoader",
+    replaceWith = ReplaceWith(
+        "LocalFontLoader",
+        "androidx.compose.ui.platform.LocalFontLoader"
+    )
+)
+val AmbientFontLoader get() = LocalFontLoader
 
 /**
- * The ambient to provide haptic feedback to the user.
+ * The CompositionLocal to provide platform font loading methods.
+ *
+ * Use [androidx.compose.ui.res.fontResource] instead.
+ * @suppress
  */
-val AmbientHapticFeedback = staticAmbientOf<HapticFeedback>()
+val LocalFontLoader = staticCompositionLocalOf<Font.ResourceLoader>()
 
 /**
- * The ambient to provide the layout direction.
+ * The CompositionLocal to provide haptic feedback to the user.
  */
-val AmbientLayoutDirection = staticAmbientOf<LayoutDirection>()
+@Deprecated(
+    "Renamed to LocalHapticFeedback",
+    replaceWith = ReplaceWith(
+        "LocalHapticFeedback",
+        "androidx.compose.ui.platform.LocalHapticFeedback"
+    )
+)
+val AmbientHapticFeedback get() = LocalHapticFeedback
 
 /**
- * The ambient to provide communication with platform text input service.
+ * The CompositionLocal to provide haptic feedback to the user.
  */
-val AmbientTextInputService = staticAmbientOf<TextInputService?>()
+val LocalHapticFeedback = staticCompositionLocalOf<HapticFeedback>()
 
 /**
- * The ambient to provide text-related toolbar.
+ * The CompositionLocal to provide the layout direction.
  */
-val AmbientTextToolbar = staticAmbientOf<TextToolbar>()
+@Deprecated(
+    "Renamed to LocalLayoutDirection",
+    replaceWith = ReplaceWith(
+        "LocalLayoutDirection",
+        "androidx.compose.ui.platform.LocalLayoutDirection"
+    )
+)
+val AmbientLayoutDirection get() = LocalLayoutDirection
 
 /**
- * The ambient to provide functionality related to URL, e.g. open URI.
+ * The CompositionLocal to provide the layout direction.
  */
-val AmbientUriHandler = staticAmbientOf<UriHandler>()
+val LocalLayoutDirection = staticCompositionLocalOf<LayoutDirection>()
 
 /**
- * The ambient that provides the ViewConfiguration.
+ * The CompositionLocal to provide communication with platform text input service.
  */
-val AmbientViewConfiguration = staticAmbientOf<ViewConfiguration>()
+@Deprecated(
+    "Renamed to LocalTextInputService",
+    replaceWith = ReplaceWith(
+        "LocalTextInputService",
+        "androidx.compose.ui.platform.LocalTextInputService"
+    )
+)
+val AmbientTextInputService get() = LocalTextInputService
 
 /**
- * The ambient that provides information about the window that hosts the current [Owner].
+ * The CompositionLocal to provide communication with platform text input service.
  */
-val AmbientWindowInfo = staticAmbientOf<WindowInfo>()
+val LocalTextInputService = staticCompositionLocalOf<TextInputService?>()
+
+/**
+ * The CompositionLocal to provide text-related toolbar.
+ */
+@Deprecated(
+    "Renamed to LocalTextToolbar",
+    replaceWith = ReplaceWith(
+        "LocalTextToolbar",
+        "androidx.compose.ui.platform.LocalTextToolbar"
+    )
+)
+val AmbientTextToolbar get() = LocalTextToolbar
+
+/**
+ * The CompositionLocal to provide text-related toolbar.
+ */
+val LocalTextToolbar = staticCompositionLocalOf<TextToolbar>()
+
+/**
+ * The CompositionLocal to provide functionality related to URL, e.g. open URI.
+ */
+@Deprecated(
+    "Renamed to LocalUriHandler",
+    replaceWith = ReplaceWith(
+        "LocalUriHandler",
+        "androidx.compose.ui.platform.LocalUriHandler"
+    )
+)
+val AmbientUriHandler get() = LocalUriHandler
+
+/**
+ * The CompositionLocal to provide functionality related to URL, e.g. open URI.
+ */
+val LocalUriHandler = staticCompositionLocalOf<UriHandler>()
+
+/**
+ * The CompositionLocal that provides the ViewConfiguration.
+ */
+@Deprecated(
+    "Renamed to LocalViewConfiguration",
+    replaceWith = ReplaceWith(
+        "LocalViewConfiguration",
+        "androidx.compose.ui.platform.LocalViewConfiguration"
+    )
+)
+val AmbientViewConfiguration get() = LocalViewConfiguration
+
+/**
+ * The CompositionLocal that provides the ViewConfiguration.
+ */
+val LocalViewConfiguration = staticCompositionLocalOf<ViewConfiguration>()
+
+/**
+ * The CompositionLocal that provides information about the window that hosts the current [Owner].
+ */
+@Deprecated(
+    "Renamed to LocalWindowInfo",
+    replaceWith = ReplaceWith(
+        "LocalWindowInfo",
+        "androidx.compose.ui.platform.LocalWindowInfo"
+    )
+)
+val AmbientWindowInfo get() = LocalWindowInfo
+
+/**
+ * The CompositionLocal that provides information about the window that hosts the current [Owner].
+ */
+val LocalWindowInfo = staticCompositionLocalOf<WindowInfo>()
 
 @ExperimentalComposeUiApi
 @Composable
-internal fun ProvideCommonAmbients(
+internal fun ProvideCommonCompositionLocals(
     owner: Owner,
     animationClock: AnimationClockObservable,
     uriHandler: UriHandler,
     content: @Composable () -> Unit
 ) {
     Providers(
-        AmbientAnimationClock provides animationClock,
-        AmbientAutofill provides owner.autofill,
-        AmbientAutofillTree provides owner.autofillTree,
-        AmbientClipboardManager provides owner.clipboardManager,
-        AmbientDensity provides owner.density,
-        AmbientFocusManager provides owner.focusManager,
-        AmbientFontLoader provides owner.fontLoader,
-        AmbientHapticFeedback provides owner.hapticFeedBack,
-        AmbientLayoutDirection providesDefault owner.layoutDirection,
-        AmbientTextInputService provides owner.textInputService,
-        AmbientTextToolbar provides owner.textToolbar,
-        AmbientUriHandler provides uriHandler,
-        AmbientViewConfiguration provides owner.viewConfiguration,
-        AmbientWindowInfo provides owner.windowInfo,
+        LocalAnimationClock provides animationClock,
+        LocalAutofill provides owner.autofill,
+        LocalAutofillTree provides owner.autofillTree,
+        LocalClipboardManager provides owner.clipboardManager,
+        LocalDensity provides owner.density,
+        LocalFocusManager provides owner.focusManager,
+        LocalFontLoader provides owner.fontLoader,
+        LocalHapticFeedback provides owner.hapticFeedBack,
+        LocalLayoutDirection provides owner.layoutDirection,
+        LocalTextInputService provides owner.textInputService,
+        LocalTextToolbar provides owner.textToolbar,
+        LocalUriHandler provides uriHandler,
+        LocalViewConfiguration provides owner.viewConfiguration,
+        LocalWindowInfo provides owner.windowInfo,
         content = content
     )
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectionMode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectionMode.kt
index 71e42c6..6e1e405 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectionMode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/InspectionMode.kt
@@ -16,9 +16,23 @@
 
 package androidx.compose.ui.platform
 
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 
 /**
- * Inspectable mode ambient. True if the composition is composed inside a Inspectable component.
+ * Inspectable mode CompositionLocal. True if the composition is composed inside a Inspectable
+ * component.
  */
-val InspectionMode = staticAmbientOf { false }
+@Deprecated(
+    "Renamed to LocalInspectionMode",
+    replaceWith = ReplaceWith(
+        "LocalInspectionMode",
+        "androidx.compose.ui.platform.LocalInspectionMode"
+    )
+)
+val InspectionMode get() = LocalInspectionMode
+
+/**
+ * Inspectable mode CompositionLocal. True if the composition is composed inside a Inspectable
+ * component.
+ */
+val LocalInspectionMode = staticCompositionLocalOf { false }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt
index 9de325c..88db96d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/WindowInfo.kt
@@ -43,7 +43,7 @@
 @OptIn(ExperimentalComposeApi::class)
 @Composable
 internal fun WindowFocusObserver(onWindowFocusChanged: (isWindowFocused: Boolean) -> Unit) {
-    val windowInfo = AmbientWindowInfo.current
+    val windowInfo = LocalWindowInfo.current
     val callback = rememberUpdatedState(onWindowFocusChanged)
     LaunchedEffect(windowInfo) {
         snapshotFlow { windowInfo.isWindowFocused }.collect { callback.value(it) }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
deleted file mode 100644
index 02576e9..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.selection
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.composed
-import androidx.compose.ui.gesture.dragGestureFilter
-import androidx.compose.ui.gesture.noConsumptionTapGestureFilter
-import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.AmbientClipboardManager
-import androidx.compose.ui.platform.AmbientHapticFeedback
-import androidx.compose.ui.platform.AmbientTextToolbar
-import androidx.compose.ui.text.InternalTextApi
-
-/**
- * Enables text selection for it's direct or indirection children.
- *
- * @sample androidx.compose.ui.samples.SelectionSample
- */
-@Suppress("DEPRECATION")
-@OptIn(InternalTextApi::class)
-@Composable
-fun SelectionContainer(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
-    var selection by remember { mutableStateOf<Selection?>(null) }
-    SelectionContainer(
-        modifier = modifier,
-        selection = selection,
-        onSelectionChange = {
-            selection = it
-        },
-        children = content
-    )
-}
-
-/**
- * Disables text selection for it's direct or indirection children. To use this, simply add this
- * to wrap one or more text composables.
- *
- * @sample androidx.compose.ui.samples.DisableSelectionSample
- */
-@Composable
-fun DisableSelection(content: @Composable () -> Unit) {
-    Providers(
-        AmbientSelectionRegistrar provides null,
-        content = content
-    )
-}
-
-/**
- * Selection Composable.
- *
- * The selection composable wraps composables and let them to be selectable. It paints the selection
- * area with start and end handles.
- *
- * @suppress
- */
-@Suppress("ComposableLambdaParameterNaming")
-@InternalTextApi // Used by foundation
-@Composable
-fun SelectionContainer(
-    /** A [Modifier] for SelectionContainer. */
-    modifier: Modifier = Modifier,
-    /** Current Selection status.*/
-    selection: Selection?,
-    /** A function containing customized behaviour when selection changes. */
-    onSelectionChange: (Selection?) -> Unit,
-    children: @Composable () -> Unit
-) {
-    val registrarImpl = remember { SelectionRegistrarImpl() }
-    val manager = remember { SelectionManager(registrarImpl) }
-
-    manager.hapticFeedBack = AmbientHapticFeedback.current
-    manager.clipboardManager = AmbientClipboardManager.current
-    manager.textToolbar = AmbientTextToolbar.current
-    manager.onSelectionChange = onSelectionChange
-    manager.selection = selection
-
-    val selectionContainerModifier = Modifier.composed {
-        val gestureModifiers = Modifier.noConsumptionTapGestureFilter { manager.onRelease() }
-
-        val positionedModifier = remember {
-            // Get the layout coordinates of the selection container. This is for hit test of
-            // cross-composable selection.
-            Modifier.onGloballyPositioned { manager.containerLayoutCoordinates = it }
-        }
-
-        if (selection != null) {
-            this.then(gestureModifiers).then(positionedModifier)
-        } else {
-            this.then(positionedModifier)
-        }
-    }
-
-    Providers(AmbientSelectionRegistrar provides registrarImpl) {
-        // Get the layout coordinates of the selection container. This is for hit test of
-        // cross-composable selection.
-        SimpleLayout(
-            modifier = modifier.then(selectionContainerModifier)
-        ) {
-            children()
-            manager.selection?.let {
-                for (isStartHandle in listOf(true, false)) {
-                    SelectionHandle(
-                        startHandlePosition = manager.startHandlePosition,
-                        endHandlePosition = manager.endHandlePosition,
-                        isStartHandle = isStartHandle,
-                        directions = Pair(it.start.direction, it.end.direction),
-                        handlesCrossed = it.handlesCrossed,
-                        modifier = Modifier.dragGestureFilter(
-                            manager.handleDragObserver(
-                                isStartHandle
-                            )
-                        ),
-                        handle = null
-                    )
-                }
-            }
-        }
-    }
-
-    DisposableEffect(manager) {
-        onDispose {
-            manager.selection = null
-            manager.hideSelectionToolbar()
-        }
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
index 9a9fbb5..fa2b88f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
@@ -267,6 +267,16 @@
     val PasteText = SemanticsPropertyKey<AccessibilityAction<() -> Boolean>>("PasteText")
 
     /**
+     * @see SemanticsPropertyReceiver.expand
+     */
+    val Expand = SemanticsPropertyKey<AccessibilityAction<() -> Boolean>>("Expand")
+
+    /**
+     * @see SemanticsPropertyReceiver.collapse
+     */
+    val Collapse = SemanticsPropertyKey<AccessibilityAction<() -> Boolean>>("Collapse")
+
+    /**
      * @see SemanticsPropertyReceiver.dismiss
      */
     val Dismiss = SemanticsPropertyKey<AccessibilityAction<() -> Boolean>>("Dismiss")
@@ -332,7 +342,7 @@
 }
 
 /**
- * Data class for standard accessibility action.
+ * Standard accessibility action.
  *
  * @param label The description of this action
  * @param action The function to invoke when this action is performed. The function should return
@@ -343,7 +353,7 @@
 data class AccessibilityAction<T : Function<Boolean>>(val label: CharSequence?, val action: T)
 
 /**
- * Data class for custom accessibility action.
+ * Custom accessibility action.
  *
  * @param label The description of this action
  * @param action The function to invoke when this action is performed. The function should have no
@@ -352,7 +362,7 @@
 data class CustomAccessibilityAction(val label: CharSequence, val action: () -> Boolean)
 
 /**
- * Data class for accessibility range information, to represent the status of a progress bar or
+ * Accessibility range information, to represent the status of a progress bar or
  * seekable progress bar.
  *
  * @param current current value in the range
@@ -378,15 +388,15 @@
 /**
  * The scroll state of one axis if this node is scrollable.
  *
- * @param value current scroll position value in pixels
+ * @param value current 0-based scroll position value (either in pixels, or lazy-item count)
  * @param maxValue maximum bound for [value], or [Float.POSITIVE_INFINITY] if still unknown
  * @param reverseScrolling for horizontal scroll, when this is `true`, 0 [value] will mean right,
  * when`false`, 0 [value] will mean left. For vertical scroll, when this is `true`, 0 [value] will
  * mean bottom, when `false`, 0 [value] will mean top
  */
-data class ScrollAxisRange(
-    val value: Float = 0f,
-    val maxValue: Float = 0f,
+class ScrollAxisRange(
+    val value: () -> Float,
+    val maxValue: () -> Float,
     val reverseScrolling: Boolean = false
 )
 
@@ -750,6 +760,32 @@
 }
 
 /**
+ * Action to expand an expandable node.
+ *
+ * @param label Optional label for this action.
+ * @param action Action to be performed when the [SemanticsActions.Expand] is called.
+ */
+fun SemanticsPropertyReceiver.expand(
+    label: String? = null,
+    action: () -> Boolean
+) {
+    this[SemanticsActions.Expand] = AccessibilityAction(label, action)
+}
+
+/**
+ * Action to collapse an expandable node.
+ *
+ * @param label Optional label for this action.
+ * @param action Action to be performed when the [SemanticsActions.Collapse] is called.
+ */
+fun SemanticsPropertyReceiver.collapse(
+    label: String? = null,
+    action: () -> Boolean
+) {
+    this[SemanticsActions.Collapse] = AccessibilityAction(label, action)
+}
+
+/**
  * Action to dismiss a dismissible node.
  *
  * @param label Optional label for this action.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt
index 25334fc..132c6f9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/window/Popup.kt
@@ -19,10 +19,10 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -116,11 +116,11 @@
 // TODO(b/142431825): This is a hack to work around Popups not using Semantics for test tags
 //  We should either remove it, or come up with an abstracted general solution that isn't specific
 //  to Popup
-internal val AmbientPopupTestTag = ambientOf { "DEFAULT_TEST_TAG" }
+internal val LocalPopupTestTag = compositionLocalOf { "DEFAULT_TEST_TAG" }
 
 @Composable
 internal fun PopupTestTag(tag: String, content: @Composable () -> Unit) {
-    Providers(AmbientPopupTestTag provides tag, content = content)
+    Providers(LocalPopupTestTag provides tag, content = content)
 }
 
 /**
@@ -180,7 +180,7 @@
      * @return The window relative position where the popup should be positioned.
      */
     fun calculatePosition(
-        anchorBounds: IntBounds,
+        anchorBounds: IntRect,
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
@@ -201,7 +201,7 @@
     val offset: IntOffset
 ) : PopupPositionProvider {
     override fun calculatePosition(
-        anchorBounds: IntBounds,
+        anchorBounds: IntRect,
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
@@ -247,7 +247,7 @@
     val offset: IntOffset
 ) : PopupPositionProvider {
     override fun calculatePosition(
-        anchorBounds: IntBounds,
+        anchorBounds: IntRect,
         windowSize: IntSize,
         layoutDirection: LayoutDirection,
         popupContentSize: IntSize
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.kt
index a7adf1f..58a9e7b 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.kt
@@ -18,7 +18,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionReference
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.ambientOf
+import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.ui.platform.Keyboard
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
@@ -34,7 +34,7 @@
 import javax.swing.SwingUtilities
 import javax.swing.WindowConstants
 
-val AppWindowAmbient = ambientOf<AppWindow?>()
+val AppWindowAmbient = compositionLocalOf<AppWindow?>()
 
 /**
  * Opens a window with the given content.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.kt
index 5427129..1ff3964 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.kt
@@ -156,7 +156,7 @@
 
     override val clipboardManager = DesktopClipboardManager()
 
-    internal val selectionManager = SelectionManagerTracker()
+    internal val selectionTracker = SelectionTracker()
 
     override val textToolbar = DesktopTextToolbar()
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.kt
index eb9c39a..8abbef1 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.kt
@@ -18,8 +18,8 @@
 import androidx.compose.animation.core.MonotonicFrameAnimationClock
 import androidx.compose.runtime.BroadcastFrameClock
 import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.staticAmbientOf
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.input.mouse.MouseScrollEvent
 import androidx.compose.ui.input.pointer.PointerId
@@ -36,7 +36,7 @@
 import java.awt.event.MouseEvent
 import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
 
-internal val DesktopOwnersAmbient = staticAmbientOf<DesktopOwners>()
+internal val DesktopOwnersAmbient = staticCompositionLocalOf<DesktopOwners>()
 
 @OptIn(ExperimentalCoroutinesApi::class)
 internal class DesktopOwners(
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.kt
index 8bd07f7..02326b9 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.kt
@@ -16,9 +16,9 @@
 
 package androidx.compose.ui.platform
 
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 
-val DesktopPlatformAmbient = staticAmbientOf(DesktopPlatform::Current)
+val DesktopPlatformAmbient = staticCompositionLocalOf(DesktopPlatform::Current)
 
 enum class DesktopPlatform {
     Linux,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.kt
index 6e505b29..98f1c41 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -16,14 +16,15 @@
 
 package androidx.compose.ui.platform
 
-import androidx.compose.runtime.staticAmbientOf
+import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.input.key.plus
+import androidx.compose.ui.text.AnnotatedString
 
-val SelectionManagerTrackerAmbient = staticAmbientOf<SelectionManagerTracker>()
+val SelectionTrackerAmbient = staticCompositionLocalOf<SelectionTracker>()
 
-class SelectionManagerTracker {
-    internal var recentManager: DesktopSelectionManager? = null
+class SelectionTracker {
+    var getSelectedText: (() -> AnnotatedString?)? = null
 }
 
 val copyToClipboardKeySet by lazy {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt
index da6a67c..cb99762 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.snapshots.SnapshotWriteObserver
+import androidx.compose.runtime.snapshots.ObserverHandle
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.SupervisorJob
@@ -40,7 +40,7 @@
 internal object GlobalSnapshotManager {
     private val started = AtomicBoolean(false)
     private var commitPending = false
-    private var removeWriteObserver: (() -> Unit)? = null
+    private var removeWriteObserver: ObserverHandle? = null
 
     private val scheduleScope = CoroutineScope(Dispatchers.Swing + SupervisorJob())
 
@@ -52,7 +52,7 @@
     }
 
     @OptIn(ExperimentalComposeApi::class)
-    private val globalWriteObserver: SnapshotWriteObserver = {
+    private val globalWriteObserver: (Any) -> Unit = {
         // Race, but we don't care too much if we end up with multiple calls scheduled.
         if (!commitPending) {
             commitPending = true
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.kt
index 9651619..1245392 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.platform
 
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.toRect
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.DesktopCanvas
@@ -37,8 +38,7 @@
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.toBounds
-import androidx.compose.ui.unit.toRect
+import androidx.compose.ui.unit.toSize
 import org.jetbrains.skija.Picture
 import org.jetbrains.skija.PictureRecorder
 import org.jetbrains.skija.Point3
@@ -166,7 +166,7 @@
     override fun drawLayer(canvas: Canvas) {
         outlineCache.density = getDensity()
         if (picture == null) {
-            val bounds = size.toBounds().toRect()
+            val bounds = size.toSize().toRect()
             val pictureCanvas = pictureRecorder.beginRecording(bounds.toSkijaRect())
             performDrawLayer(DesktopCanvas(pictureCanvas), bounds)
             picture = pictureRecorder.finishRecordingAsPicture()
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
index aa4e972..7db20a6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
@@ -40,15 +40,13 @@
     val composition = Composition(root, DesktopUiApplier(root), parent ?: container.recomposer)
     composition.setContent {
         ProvideDesktopAmbients(this) {
-            DesktopSelectionContainer(content)
+            content()
         }
     }
 
     keyboard?.setShortcut(copyToClipboardKeySet) {
-        selectionManager.recentManager?.let { selector ->
-            selector.getSelectedText()?.let {
-                clipboardManager.setText(it)
-            }
+        selectionTracker.getSelectedText?.invoke()?.let {
+            clipboardManager.setText(it)
         }
     }
 
@@ -59,9 +57,9 @@
 private fun ProvideDesktopAmbients(owner: DesktopOwner, content: @Composable () -> Unit) {
     Providers(
         DesktopOwnersAmbient provides owner.container,
-        SelectionManagerTrackerAmbient provides owner.selectionManager
+        SelectionTrackerAmbient provides owner.selectionTracker
     ) {
-        ProvideCommonAmbients(
+        ProvideCommonCompositionLocals(
             owner = owner,
             animationClock = owner.container.animationClock,
             uriHandler = DesktopUriHandler(),
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.kt
index a1d365d..a1a9faa 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.kt
@@ -19,7 +19,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.res.vector.parseVectorRoot
 import androidx.compose.ui.unit.Density
 import org.xml.sax.InputSource
@@ -86,7 +86,7 @@
  */
 @Composable
 fun vectorXmlResource(inputSource: InputSource): ImageVector {
-    val density = AmbientDensity.current
+    val density = LocalDensity.current
     return remember(inputSource, density) {
         loadVectorXmlResource(inputSource, density)
     }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.kt
index 9468ab0..050b724 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.platform.DesktopOwner
 import androidx.compose.ui.platform.DesktopOwnersAmbient
 import androidx.compose.ui.platform.setContent
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.round
 
@@ -55,14 +55,14 @@
     val owners = DesktopOwnersAmbient.current
     val density = AmbientDensity.current
 
-    val parentBounds = remember { mutableStateOf(IntBounds(0, 0, 0, 0)) }
+    val parentBounds = remember { mutableStateOf(IntRect.Zero) }
 
     // getting parent bounds
     Layout(
         content = {},
         modifier = Modifier.onGloballyPositioned { childCoordinates ->
             val coordinates = childCoordinates.parentCoordinates!!
-            parentBounds.value = IntBounds(
+            parentBounds.value = IntRect(
                 coordinates.localToWindow(Offset.Zero).round(),
                 coordinates.size
             )
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
index eb141b3..e3e1a48 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
@@ -21,8 +21,8 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.staticAmbientOf
-import androidx.compose.ui.platform.AmbientDensity
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.Density
@@ -37,7 +37,7 @@
 
     @Test
     fun `pass ambients to popup`() {
-        val ambient = staticAmbientOf<Int>()
+        val ambient = staticCompositionLocalOf<Int>()
 
         var actualAmbientValue = 0
 
@@ -81,9 +81,9 @@
         var densityInsidePopup = 0f
 
         rule.setContent {
-            Providers(AmbientDensity provides density) {
+            Providers(LocalDensity provides density) {
                 Popup {
-                    densityInsidePopup = AmbientDensity.current.density
+                    densityInsidePopup = LocalDensity.current.density
                 }
             }
         }
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterTest.kt
index 0913fdb6..2342e5a 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/gesture/RawDragGestureFilterTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("DEPRECATION")
+
 package androidx.compose.ui.gesture
 
 import androidx.compose.ui.geometry.Offset
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt
index 9c5b40d..d28fc336 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/window/PopupPositionProviderTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.window
 
 import androidx.compose.ui.Alignment
-import androidx.compose.ui.unit.IntBounds
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
@@ -294,7 +294,7 @@
     }
 
     private fun calculatePosition(alignment: Alignment, layoutDir: LayoutDirection): IntOffset {
-        val anchorBounds = IntBounds(50, 50, 150, 150)
+        val anchorBounds = IntRect(50, 50, 150, 150)
         val windowSize = IntSize(1000, 1000)
         val offset = IntOffset(10, 10)
         val popupSize = IntSize(40, 20)
@@ -312,7 +312,7 @@
         alignment: DropDownAlignment,
         layoutDir: LayoutDirection
     ): IntOffset {
-        val anchorBounds = IntBounds(50, 50, 150, 150)
+        val anchorBounds = IntRect(50, 50, 150, 150)
         val windowSize = IntSize(1000, 1000)
         val offset = IntOffset(10, 10)
         val popupSize = IntSize(40, 20)
diff --git a/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java b/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java
index 548f4ba..ede4488 100644
--- a/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java
+++ b/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java
@@ -23,6 +23,7 @@
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
@@ -58,7 +59,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
-import androidx.test.rule.ActivityTestRule;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -69,17 +69,18 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-@SuppressWarnings("unchecked")
+@SuppressWarnings({"unchecked", "deprecation"})
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class CoordinatorLayoutTest {
     @Rule
-    public final ActivityTestRule<CoordinatorLayoutActivity> mActivityTestRule;
+    public final androidx.test.rule.ActivityTestRule<CoordinatorLayoutActivity> mActivityTestRule;
 
     private Instrumentation mInstrumentation;
 
     public CoordinatorLayoutTest() {
-        mActivityTestRule = new ActivityTestRule<>(CoordinatorLayoutActivity.class);
+        mActivityTestRule = new androidx.test.rule.ActivityTestRule<>(
+                CoordinatorLayoutActivity.class);
     }
 
     @Before
@@ -397,11 +398,12 @@
         final View viewA = new View(col.getContext());
         final View viewB = new View(col.getContext());
         final CoordinatorLayout.LayoutParams lpB = col.generateDefaultLayoutParams();
-        final CoordinatorLayout.Behavior behavior =
+        final CoordinatorLayout.Behavior<View> behavior =
                 new CoordinatorLayoutUtils.DependentBehavior(viewA) {
                     @Override
-                    public void onDependentViewRemoved(
-                            CoordinatorLayout parent, View child, View dependency) {
+                    public void onDependentViewRemoved(CoordinatorLayout parent,
+                            @NonNull View child, @NonNull View dependency) {
+                        // Make sure this doesn't crash.
                         parent.getDependencies(child);
                     }
                 };
@@ -429,6 +431,88 @@
     }
 
     @Test
+    public void testGetDependencies() throws Throwable {
+        final Instrumentation instrumentation = getInstrumentation();
+        final CoordinatorLayout col = mActivityTestRule.getActivity().mCoordinatorLayout;
+
+        // Add two views, A & B, where B depends on A
+        final View viewA = new View(col.getContext());
+        final View viewB = new View(col.getContext());
+        final CoordinatorLayout.LayoutParams lpB = col.generateDefaultLayoutParams();
+        final CoordinatorLayout.Behavior<View> behavior =
+                new CoordinatorLayoutUtils.DependentBehavior(viewA);
+        lpB.setBehavior(behavior);
+
+        // Now add views
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                col.addView(viewA);
+                col.addView(viewB, lpB);
+            }
+        });
+
+        // Wait for a layout
+        instrumentation.waitForIdleSync();
+
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                List<View> depsA = col.getDependencies(viewA);
+                assertEquals("A has no dependencies", null, depsA);
+
+                List<View> depsB = col.getDependencies(viewB);
+                assertEquals("B depends only on A", 1, depsB.size());
+                assertThat("B depends only on A", depsB.contains(viewA));
+
+                assertThat("getDependencies returns a new list",
+                        depsB != col.getDependencies(viewB));
+            }
+        });
+    }
+
+    @Test
+    public void testGetDependents() throws Throwable {
+        final Instrumentation instrumentation = getInstrumentation();
+        final CoordinatorLayout col = mActivityTestRule.getActivity().mCoordinatorLayout;
+
+        // Add two views, A & B, where B depends on A
+        final View viewA = new View(col.getContext());
+        final View viewB = new View(col.getContext());
+        final CoordinatorLayout.LayoutParams lpB = col.generateDefaultLayoutParams();
+        final CoordinatorLayout.Behavior<View> behavior =
+                new CoordinatorLayoutUtils.DependentBehavior(viewA);
+        lpB.setBehavior(behavior);
+
+        // Now add views
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                col.addView(viewA);
+                col.addView(viewB, lpB);
+            }
+        });
+
+        // Wait for a layout
+        instrumentation.waitForIdleSync();
+
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                List<View> depsA = col.getDependents(viewA);
+                assertEquals("A is depended upon only by B", 1, depsA.size());
+                assertThat("A is depended upon only by B", depsA.contains(viewB));
+
+                List<View> depsB = col.getDependents(viewB);
+                assertEquals("B has no dependents", null, depsB);
+
+                assertThat("getDependents returns a new list",
+                        depsA != col.getDependents(viewA));
+            }
+        });
+    }
+
+    @Test
     public void testDodgeInsetBeforeLayout() throws Throwable {
         final CoordinatorLayout col = mActivityTestRule.getActivity().mCoordinatorLayout;
 
diff --git a/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java b/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
index 3a89eba..3745482 100644
--- a/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
+++ b/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
@@ -169,7 +169,6 @@
     private final DirectedAcyclicGraph<View> mChildDag = new DirectedAcyclicGraph<>();
 
     private final List<View> mTempList1 = new ArrayList<>();
-    private final List<View> mTempDependenciesList = new ArrayList<>();
     private Paint mScrimPaint;
 
     // Array to be mutated by calls to nested scrolling related methods of Behavior to satisfy the
@@ -1556,7 +1555,7 @@
      */
     @SuppressWarnings("unchecked")
     public void dispatchDependentViewsChanged(@NonNull View view) {
-        final List<View> dependents = mChildDag.getIncomingEdges(view);
+        final List<View> dependents = mChildDag.getIncomingEdgesInternal(view);
         if (dependents != null && !dependents.isEmpty()) {
             for (int i = 0; i < dependents.size(); i++) {
                 final View child = dependents.get(i);
@@ -1571,40 +1570,25 @@
     }
 
     /**
-     * Returns the list of views which the provided view depends on. Do not store this list as its
-     * contents may not be valid beyond the caller.
+     * Returns a new list containing the views on which the provided view depends.
      *
-     * @param child the view to find dependencies for.
-     *
-     * @return the list of views which {@code child} depends on.
+     * @param child the view to find dependencies for
+     * @return a new list of views on which {@code child} depends
      */
     @NonNull
     public List<View> getDependencies(@NonNull View child) {
-        final List<View> dependencies = mChildDag.getOutgoingEdges(child);
-        mTempDependenciesList.clear();
-        if (dependencies != null) {
-            mTempDependenciesList.addAll(dependencies);
-        }
-        return mTempDependenciesList;
+        return mChildDag.getOutgoingEdges(child);
     }
 
     /**
-     * Returns the list of views which depend on the provided view. Do not store this list as its
-     * contents may not be valid beyond the caller.
+     * Returns a new list of views which depend on the provided view.
      *
-     * @param child the view to find dependents of.
-     *
-     * @return the list of views which depend on {@code child}.
+     * @param child the view to find dependents of
+     * @return a new list of views which depend on {@code child}
      */
     @NonNull
-    @SuppressWarnings("unchecked")
     public List<View> getDependents(@NonNull View child) {
-        final List<View> edges = mChildDag.getIncomingEdges(child);
-        mTempDependenciesList.clear();
-        if (edges != null) {
-            mTempDependenciesList.addAll(edges);
-        }
-        return mTempDependenciesList;
+        return mChildDag.getIncomingEdges(child);
     }
 
     @VisibleForTesting
diff --git a/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/DirectedAcyclicGraph.java b/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/DirectedAcyclicGraph.java
index 97946d4..61fd8f5 100644
--- a/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/DirectedAcyclicGraph.java
+++ b/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/DirectedAcyclicGraph.java
@@ -91,10 +91,25 @@
     /**
      * Get any incoming edges from the given node.
      *
+     * @return a new list containing any incoming edges, or {@code null} if there are none
+     */
+    @Nullable
+    public List<T> getIncomingEdges(@NonNull T node) {
+        ArrayList<T> result = getIncomingEdgesInternal(node);
+        if (result == null) {
+            return null;
+        } else {
+            return new ArrayList<>(result);
+        }
+    }
+
+    /**
+     * Get any incoming edges from the given node.
+     *
      * @return a list containing any incoming edges, or null if there are none.
      */
     @Nullable
-    public List getIncomingEdges(@NonNull T node) {
+    ArrayList<T> getIncomingEdgesInternal(@NonNull T node) {
         return mGraph.get(node);
     }
 
@@ -102,7 +117,7 @@
      * Get any outgoing edges for the given node (i.e. nodes which have an incoming edge
      * from the given node).
      *
-     * @return a list containing any outgoing edges, or null if there are none.
+     * @return a new list containing any outgoing edges, or {@code null} if there are none
      */
     @Nullable
     public List<T> getOutgoingEdges(@NonNull T node) {
diff --git a/core/core-animation/api/api_lint.ignore b/core/core-animation/api/api_lint.ignore
index bfc4d83..f3eb632 100644
--- a/core/core-animation/api/api_lint.ignore
+++ b/core/core-animation/api/api_lint.ignore
@@ -9,5 +9,9 @@
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.core.animation.AnimatorSet.Builder.with(androidx.core.animation.Animator)
 
 
+GetterSetterNames: androidx.core.animation.Keyframe#setValue(T):
+    Symmetric method for `hasValue` must be named `setHasValue`; was `setValue`
+
+
 StaticFinalBuilder: androidx.core.animation.AnimatorSet.Builder:
     Builder must be final: androidx.core.animation.AnimatorSet.Builder
diff --git a/core/core-ktx/api/api_lint.ignore b/core/core-ktx/api/api_lint.ignore
index de50ebe..1e8b847 100644
--- a/core/core-ktx/api/api_lint.ignore
+++ b/core/core-ktx/api/api_lint.ignore
@@ -3,14 +3,6 @@
     Acronyms should not be capitalized in class names: was `SQLiteDatabaseKt`, should this be `SqLiteDatabaseKt`?
 
 
-ArrayReturn: androidx.core.content.res.TypedArrayKt#getTextArrayOrThrow(android.content.res.TypedArray, int):
-    Method should return Collection<CharSequence> (or subclass) instead of raw array; was `java.lang.CharSequence[]`
-ArrayReturn: androidx.core.text.SpannableStringBuilderKt#inSpans(android.text.SpannableStringBuilder, Object[], kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit>) parameter #1:
-    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
-ArrayReturn: androidx.core.text.SpannedStringKt#getSpans(android.text.Spanned, int, int):
-    Method should return Collection<T> (or subclass) instead of raw array; was `T[]`
-
-
 AutoBoxing: androidx.core.database.CursorKt#getDoubleOrNull(android.database.Cursor, int):
     Must avoid boxed primitives (`java.lang.Double`)
 AutoBoxing: androidx.core.database.CursorKt#getFloatOrNull(android.database.Cursor, int):
diff --git a/core/core/api/api_lint.ignore b/core/core/api/api_lint.ignore
index 3664037..b04878e 100644
--- a/core/core/api/api_lint.ignore
+++ b/core/core/api/api_lint.ignore
@@ -151,8 +151,6 @@
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.core.app.NotificationCompat.Builder.limitCharSequenceLength(CharSequence)
 BuilderSetStyle: androidx.core.app.ShareCompat.IntentBuilder#createChooserIntent():
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.core.app.ShareCompat.IntentBuilder.createChooserIntent()
-BuilderSetStyle: androidx.core.app.ShareCompat.IntentBuilder#from(android.app.Activity):
-    Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.core.app.ShareCompat.IntentBuilder.from(android.app.Activity)
 BuilderSetStyle: androidx.core.app.ShareCompat.IntentBuilder#startChooser():
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.core.app.ShareCompat.IntentBuilder.startChooser()
 BuilderSetStyle: androidx.core.app.TaskStackBuilder#create(android.content.Context):
@@ -207,6 +205,24 @@
     Getter should be on the built object, not the builder: method androidx.core.app.TaskStackBuilder.getPendingIntent(int,int,android.os.Bundle)
 
 
+GetterSetterNames: androidx.core.app.NotificationCompat.Action.WearableExtender#getHintDisplayActionInline():
+    Symmetric method for `setHintDisplayActionInline` must be named `isHintDisplayActionInline`; was `getHintDisplayActionInline`
+GetterSetterNames: androidx.core.app.NotificationCompat.Action.WearableExtender#getHintLaunchesActivity():
+    Symmetric method for `setHintLaunchesActivity` must be named `isHintLaunchesActivity`; was `getHintLaunchesActivity`
+GetterSetterNames: androidx.core.app.NotificationCompat.WearableExtender#getContentIntentAvailableOffline():
+    Symmetric method for `setContentIntentAvailableOffline` must be named `isContentIntentAvailableOffline`; was `getContentIntentAvailableOffline`
+GetterSetterNames: androidx.core.app.NotificationCompat.WearableExtender#getHintContentIntentLaunchesActivity():
+    Symmetric method for `setHintContentIntentLaunchesActivity` must be named `isHintContentIntentLaunchesActivity`; was `getHintContentIntentLaunchesActivity`
+GetterSetterNames: androidx.core.app.NotificationCompat.WearableExtender#getStartScrollBottom():
+    Symmetric method for `setStartScrollBottom` must be named `isStartScrollBottom`; was `getStartScrollBottom`
+GetterSetterNames: androidx.core.graphics.drawable.RoundedBitmapDrawable#setAntiAlias(boolean):
+    Symmetric method for `hasAntiAlias` must be named `setHasAntiAlias`; was `setAntiAlias`
+GetterSetterNames: androidx.core.graphics.drawable.RoundedBitmapDrawable#setMipMap(boolean):
+    Symmetric method for `hasMipMap` must be named `setHasMipMap`; was `setMipMap`
+GetterSetterNames: androidx.core.view.GestureDetectorCompat#setIsLongpressEnabled(boolean):
+    Symmetric method for `isLongpressEnabled` must be named `setLongpressEnabled`; was `setIsLongpressEnabled`
+
+
 KotlinOperator: androidx.core.os.LocaleListCompat#get(int):
     Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object)
 
@@ -237,8 +253,6 @@
     androidx.core.app.NotificationChannelCompat does not declare a `isShowBadge()` method matching method androidx.core.app.NotificationChannelCompat.Builder.setShowBadge(boolean)
 MissingGetterMatchingBuilder: androidx.core.app.NotificationChannelCompat.Builder#setVibrationEnabled(boolean):
     androidx.core.app.NotificationChannelCompat does not declare a `isVibrationEnabled()` method matching method androidx.core.app.NotificationChannelCompat.Builder.setVibrationEnabled(boolean)
-MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Action.Builder#addExtras(android.os.Bundle):
-    androidx.core.app.NotificationCompat.Action does not declare a `getExtrass()` method matching method androidx.core.app.NotificationCompat.Action.Builder.addExtras(android.os.Bundle)
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Action.Builder#setAllowGeneratedReplies(boolean):
     androidx.core.app.NotificationCompat.Action does not declare a `isAllowGeneratedReplies()` method matching method androidx.core.app.NotificationCompat.Action.Builder.setAllowGeneratedReplies(boolean)
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Action.Builder#setShowsUserInterface(boolean):
@@ -252,7 +266,7 @@
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Builder#addAction(int, CharSequence, android.app.PendingIntent):
     android.app.Notification does not declare a `getActions()` method matching method androidx.core.app.NotificationCompat.Builder.addAction(int,CharSequence,android.app.PendingIntent)
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Builder#addExtras(android.os.Bundle):
-    android.app.Notification does not declare a `getExtrass()` method matching method androidx.core.app.NotificationCompat.Builder.addExtras(android.os.Bundle)
+    android.app.Notification does not declare a getter method matching method androidx.core.app.NotificationCompat.Builder.addExtras(android.os.Bundle) (expected one of: [getExtras(), getExtrases()])
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(androidx.core.app.NotificationCompat.Action):
     android.app.Notification does not declare a `getInvisibleActions()` method matching method androidx.core.app.NotificationCompat.Builder.addInvisibleAction(androidx.core.app.NotificationCompat.Action)
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.Builder#addInvisibleAction(int, CharSequence, android.app.PendingIntent):
@@ -341,8 +355,6 @@
     android.app.Notification does not declare a `getWhen()` method matching method androidx.core.app.NotificationCompat.Builder.setWhen(long)
 MissingGetterMatchingBuilder: androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReplyAction(android.app.PendingIntent, androidx.core.app.RemoteInput):
     androidx.core.app.NotificationCompat.CarExtender.UnreadConversation does not declare a `getReplyAction()` method matching method androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder.setReplyAction(android.app.PendingIntent,androidx.core.app.RemoteInput)
-MissingGetterMatchingBuilder: androidx.core.app.RemoteInput.Builder#addExtras(android.os.Bundle):
-    androidx.core.app.RemoteInput does not declare a `getExtrass()` method matching method androidx.core.app.RemoteInput.Builder.addExtras(android.os.Bundle)
 MissingGetterMatchingBuilder: androidx.core.app.RemoteInput.Builder#setAllowDataType(String, boolean):
     androidx.core.app.RemoteInput does not declare a `getAllowDataType()` method matching method androidx.core.app.RemoteInput.Builder.setAllowDataType(String,boolean)
 MissingGetterMatchingBuilder: androidx.core.app.RemoteInput.Builder#setAllowFreeFormInput(boolean):
diff --git a/datastore/datastore-core/src/test/java/androidx/datastore/core/SingleProcessDataStoreStressTest.kt b/datastore/datastore-core/src/test/java/androidx/datastore/core/SingleProcessDataStoreStressTest.kt
index 3e17829..2e6a069 100644
--- a/datastore/datastore-core/src/test/java/androidx/datastore/core/SingleProcessDataStoreStressTest.kt
+++ b/datastore/datastore-core/src/test/java/androidx/datastore/core/SingleProcessDataStoreStressTest.kt
@@ -29,6 +29,7 @@
 import kotlinx.coroutines.flow.takeWhile
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withTimeout
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
@@ -55,6 +56,7 @@
     val timeout = Timeout(4, TimeUnit.MINUTES)
 
     @Test
+    @Ignore // TODO(b/178641154): Replace with tests that do not time out.
     fun testManyConcurrentReadsAndWrites() = runBlocking<Unit> {
         val myScope = CoroutineScope(
             Job() + Executors.newFixedThreadPool(4).asCoroutineDispatcher()
@@ -102,6 +104,7 @@
     }
 
     @Test
+    @Ignore // TODO(b/178641154): Replace with tests that do not time out.
     fun testManyConcurrentReadsAndWrites_withIntermittentWriteFailures() = runBlocking<Unit> {
         val myScope = CoroutineScope(
             Job() + Executors.newFixedThreadPool(4).asCoroutineDispatcher()
diff --git a/datastore/datastore-preferences-core/api/api_lint.ignore b/datastore/datastore-preferences-core/api/api_lint.ignore
deleted file mode 100644
index c359d4e..0000000
--- a/datastore/datastore-preferences-core/api/api_lint.ignore
+++ /dev/null
@@ -1,9 +0,0 @@
-// Baseline format: 1.0
-MissingJvmstatic: androidx.datastore.preferences.core.PreferenceDataStoreFactory#create(kotlin.jvm.functions.Function0<? extends java.io.File>, androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>, java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>, kotlinx.coroutines.CoroutineScope):
-    A Kotlin method with default parameter values should be annotated with @JvmOverloads for better Java interoperability; see https://android.github.io/kotlin-guides/interop.html#function-overloads-for-defaults
-
-
-MissingNullability: androidx.datastore.preferences.core.PreferencesKt#preferencesKey(String):
-    Missing nullability on method `preferencesKey` return
-MissingNullability: androidx.datastore.preferences.core.PreferencesKt#preferencesSetKey(String):
-    Missing nullability on method `preferencesSetKey` return
diff --git a/datastore/datastore-preferences-rxjava2/src/androidTest/AndroidManifest.xml b/datastore/datastore-preferences-rxjava2/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..d9d7d76
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava2/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.datastore.preferences.rxjava2">
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
+</manifest>
diff --git a/datastore/datastore-preferences-rxjava3/src/androidTest/AndroidManifest.xml b/datastore/datastore-preferences-rxjava3/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..254f4b9
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava3/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.datastore.preferences.rxjava3">
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
+</manifest>
diff --git a/datastore/datastore-preferences/src/androidTest/AndroidManifest.xml b/datastore/datastore-preferences/src/androidTest/AndroidManifest.xml
index 6fcab59..cba85e7 100644
--- a/datastore/datastore-preferences/src/androidTest/AndroidManifest.xml
+++ b/datastore/datastore-preferences/src/androidTest/AndroidManifest.xml
@@ -16,5 +16,6 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.datastore.preferences">
-
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
 </manifest>
diff --git a/datastore/datastore-rxjava2/src/androidTest/AndroidManifest.xml b/datastore/datastore-rxjava2/src/androidTest/AndroidManifest.xml
index bf9d5c2..a3f719a 100644
--- a/datastore/datastore-rxjava2/src/androidTest/AndroidManifest.xml
+++ b/datastore/datastore-rxjava2/src/androidTest/AndroidManifest.xml
@@ -16,5 +16,6 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.datastore.rxjava2">
-
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
 </manifest>
diff --git a/datastore/datastore-rxjava3/src/androidTest/AndroidManifest.xml b/datastore/datastore-rxjava3/src/androidTest/AndroidManifest.xml
index 3369992..6142afe 100644
--- a/datastore/datastore-rxjava3/src/androidTest/AndroidManifest.xml
+++ b/datastore/datastore-rxjava3/src/androidTest/AndroidManifest.xml
@@ -16,5 +16,6 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.datastore.rxjava3">
-
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
 </manifest>
diff --git a/datastore/datastore/src/androidTest/AndroidManifest.xml b/datastore/datastore/src/androidTest/AndroidManifest.xml
index 5e89612..5929169 100644
--- a/datastore/datastore/src/androidTest/AndroidManifest.xml
+++ b/datastore/datastore/src/androidTest/AndroidManifest.xml
@@ -16,5 +16,6 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.datastore.datastore">
-
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
 </manifest>
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index ee13e90..7fe5781 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -882,6 +882,7 @@
 \$SUPPORT/.*/build\.gradle: Ignore: Unknown issue id "ComposableNaming" \[UnknownIssueId\]
 \$SUPPORT/.*/build\.gradle: Ignore: Unknown issue id "ComposableLambdaParameterNaming" \[UnknownIssueId\]
 \$SUPPORT/.*/build\.gradle: Ignore: Unknown issue id "ComposableLambdaParameterPosition" \[UnknownIssueId\]
+\$SUPPORT/.*/build\.gradle: Ignore: Unknown issue id "CompositionLocalNaming" \[UnknownIssueId\]
 Explanation for issues of type "UnknownIssueId":
 Lint will report this issue if it is configured with an issue id it does
 not recognize in for example Gradle files or lint\.xml configuration files\.
diff --git a/development/importMaven/build.gradle.kts b/development/importMaven/build.gradle.kts
index 332f997..c529778 100644
--- a/development/importMaven/build.gradle.kts
+++ b/development/importMaven/build.gradle.kts
@@ -102,6 +102,16 @@
         }
     }
 
+    val allowJetbrainsDev: String? = findProperty("allowJetbrainsDev") as String?
+    if (allowJetbrainsDev != null) {
+        maven {
+            url = uri("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev")
+            metadataSources {
+                artifact()
+            }
+        }
+    }
+
     ivy {
         setUrl("https://download.jetbrains.com/kotlin/native/builds/releases")
         patternLayout {
diff --git a/development/importMaven/import_maven_artifacts.py b/development/importMaven/import_maven_artifacts.py
index 8242926..10875fa 100755
--- a/development/importMaven/import_maven_artifacts.py
+++ b/development/importMaven/import_maven_artifacts.py
@@ -33,6 +33,11 @@
   E.g. https://dl.bintray.com/kotlin/kotlin-dev/ and https://dl.bintray.com/kotlin/kotlinx/
 '''
 
+ALLOW_JETBRAINS_DEV_HELP = '''
+  Whether or not to allow artifacts to be fetched from Jetbrains' dev repository
+  E.g. https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev
+'''
+
 if sys.version_info[0] < 3: raise Exception("Python 2 is not supported by this script. If your system python calls python 2 after python 2 end-of-life on Jan 1 2020, you should probably change it.")
 
 def main():
@@ -48,6 +53,8 @@
                         required=False, dest='metalava_build_id')
     parser.add_argument('-ab', '--allow-bintray', help=ALLOW_BINTRAY_HELP,
                         required=False, action='store_true')
+    parser.add_argument('-ajd', '--allow-jetbrains-dev', help=ALLOW_JETBRAINS_DEV_HELP,
+                        required=False, action='store_true')
     parse_result = parser.parse_args()
     artifact_name = parse_result.name
     if ("kotlin-native-linux" in artifact_name): artifact_name = fix_kotlin_native(artifact_name)
@@ -60,6 +67,8 @@
       command = command + ' -PmetalavaBuildId=%s' % (metalava_build_id)
     if (parse_result.allow_bintray):
       command = command + ' -PallowBintray'
+    if (parse_result.allow_jetbrains_dev):
+      command = command + ' -PallowJetbrainsDev'
 
     process = subprocess.Popen(command,
                                shell=True,
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 04bd86b..2022865 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -102,9 +102,9 @@
     docs("androidx.enterprise:enterprise-feedback:1.1.0")
     docs("androidx.enterprise:enterprise-feedback-testing:1.1.0")
     docs("androidx.exifinterface:exifinterface:1.3.2")
-    docs("androidx.fragment:fragment:1.3.0-rc02")
-    docs("androidx.fragment:fragment-ktx:1.3.0-rc02")
-    docs("androidx.fragment:fragment-testing:1.3.0-rc02")
+    docs("androidx.fragment:fragment:1.3.0")
+    docs("androidx.fragment:fragment-ktx:1.3.0")
+    docs("androidx.fragment:fragment-testing:1.3.0")
     docs("androidx.gridlayout:gridlayout:1.0.0")
     docs("androidx.heifwriter:heifwriter:1.1.0-alpha01")
     docs("androidx.hilt:hilt-common:1.0.0-alpha03")
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index c456c32..9f96bb1 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -26,6 +26,7 @@
     docs(project(":benchmark:benchmark-common"))
     docs(project(":benchmark:benchmark-junit4"))
     docs(project(":benchmark:benchmark-macro"))
+    docs(project(":benchmark:benchmark-macro-junit4"))
     docs(project(":biometric:biometric"))
     docs(project(":biometric:biometric-ktx"))
     samples(project(":biometric:biometric-ktx-samples"))
diff --git a/fragment/fragment/api/api_lint.ignore b/fragment/fragment/api/api_lint.ignore
index 0268087..b67ac72 100644
--- a/fragment/fragment/api/api_lint.ignore
+++ b/fragment/fragment/api/api_lint.ignore
@@ -15,6 +15,14 @@
     FragmentActivity should not extend `Activity`. Activity subclasses are impossible to compose. Expose a composable API instead.
 
 
+GetterSetterNames: androidx.fragment.app.DialogFragment#getShowsDialog():
+    Symmetric method for `setShowsDialog` must be named `isShowsDialog`; was `getShowsDialog`
+GetterSetterNames: androidx.fragment.app.Fragment#getAllowEnterTransitionOverlap():
+    Symmetric method for `setAllowEnterTransitionOverlap` must be named `isAllowEnterTransitionOverlap`; was `getAllowEnterTransitionOverlap`
+GetterSetterNames: androidx.fragment.app.Fragment#getAllowReturnTransitionOverlap():
+    Symmetric method for `setAllowReturnTransitionOverlap` must be named `isAllowReturnTransitionOverlap`; was `getAllowReturnTransitionOverlap`
+
+
 MissingNullability: androidx.fragment.app.Fragment#startActivity(android.content.Intent) parameter #0:
     Missing nullability on parameter `intent` in method `startActivity`
 MissingNullability: androidx.fragment.app.Fragment#startActivity(android.content.Intent, android.os.Bundle) parameter #0:
diff --git a/gridlayout/gridlayout/api/api_lint.ignore b/gridlayout/gridlayout/api/api_lint.ignore
index df7a145..199038a 100644
--- a/gridlayout/gridlayout/api/api_lint.ignore
+++ b/gridlayout/gridlayout/api/api_lint.ignore
@@ -1,4 +1,8 @@
 // Baseline format: 1.0
+GetterSetterNames: androidx.gridlayout.widget.GridLayout#getUseDefaultMargins():
+    Symmetric method for `setUseDefaultMargins` must be named `isUseDefaultMargins`; was `getUseDefaultMargins`
+
+
 MissingNullability: androidx.gridlayout.widget.GridLayout#BASELINE:
     Missing nullability on field `BASELINE` in class `class androidx.gridlayout.widget.GridLayout`
 MissingNullability: androidx.gridlayout.widget.GridLayout#BOTTOM:
diff --git a/leanback/leanback/api/api_lint.ignore b/leanback/leanback/api/api_lint.ignore
index 129ef65..3cb37ff 100644
--- a/leanback/leanback/api/api_lint.ignore
+++ b/leanback/leanback/api/api_lint.ignore
@@ -113,10 +113,22 @@
     Registration methods should have overload that accepts delivery Executor: `setSurfaceHolderCallback`
 
 
-FractionFloat: androidx.leanback.widget.Parallax.FloatProperty#atFraction(float):
-    Fractions must use floats, was `androidx.leanback.widget.Parallax.PropertyMarkerValue` in `atFraction`
-FractionFloat: androidx.leanback.widget.Parallax.IntProperty#atFraction(float):
-    Fractions must use floats, was `androidx.leanback.widget.Parallax.PropertyMarkerValue` in `atFraction`
+GetterSetterNames: androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper#getAutoStartSharedElementTransition():
+    Symmetric method for `setAutoStartSharedElementTransition` must be named `isAutoStartSharedElementTransition`; was `getAutoStartSharedElementTransition`
+GetterSetterNames: androidx.leanback.widget.GuidedAction#setSubActions(java.util.List<androidx.leanback.widget.GuidedAction>):
+    Symmetric method for `hasSubActions` must be named `setHasSubActions`; was `setSubActions`
+GetterSetterNames: androidx.leanback.widget.HorizontalGridView#getFadingLeftEdge():
+    Symmetric method for `setFadingLeftEdge` must be named `isFadingLeftEdge`; was `getFadingLeftEdge`
+GetterSetterNames: androidx.leanback.widget.HorizontalGridView#getFadingRightEdge():
+    Symmetric method for `setFadingRightEdge` must be named `isFadingRightEdge`; was `getFadingRightEdge`
+GetterSetterNames: androidx.leanback.widget.ListRowPresenter#getShadowEnabled():
+    Symmetric method for `setShadowEnabled` must be named `isShadowEnabled`; was `getShadowEnabled`
+GetterSetterNames: androidx.leanback.widget.RowPresenter#getSelectEffectEnabled():
+    Symmetric method for `setSelectEffectEnabled` must be named `isSelectEffectEnabled`; was `getSelectEffectEnabled`
+GetterSetterNames: androidx.leanback.widget.VerticalGridPresenter#getKeepChildForeground():
+    Symmetric method for `setKeepChildForeground` must be named `isKeepChildForeground`; was `getKeepChildForeground`
+GetterSetterNames: androidx.leanback.widget.VerticalGridPresenter#getShadowEnabled():
+    Symmetric method for `setShadowEnabled` must be named `isShadowEnabled`; was `getShadowEnabled`
 
 
 InternalField: androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder#mParentPresenter:
diff --git a/leanback/leanback/src/main/res/values-mn/strings.xml b/leanback/leanback/src/main/res/values-mn/strings.xml
index 397f231..7ae0eda 100644
--- a/leanback/leanback/src/main/res/values-mn/strings.xml
+++ b/leanback/leanback/src/main/res/values-mn/strings.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"Навигацийн цэс"</string>
+    <string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"Навигацын цэс"</string>
     <string name="orb_search_action" msgid="1301877238242752863">"Хайлтын үйлдэл"</string>
     <string name="lb_search_bar_hint" msgid="5700349211583074131">"Хайх"</string>
     <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"Хайхын тулд ярина уу"</string>
diff --git a/lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java b/lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
index 1dc35ae..6b663d8 100644
--- a/lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
+++ b/lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
@@ -16,9 +16,11 @@
 
 package androidx.lifecycle;
 
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -27,6 +29,9 @@
 @RunWith(JUnit4.class)
 public class ViewModelProvidersTest {
 
+    @Rule
+    public InstantTaskExecutorRule rule = new InstantTaskExecutorRule();
+
     @Test(expected = IllegalStateException.class)
     public void testNotAttachedActivity() {
         // This is similar to call ViewModelProviders.of in Activity's constructor
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index d59f8fd..0fd91d7 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -35,11 +35,11 @@
 dependencies {
     api("androidx.annotation:annotation:1.0.0")
     api("androidx.savedstate:savedstate:1.0.0")
-    api(project(":lifecycle:lifecycle-livedata-core"))
-    api(project(":lifecycle:lifecycle-viewmodel"))
+    api(projectOrArtifact(":lifecycle:lifecycle-livedata-core"))
+    api(projectOrArtifact(":lifecycle:lifecycle-viewmodel"))
 
-    androidTestImplementation project(":lifecycle:lifecycle-runtime")
-    androidTestImplementation project(":lifecycle:lifecycle-livedata-core")
+    androidTestImplementation projectOrArtifact(":lifecycle:lifecycle-runtime")
+    androidTestImplementation projectOrArtifact(":lifecycle:lifecycle-livedata-core")
     androidTestImplementation projectOrArtifact(":fragment:fragment"), {
         exclude group: 'androidx.lifecycle', module: 'lifecycle-runtime'
         exclude group: 'androidx.lifecycle', module: 'lifecycle-livedata-core'
@@ -47,6 +47,8 @@
         exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel'
     }
     androidTestImplementation project(":internal-testutils-runtime"), {
+        exclude group: 'androidx.lifecycle', module: 'lifecycle-runtime'
+        exclude group: 'androidx.lifecycle', module: 'lifecycle-livedata-core'
         exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-savedstate'
         exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel'
     }
diff --git a/media2/media2-session/api/api_lint.ignore b/media2/media2-session/api/api_lint.ignore
index 63f403b..1f9b7db 100644
--- a/media2/media2-session/api/api_lint.ignore
+++ b/media2/media2-session/api/api_lint.ignore
@@ -38,7 +38,7 @@
 MissingGetterMatchingBuilder: androidx.media2.session.MediaSession.Builder#setSessionCallback(java.util.concurrent.Executor, androidx.media2.session.MediaSession.SessionCallback):
     androidx.media2.session.MediaSession does not declare a `getSessionCallback()` method matching method androidx.media2.session.MediaSession.Builder.setSessionCallback(java.util.concurrent.Executor,androidx.media2.session.MediaSession.SessionCallback)
 MissingGetterMatchingBuilder: androidx.media2.session.SessionCommandGroup.Builder#addAllPredefinedCommands(int):
-    androidx.media2.session.SessionCommandGroup does not declare a `getAllPredefinedCommandss()` method matching method androidx.media2.session.SessionCommandGroup.Builder.addAllPredefinedCommands(int)
+    androidx.media2.session.SessionCommandGroup does not declare a getter method matching method androidx.media2.session.SessionCommandGroup.Builder.addAllPredefinedCommands(int) (expected one of: [getAllPredefinedCommands(), getAllPredefinedCommandses()])
 
 
 MissingNullability: androidx.media2.session.MediaLibraryService#onBind(android.content.Intent):
diff --git a/media2/media2-session/src/main/res/values-af/strings.xml b/media2/media2-session/src/main/res/values-af/strings.xml
deleted file mode 100644
index 5d55fb4..0000000
--- a/media2/media2-session/src/main/res/values-af/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Speel tans"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Speel"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Onderbreek"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Slaan oor na vorige item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Slaan oor na volgende item"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-am/strings.xml b/media2/media2-session/src/main/res/values-am/strings.xml
deleted file mode 100644
index d3b28b7..0000000
--- a/media2/media2-session/src/main/res/values-am/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"አሁን በመጫወት ላይ"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"አጫውት"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ባለበት አቁም"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ወደ ቀዳሚው ንጥል ዝለል"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ወደ ቀጣዩ ንጥል ዝለል"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ar/strings.xml b/media2/media2-session/src/main/res/values-ar/strings.xml
deleted file mode 100644
index 548305a07..0000000
--- a/media2/media2-session/src/main/res/values-ar/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"التشغيل الآن"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"تشغيل"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"إيقاف مؤقت"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"التخطي إلى العنصر السابق"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"التخطي إلى العنصر التالي"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-as/strings.xml b/media2/media2-session/src/main/res/values-as/strings.xml
deleted file mode 100644
index eb241d0..0000000
--- a/media2/media2-session/src/main/res/values-as/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"এতিয়া প্লে’ হৈ আছে"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"প্লে\'"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"পজ"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"পূৰ্বৱৰ্তী বস্তুটোলৈ যাওক"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"পৰৱৰ্তী বস্তুটোলৈ যাওক"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-az/strings.xml b/media2/media2-session/src/main/res/values-az/strings.xml
deleted file mode 100644
index fc43bef..0000000
--- a/media2/media2-session/src/main/res/values-az/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"İndi oxudulur"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Oxudun"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauza"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Əvvəlki elementə keçin"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Növbəti elementə keçin"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-b+sr+Latn/strings.xml b/media2/media2-session/src/main/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index 42eb6b7..0000000
--- a/media2/media2-session/src/main/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Trenutno svira"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Pustite"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauzirajte"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Pređite na prethodnu stavku"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Pređite na sledeću stavku"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-be/strings.xml b/media2/media2-session/src/main/res/values-be/strings.xml
deleted file mode 100644
index 976ad12..0000000
--- a/media2/media2-session/src/main/res/values-be/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Зараз іграе"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Прайграць"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Прыпыніць"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Перайсці да папярэдняга элемента"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Перайсці да наступнага элемента"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-bg/strings.xml b/media2/media2-session/src/main/res/values-bg/strings.xml
deleted file mode 100644
index 01758d8..0000000
--- a/media2/media2-session/src/main/res/values-bg/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Сега слушате"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Пускане"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Поставяне на пауза"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Преминаване към предишния елемент"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Преминаване към следващия елемент"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-bn/strings.xml b/media2/media2-session/src/main/res/values-bn/strings.xml
deleted file mode 100644
index 2224b12..0000000
--- a/media2/media2-session/src/main/res/values-bn/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"এখন চলছে"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"চালান"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"পজ করুন"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"এটিকে এড়িয়ে পূর্ববর্তী আইটেমে যান"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"এটিকে এড়িয়ে পরবর্তী আইটেমে যান"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-bs/strings.xml b/media2/media2-session/src/main/res/values-bs/strings.xml
deleted file mode 100644
index e7c46a5..0000000
--- a/media2/media2-session/src/main/res/values-bs/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Trenutno se reproducira"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproduciraj"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauza"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Preskoči na prethodnu stavku"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Preskoči na sljedeću stavku"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ca/strings.xml b/media2/media2-session/src/main/res/values-ca/strings.xml
deleted file mode 100644
index 7ed65dc..0000000
--- a/media2/media2-session/src/main/res/values-ca/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"S\'està reproduint"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reprodueix"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Posa en pausa"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Ves a l\'element anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Ves a l\'element següent"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-cs/strings.xml b/media2/media2-session/src/main/res/values-cs/strings.xml
deleted file mode 100644
index fc86423..0000000
--- a/media2/media2-session/src/main/res/values-cs/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Právě hraje"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Přehrát"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pozastavit"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Přejít na předchozí položku"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Přejít na další položku"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-da/strings.xml b/media2/media2-session/src/main/res/values-da/strings.xml
deleted file mode 100644
index aa2b549..0000000
--- a/media2/media2-session/src/main/res/values-da/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Afspiller nu"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Afspil"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Sæt på pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Gå til forrige element"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Gå til næste element"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-de/strings.xml b/media2/media2-session/src/main/res/values-de/strings.xml
deleted file mode 100644
index a8b55ac..0000000
--- a/media2/media2-session/src/main/res/values-de/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Läuft gerade"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Wiedergeben"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Zum vorherigen Element springen"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Zum nächsten Element springen"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-el/strings.xml b/media2/media2-session/src/main/res/values-el/strings.xml
deleted file mode 100644
index 669c0ba..0000000
--- a/media2/media2-session/src/main/res/values-el/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Ακούγεται τώρα"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Αναπαραγωγή"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Παύση"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Μετάβαση στο προηγούμενο στοιχείο"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Μετάβαση στο επόμενο στοιχείο"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-en-rAU/strings.xml b/media2/media2-session/src/main/res/values-en-rAU/strings.xml
index b026306..7b0df40 100644
--- a/media2/media2-session/src/main/res/values-en-rAU/strings.xml
+++ b/media2/media2-session/src/main/res/values-en-rAU/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Now playing"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Skip to previous item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Skip to next item"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Now playing"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Play"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Pause"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Skip to previous item"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Skip to next item"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-en-rCA/strings.xml b/media2/media2-session/src/main/res/values-en-rCA/strings.xml
index b026306..7b0df40 100644
--- a/media2/media2-session/src/main/res/values-en-rCA/strings.xml
+++ b/media2/media2-session/src/main/res/values-en-rCA/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Now playing"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Skip to previous item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Skip to next item"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Now playing"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Play"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Pause"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Skip to previous item"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Skip to next item"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-en-rGB/strings.xml b/media2/media2-session/src/main/res/values-en-rGB/strings.xml
index b026306..7b0df40 100644
--- a/media2/media2-session/src/main/res/values-en-rGB/strings.xml
+++ b/media2/media2-session/src/main/res/values-en-rGB/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Now playing"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Skip to previous item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Skip to next item"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Now playing"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Play"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Pause"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Skip to previous item"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Skip to next item"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-en-rIN/strings.xml b/media2/media2-session/src/main/res/values-en-rIN/strings.xml
index b026306..7b0df40 100644
--- a/media2/media2-session/src/main/res/values-en-rIN/strings.xml
+++ b/media2/media2-session/src/main/res/values-en-rIN/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Now playing"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Skip to previous item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Skip to next item"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Now playing"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Play"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Pause"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Skip to previous item"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Skip to next item"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-en-rXC/strings.xml b/media2/media2-session/src/main/res/values-en-rXC/strings.xml
index f8f5596..1313932 100644
--- a/media2/media2-session/src/main/res/values-en-rXC/strings.xml
+++ b/media2/media2-session/src/main/res/values-en-rXC/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎Now playing‎‏‎‎‏‎"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎Play‎‏‎‎‏‎"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‎Pause‎‏‎‎‏‎"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎Skip to previous item‎‏‎‎‏‎"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎Skip to next item‎‏‎‎‏‎"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎Now playing‎‏‎‎‏‎"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎Play‎‏‎‎‏‎"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎Pause‎‏‎‎‏‎"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎Skip to previous item‎‏‎‎‏‎"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎Skip to next item‎‏‎‎‏‎"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-es-rUS/strings.xml b/media2/media2-session/src/main/res/values-es-rUS/strings.xml
deleted file mode 100644
index dcdf617..0000000
--- a/media2/media2-session/src/main/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"En reproducción"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproducir"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausar"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Ir al elemento anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Ir al siguiente elemento"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-es/strings.xml b/media2/media2-session/src/main/res/values-es/strings.xml
deleted file mode 100644
index 6a4b37f..0000000
--- a/media2/media2-session/src/main/res/values-es/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Reproduciendo"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproducir"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausar"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Saltar al elemento anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Saltar al siguiente elemento"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-et/strings.xml b/media2/media2-session/src/main/res/values-et/strings.xml
deleted file mode 100644
index 317600e..0000000
--- a/media2/media2-session/src/main/res/values-et/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Hetkel mängimas"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Esitamine"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Peatamine"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Eelmise üksuse juurde liikumine"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Järgmise üksuse juurde liikumine"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-eu/strings.xml b/media2/media2-session/src/main/res/values-eu/strings.xml
deleted file mode 100644
index 6d5c549..0000000
--- a/media2/media2-session/src/main/res/values-eu/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Orain erreproduzitzen"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Erreproduzitu"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausatu"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Saltatu aurreko elementura"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Saltatu hurrengo elementura"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-fa/strings.xml b/media2/media2-session/src/main/res/values-fa/strings.xml
deleted file mode 100644
index eab4bec..0000000
--- a/media2/media2-session/src/main/res/values-fa/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"درحال پخش"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"پخش"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"مکث"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"پرش به مورد قبلی"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"پرش به مورد بعدی"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-fi/strings.xml b/media2/media2-session/src/main/res/values-fi/strings.xml
deleted file mode 100644
index 518d927..0000000
--- a/media2/media2-session/src/main/res/values-fi/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Nyt toistetaan"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Toista"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Tauko"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Siirry edelliseen"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Siirry seuraavaan"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-fr-rCA/strings.xml b/media2/media2-session/src/main/res/values-fr-rCA/strings.xml
deleted file mode 100644
index dc5da69..0000000
--- a/media2/media2-session/src/main/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"En cours de lecture"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Lire"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Accéder à l\'élément précédent"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Accéder à l\'élément suivant"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-fr/strings.xml b/media2/media2-session/src/main/res/values-fr/strings.xml
deleted file mode 100644
index 33ac087..0000000
--- a/media2/media2-session/src/main/res/values-fr/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"En écoute"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Lecture"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Passer à l\'élément précédent"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Passer à l\'élément suivant"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-gl/strings.xml b/media2/media2-session/src/main/res/values-gl/strings.xml
deleted file mode 100644
index 2ca6013..0000000
--- a/media2/media2-session/src/main/res/values-gl/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Reproducindo"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproduce o contido"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pon en pausa o contido"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Omite o elemento e vai ao anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Omite o elemento e vai ao seguinte"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-gu/strings.xml b/media2/media2-session/src/main/res/values-gu/strings.xml
deleted file mode 100644
index edc290c..0000000
--- a/media2/media2-session/src/main/res/values-gu/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"હમણાં વાગી રહ્યું છે"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ચલાવો"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"થોભાવો"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"પહેલાંની આઇટમ પર જાઓ"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"આગલી આઇટમ પર જાઓ"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-hi/strings.xml b/media2/media2-session/src/main/res/values-hi/strings.xml
deleted file mode 100644
index 4c1c301..0000000
--- a/media2/media2-session/src/main/res/values-hi/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"अभी चल रहा है"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"चलाएं"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"रोकें"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"पिछले आइटम पर जाएं"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"अगले आइटम पर जाएं"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-hr/strings.xml b/media2/media2-session/src/main/res/values-hr/strings.xml
deleted file mode 100644
index e8595ba..0000000
--- a/media2/media2-session/src/main/res/values-hr/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Upravo svira"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Pokreni"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauza"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Preskoči na prethodnu stavku"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Preskoči na sljedeću stavku"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-hu/strings.xml b/media2/media2-session/src/main/res/values-hu/strings.xml
deleted file mode 100644
index 4cf57ba..0000000
--- a/media2/media2-session/src/main/res/values-hu/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Most lejátszott"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Lejátszás"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Szünet"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Ugrás az előző elemre"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Ugrás a következő elemre"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-hy/strings.xml b/media2/media2-session/src/main/res/values-hy/strings.xml
index d25dcaf..7b9443e 100644
--- a/media2/media2-session/src/main/res/values-hy/strings.xml
+++ b/media2/media2-session/src/main/res/values-hy/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Նվագարկվում է"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Նվագարկել"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Դադար"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Անցնել նախորդ տարրին"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Անցնել հաջորդ տարրին"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Այժմ հնչում է"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Նվագարկել"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Դադարեցնել"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Անցնել նախորդ տարրին"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Անցնել հաջորդ տարրին"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-in/strings.xml b/media2/media2-session/src/main/res/values-in/strings.xml
deleted file mode 100644
index 4cb6e29..0000000
--- a/media2/media2-session/src/main/res/values-in/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Sedang diputar"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Putar"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Jeda"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Lewati ke item sebelumnya"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Lewati ke item berikutnya"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-is/strings.xml b/media2/media2-session/src/main/res/values-is/strings.xml
deleted file mode 100644
index 8874eb2..0000000
--- a/media2/media2-session/src/main/res/values-is/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Í spilun"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Spila"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Hlé"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Fara í fyrra atriði"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Fara í næsta atriði"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-it/strings.xml b/media2/media2-session/src/main/res/values-it/strings.xml
deleted file mode 100644
index 9f0dff2..0000000
--- a/media2/media2-session/src/main/res/values-it/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Ora in riproduzione"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausa"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Vai all\'elemento precedente"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Vai all\'elemento successivo"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-iw/strings.xml b/media2/media2-session/src/main/res/values-iw/strings.xml
deleted file mode 100644
index 111f0c46..0000000
--- a/media2/media2-session/src/main/res/values-iw/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"מה שומעים עכשיו?"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"הפעלה"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"השהיה"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"דילוג לפריט הקודם"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"דילוג לפריט הבא"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ja/strings.xml b/media2/media2-session/src/main/res/values-ja/strings.xml
deleted file mode 100644
index 391dba7..0000000
--- a/media2/media2-session/src/main/res/values-ja/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"再生中"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"再生"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"一時停止"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"前の項目にスキップ"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"次の項目にスキップ"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ka/strings.xml b/media2/media2-session/src/main/res/values-ka/strings.xml
index 3887d31..6a03150 100644
--- a/media2/media2-session/src/main/res/values-ka/strings.xml
+++ b/media2/media2-session/src/main/res/values-ka/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ახლა უკრავს"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"დაკვრა"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"პაუზა"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"წინა ერთეულზე გადასვლა"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"შემდეგ ერთეულზე გადასვლა"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"ამჟამად უკრავს"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"დაკვრა"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"პაუზა"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"წინა ერთეულზე გადასვლა"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"შემდეგ ერთეულზე გადასვლა"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-kk/strings.xml b/media2/media2-session/src/main/res/values-kk/strings.xml
deleted file mode 100644
index ea00023..0000000
--- a/media2/media2-session/src/main/res/values-kk/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Қазір ойнап тұр"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Ойнату"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Тоқтата тұру"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Алдыңғы элементке өту"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Келесі элементке өту"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-km/strings.xml b/media2/media2-session/src/main/res/values-km/strings.xml
deleted file mode 100644
index 340f7a0..0000000
--- a/media2/media2-session/src/main/res/values-km/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"កំពុងចាក់"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ចាក់"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ផ្អាក"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"រំលងទៅមេឌៀពីមុន"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"រំលងទៅមេឌៀបន្ទាប់"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-kn/strings.xml b/media2/media2-session/src/main/res/values-kn/strings.xml
index 159529e..d8206dc 100644
--- a/media2/media2-session/src/main/res/values-kn/strings.xml
+++ b/media2/media2-session/src/main/res/values-kn/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ಪ್ಲೇ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ಪ್ಲೇ"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ವಿರಾಮಗೊಳಿಸಿ"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ಹಿಂದಿನ ಐಟಂಗೆ ಸ್ಕಿಪ್‌ ಮಾಡಿ"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ಮುಂದಿನ ಐಟಂಗೆ ಸ್ಕಿಪ್‌ ಮಾಡಿ"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"ಇದೀಗ ಪ್ಲೇ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"ಪ್ಲೇ ಮಾಡಿ"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"ವಿರಾಮಗೊಳಿಸಿ"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"ಹಿಂದಿನ ಐಟಂಗೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"ಮುಂದಿನ ಐಟಂಗೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-ko/strings.xml b/media2/media2-session/src/main/res/values-ko/strings.xml
deleted file mode 100644
index f3b5863..0000000
--- a/media2/media2-session/src/main/res/values-ko/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"지금 재생 중"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"재생"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"일시중지"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"이전 항목으로 건너뛰기"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"다음 항목으로 건너뛰기"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ky/strings.xml b/media2/media2-session/src/main/res/values-ky/strings.xml
deleted file mode 100644
index c66db91..0000000
--- a/media2/media2-session/src/main/res/values-ky/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Эмне ойноп жатат"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Ойнотуу"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Тындыруу"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Мурунку нерсеге өтүү"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Кийинки нерсеге өтүү"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-lo/strings.xml b/media2/media2-session/src/main/res/values-lo/strings.xml
deleted file mode 100644
index 88034aca..0000000
--- a/media2/media2-session/src/main/res/values-lo/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ກຳລັງຫຼິ້ນຢູ່ຕອນນີ້"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ຫຼິ້ນ"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ຢຸດຊົ່ວຄາວ"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ຂ້າມໄປລາຍການກ່ອນໜ້າ"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ຂ້າມໄປລາຍການຕໍ່ໄປ"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-lt/strings.xml b/media2/media2-session/src/main/res/values-lt/strings.xml
deleted file mode 100644
index 2aca78a..0000000
--- a/media2/media2-session/src/main/res/values-lt/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Dabar leidžiama"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Leisti"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pristabdyti"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Pereiti prie ankstesnio elemento"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Pereiti prie kito elemento"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-lv/strings.xml b/media2/media2-session/src/main/res/values-lv/strings.xml
deleted file mode 100644
index f73844a..0000000
--- a/media2/media2-session/src/main/res/values-lv/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Tagad atskaņo"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Atskaņot"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pārtraukt"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Pāriet uz iepriekšējo vienumu"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Pāriet uz nākamo vienumu"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-mk/strings.xml b/media2/media2-session/src/main/res/values-mk/strings.xml
deleted file mode 100644
index 3ccbd85..0000000
--- a/media2/media2-session/src/main/res/values-mk/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Сега се репродуцира"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Пушти"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Паузирај"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Скокни на претходната ставка"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Скокни на следната ставка"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ml/strings.xml b/media2/media2-session/src/main/res/values-ml/strings.xml
deleted file mode 100644
index 2b8afc8..0000000
--- a/media2/media2-session/src/main/res/values-ml/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ഇപ്പോൾ കേൾക്കുന്നത്"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"പ്ലേ ചെയ്യുക"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"തൽക്കാലം നിർത്തുക"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"മുമ്പത്തെ ഇനത്തിലേക്ക് പോവുക"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"അടുത്ത ഇനത്തിലേക്ക് പോവുക"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-mn/strings.xml b/media2/media2-session/src/main/res/values-mn/strings.xml
deleted file mode 100644
index 791d112..0000000
--- a/media2/media2-session/src/main/res/values-mn/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Now playing"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Тоглох"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Түр зогсоох"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Өмнөх зүйл рүү очих"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Дараагийн зүйл рүү очих"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-mr/strings.xml b/media2/media2-session/src/main/res/values-mr/strings.xml
deleted file mode 100644
index 64dd982..0000000
--- a/media2/media2-session/src/main/res/values-mr/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"आता प्ले होत आहे"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"प्ले करा"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"थांबवा"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"मागील आयटमवर जा"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"पुढील आयटमवर जा"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ms/strings.xml b/media2/media2-session/src/main/res/values-ms/strings.xml
deleted file mode 100644
index 8424a1e..0000000
--- a/media2/media2-session/src/main/res/values-ms/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Sedang dimainkan"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Main"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Jeda"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Langkau ke item sebelumnya"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Langkau ke item seterusnya"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-my/strings.xml b/media2/media2-session/src/main/res/values-my/strings.xml
deleted file mode 100644
index 638af4b..0000000
--- a/media2/media2-session/src/main/res/values-my/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ယခု ဖွင့်နေသည်"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ဖွင့်ရန်"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ခေတ္တရပ်ရန်"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ပြီးခဲ့သည့်တစ်ခုသို့ ပြန်သွားရန်"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"နောက်တစ်ခုသို့ ကျော်ရန်"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-nb/strings.xml b/media2/media2-session/src/main/res/values-nb/strings.xml
deleted file mode 100644
index b4c7c20..0000000
--- a/media2/media2-session/src/main/res/values-nb/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Spilles nå"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Spill av"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Sett på pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Gå tilbake til det forrige elementet"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Hopp over til det neste elementet"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ne/strings.xml b/media2/media2-session/src/main/res/values-ne/strings.xml
deleted file mode 100644
index 7692de4..0000000
--- a/media2/media2-session/src/main/res/values-ne/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"अहिले प्ले हुँदै"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"प्ले गर्नुहोस्"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"पज गर्नुहोस्"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"अघिल्लो वस्तुमा जानुहोस्"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"अर्को वस्तुमा जानुहोस्"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-nl/strings.xml b/media2/media2-session/src/main/res/values-nl/strings.xml
index 1185920..606ce7a 100644
--- a/media2/media2-session/src/main/res/values-nl/strings.xml
+++ b/media2/media2-session/src/main/res/values-nl/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Wordt nu afgespeeld"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Afspelen"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauzeren"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Overslaan en naar vorig item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Overslaan en naar volgend item"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Wordt nu afgespeeld"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Afspelen"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Pauzeren"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Overslaan en naar vorig item"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Overslaan en naar volgend item"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-or/strings.xml b/media2/media2-session/src/main/res/values-or/strings.xml
deleted file mode 100644
index f2545fb..0000000
--- a/media2/media2-session/src/main/res/values-or/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ଏବେ ଚାଲୁଛି"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ଚଲାନ୍ତୁ"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ପଜ୍ କରନ୍ତୁ"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ପୂର୍ବବର୍ତ୍ତୀ ଆଇଟମ୍‌କୁ ଯାଆନ୍ତୁ"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ପରବର୍ତ୍ତୀ ଆଇଟମ୍‌କୁ ଯାଆନ୍ତୁ"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-pa/strings.xml b/media2/media2-session/src/main/res/values-pa/strings.xml
deleted file mode 100644
index 551c0da..0000000
--- a/media2/media2-session/src/main/res/values-pa/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ਹੁਣੇ ਚੱਲ ਰਿਹਾ ਹੈ"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ਚਲਾਓ"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"ਰੋਕੋ"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ਪਿਛਲੀ ਆਈਟਮ \'ਤੇ ਜਾਓ"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ਅਗਲੀ ਆਈਟਮ \'ਤੇ ਜਾਓ"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-pl/strings.xml b/media2/media2-session/src/main/res/values-pl/strings.xml
index 490b691..c497bdd 100644
--- a/media2/media2-session/src/main/res/values-pl/strings.xml
+++ b/media2/media2-session/src/main/res/values-pl/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Odtwarzam teraz"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Odtwórz"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Wstrzymaj"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Przeskocz do poprzedniego elementu"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Przeskocz do następnego elementu"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Co jest grane"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Odtwórz"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Wstrzymaj"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Przeskocz do poprzedniego elementu"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Przeskocz do następnego elementu"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-pt-rBR/strings.xml b/media2/media2-session/src/main/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 9b979df..0000000
--- a/media2/media2-session/src/main/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Tocando agora"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproduzir"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausar"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Voltar para o item anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Pular para o próximo item"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-pt-rPT/strings.xml b/media2/media2-session/src/main/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 48a0151..0000000
--- a/media2/media2-session/src/main/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"A tocar"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproduzir"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausar"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Ir para o item anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Ir para o item seguinte"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-pt/strings.xml b/media2/media2-session/src/main/res/values-pt/strings.xml
deleted file mode 100644
index 9b979df..0000000
--- a/media2/media2-session/src/main/res/values-pt/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Tocando agora"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Reproduzir"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausar"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Voltar para o item anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Pular para o próximo item"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ro/strings.xml b/media2/media2-session/src/main/res/values-ro/strings.xml
deleted file mode 100644
index 7a3ef46..0000000
--- a/media2/media2-session/src/main/res/values-ro/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Se redă acum"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Redați"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Întrerupeți"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Treceți la elementul anterior"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Treceți la elementul următor"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ru/strings.xml b/media2/media2-session/src/main/res/values-ru/strings.xml
deleted file mode 100644
index 8c690c6..0000000
--- a/media2/media2-session/src/main/res/values-ru/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Текущий трек"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Воспроизвести"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Приостановить"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Перейти к предыдущему файлу"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Перейти к следующему файлу"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-si/strings.xml b/media2/media2-session/src/main/res/values-si/strings.xml
index f23518b..bd244dc 100644
--- a/media2/media2-session/src/main/res/values-si/strings.xml
+++ b/media2/media2-session/src/main/res/values-si/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"දැන් වාදනය වේ"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"වාදනය"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"විරාමය"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"පෙර අයිතමය වෙත යන්න"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ඊළඟ අයිතමය වෙත යන්න"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"දැන් වාදනය වේ"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"වාදනය කරන්න"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"විරාම ගන්වන්න"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"පෙර අයිතමය වෙත යන්න"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"ඊළඟ අයිතමය වෙත යන්න"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-sk/strings.xml b/media2/media2-session/src/main/res/values-sk/strings.xml
deleted file mode 100644
index 7b3e564..0000000
--- a/media2/media2-session/src/main/res/values-sk/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Čo to hrá"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Prehrať"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pozastaviť"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Preskočiť na predchádzajúcu položku"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Preskočiť na ďalšiu položku"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-sl/strings.xml b/media2/media2-session/src/main/res/values-sl/strings.xml
deleted file mode 100644
index 2ef6d4c..0000000
--- a/media2/media2-session/src/main/res/values-sl/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Zdaj se predvaja"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Predvajanje"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Začasna ustavitev"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Preskok na prejšnji element"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Preskok na naslednji element"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-sq/strings.xml b/media2/media2-session/src/main/res/values-sq/strings.xml
index e44e01e..24e8fa7 100644
--- a/media2/media2-session/src/main/res/values-sq/strings.xml
+++ b/media2/media2-session/src/main/res/values-sq/strings.xml
@@ -17,9 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Po luhet tani"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Luaj"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauzë"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Kapërce tek artikulli i mëparshëm"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Kapërce tek artikulli tjetër"</string>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Po luhet tani"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Luaj"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Vendos në pauzë"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Kapërce tek artikulli i mëparshëm"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Kapërce tek artikulli tjetër"</string>
 </resources>
diff --git a/media2/media2-session/src/main/res/values-sr/strings.xml b/media2/media2-session/src/main/res/values-sr/strings.xml
deleted file mode 100644
index b0e126a..0000000
--- a/media2/media2-session/src/main/res/values-sr/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Тренутно свира"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Пустите"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Паузирајте"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Пређите на претходну ставку"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Пређите на следећу ставку"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-sv/strings.xml b/media2/media2-session/src/main/res/values-sv/strings.xml
deleted file mode 100644
index 70564e5..0000000
--- a/media2/media2-session/src/main/res/values-sv/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Nu spelas"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Spela upp"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pausa"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Hoppa till föregående objekt"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Hoppa till nästa objekt"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-sw/strings.xml b/media2/media2-session/src/main/res/values-sw/strings.xml
deleted file mode 100644
index 640f56d..0000000
--- a/media2/media2-session/src/main/res/values-sw/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Kitambua ngoma"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Cheza"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Sitisha"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Rudi kwenye kipengee kilichotangulia"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Nenda kwenye kipengee kinachofuata"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ta/strings.xml b/media2/media2-session/src/main/res/values-ta/strings.xml
deleted file mode 100644
index d7ba103..0000000
--- a/media2/media2-session/src/main/res/values-ta/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"பாடல் விவரம்"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"இயக்கும் பட்டன்"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"இடைநிறுத்தும் பட்டன்"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"முந்தையதற்குச் செல்லும் பட்டன்"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"அடுத்ததற்குச் செல்லும் பட்டன்"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-te/strings.xml b/media2/media2-session/src/main/res/values-te/strings.xml
deleted file mode 100644
index 3d3a494..0000000
--- a/media2/media2-session/src/main/res/values-te/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"ప్రస్తుతం ప్లే అవుతున్నది"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"ప్లే చేస్తుంది"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"పాజ్ చేస్తుంది"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"మునుపటి అంశానికి దాటవేస్తుంది"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"తర్వాత అంశానికి దాటవేస్తుంది"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-th/strings.xml b/media2/media2-session/src/main/res/values-th/strings.xml
deleted file mode 100644
index 63fd628..0000000
--- a/media2/media2-session/src/main/res/values-th/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"กำลังเล่น"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"เล่น"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"หยุดชั่วคราว"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"ข้ามไปยังรายการก่อนหน้า"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"ข้ามไปยังรายการถัดไป"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-tl/strings.xml b/media2/media2-session/src/main/res/values-tl/strings.xml
deleted file mode 100644
index 3429364..0000000
--- a/media2/media2-session/src/main/res/values-tl/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Nagpi-play ngayon"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"I-play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"I-pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Lumaktaw sa nakaraang item"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Lumaktaw sa susunod na item"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-tr/strings.xml b/media2/media2-session/src/main/res/values-tr/strings.xml
deleted file mode 100644
index 1455f06..0000000
--- a/media2/media2-session/src/main/res/values-tr/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Şimdi oynatılıyor"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Oynat"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Duraklat"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Önceki öğeye atla"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Sonraki öğeye atla"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-uk/strings.xml b/media2/media2-session/src/main/res/values-uk/strings.xml
deleted file mode 100644
index 3df4436b..0000000
--- a/media2/media2-session/src/main/res/values-uk/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Зараз грає"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Play"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pause"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Перейти до попереднього кадру"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Перейти до наступного кадру"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-ur/strings.xml b/media2/media2-session/src/main/res/values-ur/strings.xml
deleted file mode 100644
index 922204e..0000000
--- a/media2/media2-session/src/main/res/values-ur/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"اب چل رہا ہے"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"چلائیں"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"موقوف کریں"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"پچھلے آئٹم پر جائیں"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"اگلے آئٹم پر جائیں"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-uz/strings.xml b/media2/media2-session/src/main/res/values-uz/strings.xml
deleted file mode 100644
index a8295ce..0000000
--- a/media2/media2-session/src/main/res/values-uz/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Joriy trek"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Ijro"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Pauza"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Avvalgi obyektga o‘tish"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Keyingi obyektga o‘tish"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-vi/strings.xml b/media2/media2-session/src/main/res/values-vi/strings.xml
deleted file mode 100644
index 3ba94cb..0000000
--- a/media2/media2-session/src/main/res/values-vi/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Đang phát"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Phát"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Tạm dừng"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Chuyển về mục trước đó"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Chuyển đến mục tiếp theo"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-zh-rCN/strings.xml b/media2/media2-session/src/main/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 56a2320..0000000
--- a/media2/media2-session/src/main/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"正在播放"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"播放"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"暂停"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"跳至上一项"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"跳至下一项"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-zh-rHK/strings.xml b/media2/media2-session/src/main/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 15d1e9e..0000000
--- a/media2/media2-session/src/main/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"現正播放"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"播放"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"暫停"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"跳去上一個項目"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"跳去下一個項目"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-zh-rTW/strings.xml b/media2/media2-session/src/main/res/values-zh-rTW/strings.xml
deleted file mode 100644
index aa1ec5c..0000000
--- a/media2/media2-session/src/main/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"現正播放"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"播放"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"暫停"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"跳到上一個項目"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"跳到下一個項目"</string>
-</resources>
diff --git a/media2/media2-session/src/main/res/values-zu/strings.xml b/media2/media2-session/src/main/res/values-zu/strings.xml
deleted file mode 100644
index 3179f84..0000000
--- a/media2/media2-session/src/main/res/values-zu/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="default_notification_channel_name" msgid="6743534657295236036">"Okudlala manje"</string>
-    <string name="play_button_content_description" msgid="6034272287948142298">"Dlala"</string>
-    <string name="pause_button_content_description" msgid="4221330012095125431">"Phumula"</string>
-    <string name="skip_to_previous_item_button_content_description" msgid="7233771088610629683">"Yeqela kunto yangaphambilini"</string>
-    <string name="skip_to_next_item_button_content_description" msgid="17824442457643717">"Yeqela kunto elandelayo"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-af/strings.xml b/media2/media2-widget/src/main/res/values-af/strings.xml
deleted file mode 100644
index d3784e8..0000000
--- a/media2/media2-widget/src/main/res/values-af/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Af"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Oudiosnit"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Geen"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Terugspeelspoed"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normaal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Snit <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Snit <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Snit <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Videotitel is onbekend"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Liedjie onbekend"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Kunstenaar onbekend"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Kon nie die item speel wat jy versoek het nie"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Terug"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"\"Terug na vorige\"-knoppielys"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Sien nog knoppies"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Terugspeelvordering"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Instellings"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Onderskrif is aan. Klik om dit te versteek."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Onderskrif is af. Klik om dit te wys."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Herspeel"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Speel"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Laat wag"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Vorige media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Volgende media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Spoel 10 sekondes terug"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Gaan 30 sekondes vorentoe"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Volskerm"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-am/strings.xml b/media2/media2-widget/src/main/res/values-am/strings.xml
deleted file mode 100644
index 9f78440..0000000
--- a/media2/media2-widget/src/main/res/values-am/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"አጥፋ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ኦዲዮ ትራክ"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ምንም"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"የመልሶ ማጫወቻ ፍጥነት"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ደንበኛ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ትራክ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ትራክ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ትራክ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ያልታወቀ የቪዲዮ አርዕስት"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ያልታወቀ የዘፈን ርዕስ"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"ያልታወቀ አርቲስት"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"የጠየቁትን ንጥል ማጫወት አልተቻለም"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"እሺ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ተመለስ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ወደ ቀዳሚው የአዝራር ዝርዝር ተመለስ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"ተጨማሪ አዝራሮችን ይመልከቱ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"የመልሶ ማጫወት ሂደት"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ቅንብሮች"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"የግርጌ ጽሑፍ በርቷል። ለመደበቅ ጠቅ ያድርጉ።"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"የግርጌ ጽሑፍ ጠፍቷል። ለማሳየት ጠቅ ያድርጉ።"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"እንደገና አጫውት"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"አጫውት"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ላፍታ አቁም"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"ቀዳሚ ማህደረ መረጃ"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"ቀጣይ ማህደረ መረጃ"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"በ10 ሰከንዶች አጠንጥን"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"ወደፊት በ30 ሰከንዶች ሂድ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ሙሉ ማያ ገጽ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ar/strings.xml b/media2/media2-widget/src/main/res/values-ar/strings.xml
deleted file mode 100644
index 0719bbd..0000000
--- a/media2/media2-widget/src/main/res/values-ar/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"الترجمة موقوفة"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"المقطع الصوتي"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"بدون مقاطع صوتية"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"سرعة التشغيل"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"عادية"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"المقطع الصوتي <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"المقطع الصوتي <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"المقطع الصوتي <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"عنوان الفيديو غير معروف"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"عنوان الأغنية غير معروف."</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"الفنان غير معروف"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"تعذّر تشغيل الفيديو الذي طلبته."</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"حسنًا"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"رجوع"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"العودة إلى قائمة الازرار السابقة"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"عرض مزيد من الأزرار"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"مستوى تقدُّم التشغيل"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"الإعدادات"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"الترجمة مفعّلة. انقُر لإخفائها."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"الترجمة متوقفة. انقُر لعرضها."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"إعادة التشغيل"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"تشغيل"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"إيقاف مؤقت"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"الوسائط السابقة"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"الوسائط التالية"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"ترجيع الفيديو بمقدار 10 ثوانٍ"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"تقديم بمقدار 30 ثانية"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ملء الشاشة"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-as/strings.xml b/media2/media2-widget/src/main/res/values-as/strings.xml
deleted file mode 100644
index d9a43ce..0000000
--- a/media2/media2-widget/src/main/res/values-as/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"অফ আছে"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"অডিঅ’ ট্ৰেক"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"নাই"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"প্লে\'বেকৰ গতিবেগ"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"সাধাৰণ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"০০:০০:০০"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ট্ৰেক <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ট্ৰেক <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ট্ৰেক <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ভিডিঅ\'ৰ শিৰোনাম অজ্ঞাত"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"গীতৰ শিৰোনাম অজ্ঞাত"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"অজ্ঞাত শিল্পী"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"আপুনি অনুৰোধ জনোৱা সমলটো প্লে\' কৰিব পৰা নগ\'ল"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ঠিক আছে"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"উভতি যাওক"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"পূৰ্বৱৰ্তী বুটামৰ সূচীলৈ যাওক"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"অধিক বুটাম চাওক"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"প্লে\'বেকৰ অগ্ৰগতি"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ছেটিংসমূহ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"ছাবটাইটেল অন কৰা আছে। লুকুৱাবলৈ ক্লিক কৰক।"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"ছাবটাইটেল অফ কৰা আছে। দেখুৱাবলৈ ক্লিক কৰক।"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"পুনৰ প্লে’ কৰক"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"প্লে’ কৰক"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"পজ কৰক"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"পূৰ্বৱৰ্তী মিডিয়া"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"পৰৱৰ্তী মিডিয়া"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"১০ ছেকেণ্ডকৈ ৰিৱাইণ্ড কৰক"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"৩০ ছেকেণ্ডকৈ ফৰৱাৰ্ড কৰক"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"পূৰ্ণ স্ক্ৰীণ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-az/strings.xml b/media2/media2-widget/src/main/res/values-az/strings.xml
deleted file mode 100644
index 35ee2fe..0000000
--- a/media2/media2-widget/src/main/res/values-az/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Deaktiv"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio trek"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Heç biri"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Oxutma sürəti"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Trek <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Trek <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Trek <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Videonun başlığı bilinmir"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Mahnının adı bilinmir"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"İfaçı bilinmir"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Təklif etdiyiniz videonu oxutmaq alınmadı"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Geri"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Əvvəlki düymə siyahısına geri qayıdın"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Daha çox düyməyə baxın"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Oxutmanın gedişatı"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Ayarlar"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitr aktivdir. Gizlətmək üçün klikləyin."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitr deaktivdir. Göstərmək üçün klikləyin."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Yenidən oxudun"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Oxudun"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Dayandırın"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Əvvəlki media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Növbəti media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 saniyə geri çəkin"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 saniyə irəli çəkin"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Tam ekran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-b+sr+Latn/strings.xml b/media2/media2-widget/src/main/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index 61a56ef..0000000
--- a/media2/media2-widget/src/main/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Isključi"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio snimak"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ništa"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Brzina reprodukcije"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normalno"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. tekstualni zapis"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. tekstualni zapis – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. pesma"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Nepoznat naziv videa"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Nepoznat naziv pesme"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Nepoznat izvođač"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Nismo uspeli da pustimo stavku koju ste zahtevali"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Potvrdi"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Nazad"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Nazad na prethodnu listu dugmadi"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Prikaži još dugmadi"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Napredovanje reprodukcije"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Podešavanja"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Titl je uključen. Kliknite da biste ga sakrili."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Titl je isključen. Kliknite da biste ga prikazali."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Pusti opet"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Pusti"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pauziraj"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Prethodna medijska datoteka"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Sledeća medijska datoteka"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Premotaj unazad 10 sekundi"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Premotaj 30 sekundi unapred"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Ceo ekran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-be/strings.xml b/media2/media2-widget/src/main/res/values-be/strings.xml
deleted file mode 100644
index 938772d..0000000
--- a/media2/media2-widget/src/main/res/values-be/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Выкл."</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Гукавая дарожка"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Няма"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Хуткасць прайгравання"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Звычайная"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Трэк <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Трэк <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Трэк <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Невядомая назва відэа"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Невядомая назва кампазіцыі"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Невядомы выканаўца"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Не ўдалося прайграць гэта відэа"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ОК"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Назад"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Вярнуцца да папярэдняга спіса кнопак"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Паказаць дадатковыя кнопкі"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Ход прайгравання"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Налады"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Субцітры ўключаны. Націсніце, каб схаваць іх."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Субцітры выключаны. Націсніце, каб паказаць іх."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Паўтарыць"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Прайграць"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Прыпыніць"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Папярэдні файл мультымедыя"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Наступны файл мультымедыя"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Перайсці на 10 секунд назад"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Перайсці на 30 секунд уперад"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Поўнаэкранны рэжым"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-bg/strings.xml b/media2/media2-widget/src/main/res/values-bg/strings.xml
deleted file mode 100644
index b9616f7..0000000
--- a/media2/media2-widget/src/main/res/values-bg/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Изкл."</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Аудиозапис"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Няма"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Скорост на възпроизвеждане"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Нормална"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Запис <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Запис <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Запис <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Неизвестно заглавие на видеоклипа"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Неизвестно заглавие на песента"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Неизвестен изпълнител"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Заявеният от вас елемент не можа да се възпроизведе"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Назад"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Назад към предишния списък с бутони"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Вижте още бутони"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Напредък на възпроизвеждането"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Настройки"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Субтритрите са включени. Кликнете, за да ги скриете."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Субтитрите са изключени. Кликнете, за да се покажат."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Повторно пускане"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Пускане"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Поставяне на пауза"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Предишен мултимедиен елемент"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Следващ мултимедиен елемент"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Превъртане назад с 10 секунди"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Превъртане напред с 30 секунди"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Цял екран"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-bn/strings.xml b/media2/media2-widget/src/main/res/values-bn/strings.xml
deleted file mode 100644
index a358225..0000000
--- a/media2/media2-widget/src/main/res/values-bn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"বন্ধ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"অডিও ট্র্যাক"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"কোনওটিই নয়"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"প্লেব্যাকের গতি"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"সাধারণ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"০০:০০:০০"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ট্র্যাক <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ট্র্যাক <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ট্র্যাক <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ভিডিওর শীর্ষক অজানা"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"গানের শীর্ষক অজানা"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"অপরিচিত শিল্পী"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"আপনার অনুরোধ করা আইটেমটি চালানো যায়নি"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ঠিক আছে"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ফিরে যান"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"আগের বোতামের তালিকাতে ফিরে যান"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"আরও বোতাম দেখুন"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"কতটা চালানো হয়েছে"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"সেটিংস"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"সাবটাইটেল চালু আছে। সেটি লুকাতে ক্লিক করুন।"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"সাবটাইটেল বন্ধ আছে। সেটি দেখতে ক্লিক করুন।"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"আবার চালান"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"চালান"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"পজ করুন"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"পূর্ববর্তী মিডিয়া"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"পরবর্তী মিডিয়া"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"১০ সেকেন্ড রিওয়াইন্ড করুন"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"৩০ সেকেন্ড এগিয়ে যান"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ফুল স্ক্রিন"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-bs/strings.xml b/media2/media2-widget/src/main/res/values-bs/strings.xml
deleted file mode 100644
index cc701cc..0000000
--- a/media2/media2-widget/src/main/res/values-bs/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Isključi"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Zvučni zapis"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nema"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Brzina reprodukcije"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normalno"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Numera <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Numera <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Numera <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Nepoznat naziv videozapisa"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Nepoznat naziv pjesme"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Nepoznat izvođač"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Reproduciranje stavke koju ste zatražili nije uspjelo"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"UREDU"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Nazad"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Nazad na prethodni spisak dugmadi"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Prikaži više dugmadi"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Napredak reprodukcije"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Postavke"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Titlovi su uključeni. Kliknite da ih sakrijete."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Titlovi su isključeni. Kliknite da ih prikažete."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Ponovo reproduciraj"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reproduciraj"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pauza"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Prethodna medijska stavka"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Sljedeća medijska stavka"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Vrati nazad 10 sekundi"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Idi naprijed 30 sekundi"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Cijeli ekran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ca/strings.xml b/media2/media2-widget/src/main/res/values-ca/strings.xml
deleted file mode 100644
index 5d68a01..0000000
--- a/media2/media2-widget/src/main/res/values-ca/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desactivat"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Pista d’àudio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Cap"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocitat de reproducció"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>: <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Pista <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Títol de vídeo desconegut"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Títol de cançó desconegut"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista desconegut"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"No s\'ha pogut reproduir l\'element que has sol·licitat"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"D\'acord"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Enrere"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Torna a la llista de botons anterior"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Mostra més botons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progrés de la reproducció"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Configuració"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Els subtítols estan activats. Fes clic per amagar-los."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Els subtítols estan desactivats. Fes clic per veure\'ls."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Torna a reproduir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reprodueix"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Posa en pausa"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Element multimèdia anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Element multimèdia següent"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rebobina 10 segons"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avança 30 segons"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pantalla completa"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-cs/strings.xml b/media2/media2-widget/src/main/res/values-cs/strings.xml
deleted file mode 100644
index f14483d..0000000
--- a/media2/media2-widget/src/main/res/values-cs/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Vyp."</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Zvuková stopa"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Žádné"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Rychlost přehrávání"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normální"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Stopa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Stopa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Stopa <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Neznámý název videa"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Neznámý název skladby"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Neznámý interpret"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Požadovanou položku se nepodařilo přehrát"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Zpět"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Zpět na předchozí seznam tlačítek"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Zobrazit další tlačítka"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Průběh přehrávání"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Nastavení"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Titulky jsou zapnuté. Kliknutím je skryjete."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Titulky jsou vypnuté. Kliknutím je zobrazíte."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Přehrát znovu"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Přehrát"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pozastavit"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Předchozí mediální objekt"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Další mediální objekt"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rychlý posun zpět po 10 sekundách"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Přejít o 30 sekund vpřed"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Celá obrazovka"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-da/strings.xml b/media2/media2-widget/src/main/res/values-da/strings.xml
deleted file mode 100644
index 74fedbd..0000000
--- a/media2/media2-widget/src/main/res/values-da/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Fra"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Lydspor"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ingen"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Afspilningshastighed"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Spor <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Spor <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Spor <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Ukendt videotitel"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Ukendt sangtitel"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Ukendt kunstner"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Den ønskede video kunne ikke afspilles"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Tilbage"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Tilbage til forrige liste over knapper"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Se flere knapper"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Afspilningsstatus"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Indstillinger"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Undertekster er aktiveret. Klik for at skjule dem."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Undertekster er deaktiveret. Klik for at se dem."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Afspil igen"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Afspil"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Sæt på pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Forrige medie"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Næste medie"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Spol 10 sekunder tilbage"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Spol 30 sekunder frem"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Fuld skærm"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-de/strings.xml b/media2/media2-widget/src/main/res/values-de/strings.xml
deleted file mode 100644
index 08f0002..0000000
--- a/media2/media2-widget/src/main/res/values-de/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Aus"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audiotitel"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Keine"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Wiedergabegeschwindigkeit"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Titel <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Titel <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Titel <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Unbekannter Videotitel"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Unbekannter Musiktitel"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Unbekannter Interpret"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Das angeforderte Video konnte nicht wiedergegeben werden"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Zurück"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Zurück zur vorherigen Schaltflächenliste"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Weitere Schaltflächen zeigen"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Wiedergabefortschritt"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Einstellungen"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Untertitel ist aktiviert. Zum Verbergen klicken."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Untertitel ist deaktiviert. Zum Anzeigen klicken."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Nochmal"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Spielen"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Vorheriges Medium"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Nächstes Medium"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 Sekunden zurück"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 Sekunden vorspringen"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Vollbild"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-el/strings.xml b/media2/media2-widget/src/main/res/values-el/strings.xml
deleted file mode 100644
index 5cf2619..0000000
--- a/media2/media2-widget/src/main/res/values-el/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Ανενεργό"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Κομμάτι ήχου"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Κανένα"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Ταχύτητα αναπαραγωγής"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Κανονική"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Κομμάτι <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Κομμάτι <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Κομμάτι <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Άγνωστος τίτλος βίντεο"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Άγνωστος τίτλος τραγουδιού"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Άγνωστος καλλιτέχνης"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Δεν ήταν δυνατή η αναπαραγωγή του στοιχείου που ζητήσατε"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Πίσω"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Επιστροφή στην προηγούμενη λίστα κουμπιών"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Εμφάνιση περισσότερων κουμπιών"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Πρόοδος αναπαραγωγής"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Ρυθμίσεις"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Ο υπότιτλος είναι ενεργός. Κάντε κλικ για να τον αποκρύψετε."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Ο υπότιτλος είναι ανενεργός. Κάντε κλικ για να τον εμφανίσετε."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Επανάληψη"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Αναπαραγωγή"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Παύση"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Προηγούμενο μέσο"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Επόμενο μέσο"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Μετάβαση προς τα πίσω κατά 10 δευτερόλεπτα"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Μετάβαση προς τα εμπρός κατά 30 δευτερόλεπτα"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Πλήρης οθόνη"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-en-rAU/strings.xml b/media2/media2-widget/src/main/res/values-en-rAU/strings.xml
index 8a0036d..a15ebb7 100644
--- a/media2/media2-widget/src/main/res/values-en-rAU/strings.xml
+++ b/media2/media2-widget/src/main/res/values-en-rAU/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Off"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio track"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"None"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Playback speed"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Video title unknown"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Song title unknown"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artist unknown"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Couldn\'t play the item that you requested"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Back"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Back to previous button list"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"See more buttons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Playback progress"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Settings"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitle is on. Click to hide it."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitle is off. Click to show it."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Replay"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Play"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Previous media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Next media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rewind by 10 seconds"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Go forwards 30 seconds"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Full screen"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Off"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Audio track"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"None"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Playback speed"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normal"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Video title unknown"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Song title unknown"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Artist unknown"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Couldn\'t play the item that you requested"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"OK"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Back"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Back to previous button list"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"See more buttons"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Playback progress"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Settings"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Subtitle is on. Click to hide it."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Subtitle is off. Click to show it."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Replay"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Play"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Pause"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Previous media"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Next media"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Rewind by 10 seconds"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Go forwards 30 seconds"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Full screen"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-en-rCA/strings.xml b/media2/media2-widget/src/main/res/values-en-rCA/strings.xml
index 8a0036d..a15ebb7 100644
--- a/media2/media2-widget/src/main/res/values-en-rCA/strings.xml
+++ b/media2/media2-widget/src/main/res/values-en-rCA/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Off"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio track"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"None"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Playback speed"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Video title unknown"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Song title unknown"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artist unknown"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Couldn\'t play the item that you requested"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Back"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Back to previous button list"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"See more buttons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Playback progress"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Settings"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitle is on. Click to hide it."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitle is off. Click to show it."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Replay"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Play"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Previous media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Next media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rewind by 10 seconds"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Go forwards 30 seconds"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Full screen"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Off"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Audio track"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"None"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Playback speed"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normal"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Video title unknown"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Song title unknown"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Artist unknown"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Couldn\'t play the item that you requested"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"OK"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Back"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Back to previous button list"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"See more buttons"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Playback progress"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Settings"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Subtitle is on. Click to hide it."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Subtitle is off. Click to show it."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Replay"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Play"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Pause"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Previous media"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Next media"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Rewind by 10 seconds"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Go forwards 30 seconds"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Full screen"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-en-rGB/strings.xml b/media2/media2-widget/src/main/res/values-en-rGB/strings.xml
index 8a0036d..a15ebb7 100644
--- a/media2/media2-widget/src/main/res/values-en-rGB/strings.xml
+++ b/media2/media2-widget/src/main/res/values-en-rGB/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Off"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio track"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"None"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Playback speed"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Video title unknown"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Song title unknown"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artist unknown"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Couldn\'t play the item that you requested"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Back"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Back to previous button list"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"See more buttons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Playback progress"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Settings"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitle is on. Click to hide it."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitle is off. Click to show it."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Replay"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Play"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Previous media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Next media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rewind by 10 seconds"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Go forwards 30 seconds"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Full screen"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Off"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Audio track"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"None"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Playback speed"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normal"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Video title unknown"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Song title unknown"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Artist unknown"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Couldn\'t play the item that you requested"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"OK"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Back"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Back to previous button list"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"See more buttons"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Playback progress"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Settings"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Subtitle is on. Click to hide it."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Subtitle is off. Click to show it."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Replay"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Play"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Pause"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Previous media"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Next media"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Rewind by 10 seconds"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Go forwards 30 seconds"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Full screen"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-en-rIN/strings.xml b/media2/media2-widget/src/main/res/values-en-rIN/strings.xml
index 8a0036d..a15ebb7 100644
--- a/media2/media2-widget/src/main/res/values-en-rIN/strings.xml
+++ b/media2/media2-widget/src/main/res/values-en-rIN/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Off"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio track"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"None"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Playback speed"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Video title unknown"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Song title unknown"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artist unknown"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Couldn\'t play the item that you requested"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Back"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Back to previous button list"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"See more buttons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Playback progress"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Settings"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitle is on. Click to hide it."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitle is off. Click to show it."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Replay"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Play"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Previous media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Next media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rewind by 10 seconds"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Go forwards 30 seconds"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Full screen"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Off"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Audio track"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"None"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Playback speed"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normal"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Video title unknown"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Song title unknown"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Artist unknown"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Couldn\'t play the item that you requested"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"OK"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Back"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Back to previous button list"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"See more buttons"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Playback progress"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Settings"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Subtitle is on. Click to hide it."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Subtitle is off. Click to show it."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Replay"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Play"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Pause"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Previous media"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Next media"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Rewind by 10 seconds"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Go forwards 30 seconds"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Full screen"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-en-rXC/strings.xml b/media2/media2-widget/src/main/res/values-en-rXC/strings.xml
index b6a2882..7b5584e 100644
--- a/media2/media2-widget/src/main/res/values-en-rXC/strings.xml
+++ b/media2/media2-widget/src/main/res/values-en-rXC/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎Off‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎Audio track‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎None‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‎Playback speed‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎Normal‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎00:00:00‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎Track ‎‏‎‎‏‏‎<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎Track ‎‏‎‎‏‏‎<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎ - ‎‏‎‎‏‏‎<xliff:g id="LANG">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎Track ‎‏‎‎‏‏‎<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎Video title unknown‎‏‎‎‏‎"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎Song title unknown‎‏‎‎‏‎"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎Artist unknown‎‏‎‎‏‎"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎Couldn\'t play the item you requested‎‏‎‎‏‎"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎OK‎‏‎‎‏‎"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎Back‎‏‎‎‏‎"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎Back to previous button list‎‏‎‎‏‎"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‎See more buttons‎‏‎‎‏‎"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎Playback progress‎‏‎‎‏‎"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‎Settings‎‏‎‎‏‎"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎Subtitle is on. Click to hide it.‎‏‎‎‏‎"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎Subtitle is off. Click to show it.‎‏‎‎‏‎"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎Replay‎‏‎‎‏‎"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎Play‎‏‎‎‏‎"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎Pause‎‏‎‎‏‎"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎Previous media‎‏‎‎‏‎"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎Next media‎‏‎‎‏‎"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎Rewind by 10 seconds‎‏‎‎‏‎"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎Go forward by 30 seconds‎‏‎‎‏‎"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎Full screen‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‎Off‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎Audio track‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎None‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎Playback speed‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎Normal‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎00:00:00‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎Track ‎‏‎‎‏‏‎<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎Track ‎‏‎‎‏‏‎<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎ - ‎‏‎‎‏‏‎<xliff:g id="LANG">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎Track ‎‏‎‎‏‏‎<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎Video title unknown‎‏‎‎‏‎"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎Song title unknown‎‏‎‎‏‎"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎Artist unknown‎‏‎‎‏‎"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎Couldn\'t play the item you requested‎‏‎‎‏‎"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎OK‎‏‎‎‏‎"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎Back‎‏‎‎‏‎"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎Back to previous button list‎‏‎‎‏‎"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‏‎See more buttons‎‏‎‎‏‎"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎Playback progress‎‏‎‎‏‎"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎Settings‎‏‎‎‏‎"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‏‎‏‏‏‎Subtitle is on. Click to hide it.‎‏‎‎‏‎"</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎Subtitle is off. Click to show it.‎‏‎‎‏‎"</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎Replay‎‏‎‎‏‎"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎Play‎‏‎‎‏‎"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‎‎Pause‎‏‎‎‏‎"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎Previous media‎‏‎‎‏‎"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎Next media‎‏‎‎‏‎"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎Rewind by 10 seconds‎‏‎‎‏‎"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎Go forward by 30 seconds‎‏‎‎‏‎"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‎Full screen‎‏‎‎‏‎"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-es-rUS/strings.xml b/media2/media2-widget/src/main/res/values-es-rUS/strings.xml
deleted file mode 100644
index 09b3854..0000000
--- a/media2/media2-widget/src/main/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desactivados"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Pista de audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ninguna"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocidad de reproducción"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Pista <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Título de video desconocido"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Título de canción desconocido"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista desconocido"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"No se pudo reproducir el elemento que solicitaste"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Aceptar"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Atrás"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Volver a la lista anterior de botones"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ver más botones"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progreso de reproducción"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Configuración"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Los subtítulos están activados. Haz clic para ocultarlos."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Los subtítulos están desactivados. Haz clic para mostrarlos."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Volver a reproducir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reproducir"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausar"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Archivo multimedia anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Siguiente archivo multimedia"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Retroceder 10 segundos"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avanzar 30 segundos"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pantalla completa"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-es/strings.xml b/media2/media2-widget/src/main/res/values-es/strings.xml
deleted file mode 100644
index 5cf484a..0000000
--- a/media2/media2-widget/src/main/res/values-es/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desactivados"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Pista de audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ninguna"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocidad de reproducción"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> (<xliff:g id="LANG">%2$s</xliff:g>)"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Pista <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Título de vídeo desconocido"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Título de canción desconocido"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista desconocido"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"No se ha podido reproducir el elemento que has solicitado"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Aceptar"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Atrás"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Volver a la lista anterior de botones"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ver más botones"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progreso de reproducción"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Ajustes"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Los subtítulos están activados. Haz clic para ocultarlos."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Los subtítulos están desactivados. Haz clic para que se muestren."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Volver a reproducir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reproducir"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausar"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Anterior archivo multimedia"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Siguiente archivo multimedia"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rebobinar 10 segundos"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avanzar 30 segundos"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pantalla completa"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-et/strings.xml b/media2/media2-widget/src/main/res/values-et/strings.xml
deleted file mode 100644
index 95bb621..0000000
--- a/media2/media2-widget/src/main/res/values-et/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Väljas"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Heliriba"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Puudub"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Taasesituskiirus"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Tavaline"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00.00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. lugu"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. lugu – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. lugu"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Tundmatu video pealkiri"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Tundmatu loo pealkiri"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Tundmatu esitaja"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Teie soovitud üksust ei saanud esitada"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Tagasi"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Tagasi eelmise nupuloendi juurde"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Kuva rohkem nuppe"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Taasesitus on pooleli"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Seaded"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtiiter on sees. Klõpsake selle peitmiseks."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtiiter on väljas. Klõpsake selle kuvamiseks."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Taasesita"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Esita"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Peata"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Eelmine meediaüksus"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Järgmine meediaüksus"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Keri kümme sekundit tagasi"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Keri 30 sekundit edasi"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Täisekraan"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-eu/strings.xml b/media2/media2-widget/src/main/res/values-eu/strings.xml
deleted file mode 100644
index b3cad2a..0000000
--- a/media2/media2-widget/src/main/res/values-eu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desaktibatuta"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio-pista"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Bat ere ez"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Erreprodukzioaren abiadura"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normala"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. pista"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. pista (<xliff:g id="LANG">%2$s</xliff:g>)"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. pista"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Bideoaren izen ezezaguna"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Abestiaren izen ezezaguna"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista ezezaguna"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Ezin izan da erreproduzitu eskatu duzun elementua"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Ados"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Atzera"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Itzuli aurreko botoien zerrendara"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ikusi botoi gehiago"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Erreprodukzioaren garapena"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Ezarpenak"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Azpitituluak aktibatuta daude. Sakatu ezkutatzeko."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Azpitituluak desaktibatuta daude. Sakatu erakusteko."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Erreproduzitu berriro"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Erreproduzitu"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausatu"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Aurreko multimedia-elementua"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Hurrengo multimedia-elementua"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Atzeratu 10 segundo"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Aurreratu 30 segundo"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pantaila osoa"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-fa/strings.xml b/media2/media2-widget/src/main/res/values-fa/strings.xml
deleted file mode 100644
index 8efdfce..0000000
--- a/media2/media2-widget/src/main/res/values-fa/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"خاموش"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"آهنگ صوتی"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"هیچ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"سرعت بازپخش"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"عادی"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"۰۰:۰۰:۰۰"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"آهنگ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"آهنگ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"آهنگ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"عنوان ویدیو نامشخص"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"عنوان آهنگ نامشخص"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"هنرمند ناشناس"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"مورد درخواستی پخش نشد"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"تأیید"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"برگشت"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"فهرست دکمه برگشت به عقب"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"مشاهده دکمه‌های بیشتر"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"پیشرفت بازپخش"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"تنظیمات"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"زیرنویس روشن است. برای پنهان کردن زیرنویس کلیک کنید."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"زیرنویس خاموش است. برای نمایش زیرنویس کلیک کنید."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"بازپخش"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"پخش"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"مکث"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"رسانه قبلی"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"رسانه بعدی"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"۱۰ ثانیه به عقب رفتن"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"۳۰ ثانیه رفتن به جلو"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"تمام‌صفحه"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-fi/strings.xml b/media2/media2-widget/src/main/res/values-fi/strings.xml
deleted file mode 100644
index b4a2dc7..0000000
--- a/media2/media2-widget/src/main/res/values-fi/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Pois käytöstä"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Ääniraita"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ei mitään"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Toistonopeus"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normaali"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00.00.00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Raita <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Raita <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Raita <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Videon nimi tuntematon"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Kappaleen nimi tuntematon"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artisti tuntematon"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Valitsemaasi kohdetta ei voitu toistaa"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Takaisin"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Takaisin edellisten painikkeiden luetteloon"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Näytä lisää painikkeita"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Toiston edistyminen"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Asetukset"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Tekstitykset ovat käytössä. Piilota ne klikkaamalla."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Tekstitykset ovat pois käytöstä. Näytä ne klikkaamalla."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Pelaa uudelleen"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Toista"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Tauko"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Edellinen mediatiedosto"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Seuraava mediatiedosto"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Palaa 10 sekuntia taaksepäin"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Siirry 30 sekuntia eteenpäin"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Koko näyttö"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-fr-rCA/strings.xml b/media2/media2-widget/src/main/res/values-fr-rCA/strings.xml
deleted file mode 100644
index cc3d1ce..0000000
--- a/media2/media2-widget/src/main/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Désactivé"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Piste audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Aucun"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Vitesse de lecture"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Piste <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Piste <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> (<xliff:g id="LANG">%2$s</xliff:g>)"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Piste <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Titre de vidéo inconnu"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Titre de chanson inconnu"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artiste inconnu"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Impossible de lire l\'élément demandé"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Retour"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Retour à la liste de boutons précédente"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Afficher plus de boutons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progression de la lecture"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Paramètres"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Les sous-titres sont activés. Cliquez ici pour les masquer."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Les sous-titres sont désactivés. Cliquez ici pour les afficher."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Revoir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Lire"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Élément précédent"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Élément suivant"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Reculer de 10 secondes"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avancer de 30 secondes"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Plein écran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-fr/strings.xml b/media2/media2-widget/src/main/res/values-fr/strings.xml
deleted file mode 100644
index 2a949a2..0000000
--- a/media2/media2-widget/src/main/res/values-fr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Sous-titres désactivés"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Piste audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Aucune"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Vitesse de lecture"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normale"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Piste <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Piste <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Piste <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Titre de la vidéo inconnu"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Titre du morceau inconnu"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artiste inconnu"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Impossible de lire la vidéo demandée"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Retour"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Retour à la liste de boutons précédente"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Afficher plus de boutons"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progression de la lecture"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Paramètres"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Les sous-titres sont activés. Cliquez ici pour les masquer."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Les sous-titres sont désactivés. Cliquez ici pour les afficher."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Revoir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Lire"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Mettre en pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Contenu multimédia précédent"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Contenu multimédia suivant"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Revenir en arrière de 10 secondes"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avancer de 30 secondes"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Plein écran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-gl/strings.xml b/media2/media2-widget/src/main/res/values-gl/strings.xml
deleted file mode 100644
index 3f01b7b..0000000
--- a/media2/media2-widget/src/main/res/values-gl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desconectar"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Pista de audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ningunha"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocidade de reprodución"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Pista <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> (<xliff:g id="LANG">%2$s</xliff:g>)"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Pista <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Título do vídeo: descoñecido"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Título da canción descoñecido"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista descoñecido"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Non se puido reproducir o elemento que solicitaches"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Aceptar"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Atrás"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Volve á lista anterior de botóns"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Mostra máis botóns"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progreso da reprodución"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Configuración"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Os subtítulos están activados. Fai clic para ocultalos."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Os subtítulos están desactivados. Fai clic para mostralos."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Reproduce o contido de novo"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reproduce o contido"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pono en pausa"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Ficheiro multimedia anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Seguinte ficheiro multimedia"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Retrocede 10 segundos"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avanza 30 segundos"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pantalla completa"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-gu/strings.xml b/media2/media2-widget/src/main/res/values-gu/strings.xml
deleted file mode 100644
index b767952..0000000
--- a/media2/media2-widget/src/main/res/values-gu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"બંધ છે"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ઑડિયો ટ્રૅક"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"કોઈ નહીં"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"પ્લેબૅકની ગતિ"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"સામાન્ય"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ટ્રૅક <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ટ્રૅક <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ટ્રૅક <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"વીડિયોનું શીર્ષક અજાણ્યું"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ગીતનું શીર્ષક અજાણ્યું"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"કલાકારનું નામ અજાણ્યું"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"તમે વિનંતી કરેલી આઇટમ ચલાવી શક્યાં નથી"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ઓકે"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"પાછળ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"પહેલાંની બટન સૂચિ પર પાછા જાઓ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"વધુ બટન જુઓ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"પ્લેબૅક ચાલુ છે"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"સેટિંગ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"સબટાઇટલ ચાલુ છે. તેને છુપાવવા માટે ક્લિક કરો."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"સબટાઇટલ બંધ છે. તેને બતાવવા માટે ક્લિક કરો."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ફરી ચલાવો"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ચલાવો"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"થોભાવો"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"પાછલું મીડિયા"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"આગલું મીડિયા"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 સેકન્ડ રિવાઇન્ડ કરો"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 સેકન્ડ આગળ જાઓ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"પૂર્ણ સ્ક્રીન"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-hi/strings.xml b/media2/media2-widget/src/main/res/values-hi/strings.xml
deleted file mode 100644
index 24c96a0..0000000
--- a/media2/media2-widget/src/main/res/values-hi/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"बंद"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ऑडियो ट्रैक"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"कोई नहीं"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"वीडियो चलाने की रफ़्तार"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"सामान्य"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ट्रैक <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ट्रैक <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ट्रैक <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"वीडियो का शीर्षक नहीं पता"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"गाने का शीर्षक पता नहीं"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"कलाकार का नाम नहीं पता"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"वह वीडियाे नहीं चलाया जा सका जिसका आपने अनुरोध किया था"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ठीक है"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"वापस जाएं"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"बटन की पिछली सूची पर वापस जाएं"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"ज़्यादा बटन देखें"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"वीडियो चलने की प्रगति"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"सेटिंग"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"सबटाइटल चालू है. इसे छिपाने के लिए क्लिक करें."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"सबटाइटल बंद है. इसे दिखाने के लिए क्लिक करें."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"फिर से चलाएं"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"चलाएं"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"रोकें"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"पिछला मीडिया"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"अगला मीडिया"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 सेकंड पीछे ले जाएं"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 सेकंड आगे जाएं"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"फ़ुल-स्क्रीन"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-hr/strings.xml b/media2/media2-widget/src/main/res/values-hr/strings.xml
deleted file mode 100644
index 123969f..0000000
--- a/media2/media2-widget/src/main/res/values-hr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Isključi"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Zvučni zapis"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nema"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Brzina reprodukcije"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Uobičajena"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Zapis <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Zapis <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Zapis <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Naslov videozapisa nije poznat"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Naslov pjesme nije poznat"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Izvođač nije poznat"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Zatražena stavka ne može se reproducirati"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"U redu"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Natrag"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Natrag na prethodni popis gumba"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Pogledajte više gumba"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Napredak reprodukcije"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Postavke"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Titlovi su uključeni. Kliknite da biste ih sakrili."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Titlovi su isključeni. Kliknite da bi se prikazivali."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Ponovi"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reproduciraj"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pauza"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Prethodni medij"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Sljedeći medij"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 sekundi unatrag"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 sekundi unaprijed"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Cijeli zaslon"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-hu/strings.xml b/media2/media2-widget/src/main/res/values-hu/strings.xml
deleted file mode 100644
index 240f168..0000000
--- a/media2/media2-widget/src/main/res/values-hu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Ki"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Hangsáv"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nincs"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Lejátszási sebesség"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normál"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. szám"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. szám – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. szám"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Ismeretlen videócím"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Ismeretlen dalcím"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Ismeretlen előadó"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Nem sikerült lejátszani a kért médiaelemet"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Vissza"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Vissza az előző gomblistára"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"További gombok megjelenítése"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Lejátszási folyamat"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Beállítások"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"A feliratozás be van kapcsolva. Kattintson a feliratok elrejtéséhez."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"A feliratozás ki van kapcsolva. Kattintson a feliratok megjelenítéséhez."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Újra"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Lejátszás"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Szünet"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Előző médiaelem"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Következő médiaelem"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Visszatekerés 10 másodperccel"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Előrelépés 30 másodperccel"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Teljes képernyő"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-hy/strings.xml b/media2/media2-widget/src/main/res/values-hy/strings.xml
index 82a61c5..b61f6b5 100644
--- a/media2/media2-widget/src/main/res/values-hy/strings.xml
+++ b/media2/media2-widget/src/main/res/values-hy/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Անջատված է"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Ձայնային կատարում"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ոչ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Նվագարկման արագություն"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Սովորական"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Կատարում <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Կատարում <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Կատարում <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Տեսանյութի անվանումն անհայտ է"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Երգի անվանումն անհայտ է"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Կատարողն անհայտ է"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Չհաջողվեց նվագարկել տեսանյութը"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Եղավ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Հետ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Վերադառնալ կոճակների նախորդ ցանկին"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Այլ կոճակներ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Նվագարկվում է"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Կարգավորումներ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Ենթագրերը միացված են: Սեղմեք՝ թաքցնելու համար:"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Ենթագրերն անջատված են: Սեղմեք՝ ցուցադրելու համար:"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Կրկնել"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Նվագարկել"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Ընդհատել"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Նախորդ մեդիա ֆայլը"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Հաջորդ մեդիա ֆայլը"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 վայրկյանով հետ գնալ"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 վայրկյանով առաջ գնալ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Լիաէկրան"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Անջատված է"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Աուդիո"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Չկա"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Նվագարկման արագությունը"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Սովորական"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00։00։00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Կատարում <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Կատարում <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Կատարում <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Տեսանյութի անվանումն անհայտ է"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Երգի անվանումն անհայտ է"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Կատարողն անհայտ է"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Չհաջողվեց նվագարկել տեսանյութը"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"Եղավ"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Հետ"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Անցնել կոճակների նախորդ ցանկին"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"Այլ կոճակներ"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Նվագարկման ընթացքը"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Կարգավորումներ"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Սեղմեք՝ ենթագրերը թաքցնելու համար։"</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Սեղմեք՝ ենթագրերը ցուցադրելու համար։"</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Նորից նվագարկել"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Նվագարկել"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Դադարեցնել"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Նախորդ մեդիա ֆայլը"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Հաջորդ մեդիա ֆայլը"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"10 վայրկյանով հետ գնալ"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"30 վայրկյանով առաջ գնալ"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Լիաէկրան"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-in/strings.xml b/media2/media2-widget/src/main/res/values-in/strings.xml
deleted file mode 100644
index 02d4b9e..0000000
--- a/media2/media2-widget/src/main/res/values-in/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Nonaktif"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Trek audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Tidak ada"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Kecepatan pemutaran"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Trek <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Trek <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Trek <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Judul video tidak dikenal"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Judul lagu tidak dikenal"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artis tidak dikenal"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Tidak dapat memutar item yang diminta"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Oke"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Kembali"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Kembali ke daftar tombol sebelumnya"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Lihat tombol lainnya"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progres pemutaran"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Setelan"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitel aktif. Klik untuk menyembunyikannya."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitel nonaktif. Klik untuk menampilkannya."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Putar ulang"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Putar"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Jeda"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Media sebelumnya"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Media berikutnya"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Mundur 10 detik"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Maju 30 detik"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Layar penuh"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-is/strings.xml b/media2/media2-widget/src/main/res/values-is/strings.xml
deleted file mode 100644
index 5627a58..0000000
--- a/media2/media2-widget/src/main/res/values-is/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Slökkt"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Hljóðrás"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Engin"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Spilunarhraði"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Venjuleg"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Lag <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Lag <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Lag <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Óþekktur titill myndskeiðs"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Óþekkt heiti lags"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Óþekktur flytjandi"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Ekki tókst að spila það sem þú baðst um"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Í lagi"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Til baka"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Aftur á fyrri hnappalista"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Sjá fleiri hnappa"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Framvinda spilunar"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Stillingar"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Kveikt er á skjátexta. Smelltu til að fela hann."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Slökkt er á skjátexta. Smelltu til að birta hann."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Spila aftur"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Spila"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Hlé"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Fyrra efni"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Næsta efni"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Spóla til baka um 10 sekúndur"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Spóla áfram um 30 sekúndur"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Allur skjárinn"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-it/strings.xml b/media2/media2-widget/src/main/res/values-it/strings.xml
deleted file mode 100644
index 6fe366d..0000000
--- a/media2/media2-widget/src/main/res/values-it/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Off"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Traccia audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nessuna"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocità di riproduzione"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normale"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Traccia <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Traccia <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Traccia <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Titolo del video sconosciuto"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Titolo del brano sconosciuto"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista sconosciuto"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Impossibile riprodurre l\'elemento richiesto"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Indietro"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Torna all\'elenco dei pulsanti precedente"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Visualizza altri pulsanti"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Avanzamento della riproduzione"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Impostazioni"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Sottotitoli attivi. Fai clic per nasconderli."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Sottotitoli non attivi. Fai clic per mostrarli."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Ripeti"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Riproduci"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausa"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Contenuti multimediali precedenti"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Contenuti multimediali successivi"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Torna indietro di 10 secondi"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Vai avanti di 30 secondi"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Schermo intero"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-iw/strings.xml b/media2/media2-widget/src/main/res/values-iw/strings.xml
deleted file mode 100644
index fb4be87..0000000
--- a/media2/media2-widget/src/main/res/values-iw/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"כבויות"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"טראק של אודיו"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"אין"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"מהירות הפעלה"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"רגילה"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"טראק <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"טראק <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"טראק <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"כותרת הסרטון לא ידועה"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"שם השיר לא ידוע"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"אומן לא ידוע"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"לא ניתן להפעיל את הפריט שביקשת"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"אישור"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"חזרה"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"חזרה לרשימת הלחצנים הקודמת"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"הצגת לחצנים נוספים"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"התקדמות ההפעלה"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"הגדרות"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"הכתוביות מופעלות. יש ללחוץ כדי להסתיר אותן."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"הכתוביות כבויות. יש ללחוץ כדי להציג אותן."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"הפעלה מחדש"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"הפעלה"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"השהיה"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"המדיה הקודמת"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"המדיה הבאה"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"הרצה אחורה של 10 שניות"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"דילוג קדימה של 30 שניות"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"מסך מלא"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ja/strings.xml b/media2/media2-widget/src/main/res/values-ja/strings.xml
deleted file mode 100644
index 517392e..0000000
--- a/media2/media2-widget/src/main/res/values-ja/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"OFF"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"音声トラック"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"なし"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"再生速度"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"標準"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"トラック <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"トラック <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"トラック <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"動画タイトルが不明です"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"曲名が不明です"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"アーティストが不明です"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"リクエストしたアイテムを再生できませんでした"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"戻る"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"前のボタンリストに戻る"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"他のボタンを見る"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"再生中です"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"設定"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"字幕は ON です。非表示にするにはクリックしてください。"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"字幕は OFF です。表示するにはクリックしてください。"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"最初から再生"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"再生"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"一時停止"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"前のメディア"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"次のメディア"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 秒ずつ巻き戻します"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 秒早送りします"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"全画面"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ka/strings.xml b/media2/media2-widget/src/main/res/values-ka/strings.xml
index ffc354c..48e2c94 100644
--- a/media2/media2-widget/src/main/res/values-ka/strings.xml
+++ b/media2/media2-widget/src/main/res/values-ka/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"გამორთვა"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"აუდიოჩანაწერი"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"არცერთი"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"დაკვრის სიჩქარე"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ჩვეულებრივი"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ჩანაწერი <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ჩანაწერი <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> — <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ჩანაწერი <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ვიდეოს სათაური უცნობია"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"სიმღერის სათაური უცნობია"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"მუსიკოსი უცნობია"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"მოთხოვნილი ერთეულის დაკვრა ვერ მოხერხდა"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"კარგი"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"უკან"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ღილაკების წინა სიაზე გადასვლა"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"სხვა ღილაკების ნახვა"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"დაკვრის პროგრესი"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"პარამეტრები"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"სუბტიტრი ჩართულია. დასამალად შეეხეთ."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"სუბტიტრი გამორთულია. საჩვენებლად შეეხეთ."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ხელახლა დაკვრა"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"დაკვრა"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"პაუზა"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"წინა მედიაფაილი"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"შემდეგი მედიაფაილი"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 წამით უკან გადახვევა"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 წამით წინ გადახვევა"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"სრულ ეკრანზე"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"გამორთვა"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"აუდიო ჩანაწერი"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"არცერთი"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"დაკვრის სიჩქარე"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"ჩვეულებრივი"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"ჩანაწერი <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"ჩანაწერი <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> — <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"ჩანაწერი <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"ვიდეოს სათაური უცნობია"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"სიმღერის სახელი უცნობია"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"მუსიკოსი უცნობია"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"მოთხოვნილი ერთეულის დაკვრა ვერ მოხერხდა"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"კარგი"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"უკან"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"ღილაკების წინა სიაზე გადასვლა"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"სხვა ღილაკების ნახვა"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"დაკვრის პროგრესი"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"პარამეტრები"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"სუბტიტრი ჩართულია. დასამალად შეეხეთ."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"სუბტიტრი გამორთულია. საჩვენებლად შეეხეთ."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"ხელახლა დაკვრა"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"დაკვრა"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"პაუზა"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"წინა მედიაფაილი"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"შემდეგი მედიაფაილი"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"10 წამით უკან გადახვევა"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"30 წამით წინ გადასვლა"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"სრული ეკრანი"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-kk/strings.xml b/media2/media2-widget/src/main/res/values-kk/strings.xml
deleted file mode 100644
index 5461fe1..0000000
--- a/media2/media2-widget/src/main/res/values-kk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Өшірулі"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Аудиотрек"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Жоқ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Ойнату жылдамдығы"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Қалыпты"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>-аудиотрек"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>-аудиотрек (<xliff:g id="LANG">%2$s</xliff:g>)"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>-аудиотрек"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Белгісіз бейне атауы"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Белгісіз ән атауы"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Белгісіз орындаушы"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Сіз сұраған элемент ойнатылмады."</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Жарайды"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Артқа"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Алдыңғы түймелер тізіміне оралу"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Басқа түймелерді көру"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Ойнату барысы"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Параметрлер"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Субтитр қосулы. Оны жасыру үшін басыңыз."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Субтитр өшірулі. Оны көрсету үшін басыңыз."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Қайта ойнату"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Ойнату"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Кідірту"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Алдыңғы медиафайл"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Келесі медиафайл"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 секунд артқа айналдыру"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 секунд алға айналдыру"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Толық экран"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-km/strings.xml b/media2/media2-widget/src/main/res/values-km/strings.xml
deleted file mode 100644
index 6c64b1c..0000000
--- a/media2/media2-widget/src/main/res/values-km/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"បិទ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ភ្លេង"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"គ្មាន"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ល្បឿន​ចាក់"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ធម្មតា"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"បទលេខ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"បទលេខ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"បទលេខ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"មិនស្គាល់​ចំណងជើងវីដេអូទេ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ចំណងជើងចម្រៀងមិនស្គាល់"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"មិនស្គាល់​សិល្បករទេ"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"មិន​អាច​ចាក់​វីដេអូ ដែលអ្នក​បាន​ស្នើទេ"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"យល់​ព្រម​"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ថយក្រោយ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ត្រឡប់ទៅ​បញ្ជី​ប៊ូតុង​ពីមុនវិញ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"មើលប៊ូតុងច្រើនទៀត"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ការចាក់​កំពុង​ដំណើរការ"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ការកំណត់"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"អក្សររត់ត្រូវបានបើក សូម​ចុច​ដើម្បីលាក់។"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"អក្សររត់ត្រូវបានបិទ សូម​ចុច​ដើម្បីបង្ហាញ។"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ចាក់​ឡើងវិញ"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ចាក់"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ផ្អាក"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"មេឌៀពីមុន"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"មេឌៀបន្ទាប់"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"ខាថយក្រោយ 10 វិនាទី"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"ទៅមុខ​ 30 វិនាទី"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ពេញអេក្រង់"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-kn/strings.xml b/media2/media2-widget/src/main/res/values-kn/strings.xml
index 3277719..45c6209 100644
--- a/media2/media2-widget/src/main/res/values-kn/strings.xml
+++ b/media2/media2-widget/src/main/res/values-kn/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ಆಫ್ ಮಾಡಿ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ಆಡಿಯೊ ಟ್ರ್ಯಾಕ್"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ಯಾವುದೂ ಇಲ್ಲ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ಪ್ಲೇಬ್ಯಾಕ್ ವೇಗ"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ಸಾಮಾನ್ಯ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ಟ್ರ್ಯಾಕ್ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ಟ್ರ್ಯಾಕ್ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ಟ್ರ್ಯಾಕ್ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ವೀಡಿಯೊ ಶೀರ್ಷಿಕೆ ಯಾವುದೆಂದು ಗೊತ್ತಿಲ್ಲ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ಹಾಡಿನ ಶೀರ್ಷಿಕೆ ಯಾವುದೆಂದು ಗೊತ್ತಿಲ್ಲ"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"ಕಲಾವಿದರು ಯಾರೆಂದು ಗೊತ್ತಿಲ್ಲ"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"ನೀವು ವಿನಂತಿಸಿದ ಐಟಂ ಅನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ಸರಿ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ಹಿಂದಕ್ಕೆ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ಹಿಂದಿನ ಬಟನ್ ಪಟ್ಟಿಗೆ ಹಿಂತಿರುಗಿ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"ಇನ್ನಷ್ಟು ಬಟನ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ಪ್ಲೇಬ್ಯಾಕ್ ಪ್ರಗತಿಯಲ್ಲಿದೆ"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"ಉಪಶೀರ್ಷಿಕೆ ಆನ್ ಆಗಿದೆ. ಅದನ್ನು ಮರೆಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"ಉಪಶೀರ್ಷಿಕೆ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು ತೋರಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ಮರುಪ್ಲೇ"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ಪ್ಲೇ ಮಾಡಿ"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ವಿರಾಮಗೊಳಿಸಿ"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"ಹಿಂದಿನ ಮಾಧ್ಯಮ"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"ಮುಂದಿನ ಮಾಧ್ಯಮ"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 ಸೆಕೆಂಡ್‌ಗಳಷ್ಟು ರಿವೈಂಡ್ ಮಾಡಿ"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 ಸೆಕೆಂಡುಗಳಷ್ಟು ಫಾರ್ವರ್ಡ್ ಮಾಡಿ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ಪೂರ್ಣ ಸ್ಕ್ರೀನ್"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"ಆಫ್ ಮಾಡಿ"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"ಆಡಿಯೊ ಟ್ರ್ಯಾಕ್"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"ಯಾವುದೂ ಇಲ್ಲ"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"ಪ್ಲೇಬ್ಯಾಕ್ ವೇಗ"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"ಸಾಮಾನ್ಯ"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"ಟ್ರ್ಯಾಕ್ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"ಟ್ರ್ಯಾಕ್ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"ಟ್ರ್ಯಾಕ್ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"ವೀಡಿಯೊ ಶೀರ್ಷಿಕೆ ಏನೆಂದು ಗೊತ್ತಿಲ್ಲ"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"ಹಾಡಿನ ಶೀರ್ಷಿಕೆ ಏನೆಂದು ಗೊತ್ತಿಲ್ಲ"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"ಕಲಾವಿದರು ಯಾರೆಂದು ಗೊತ್ತಿಲ್ಲ"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"ನೀವು ವಿನಂತಿಸಿದ ಐಟಂ ಅನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"ಸರಿ"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"ಹಿಂದಕ್ಕೆ"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"ಹಿಂದಿನ ಬಟನ್ ಪಟ್ಟಿಗೆ ಹಿಂದಿರುಗಿ"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"ಇನ್ನಷ್ಟು ಬಟನ್‌ಗಳನ್ನು ನೋಡಿ"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"ಪ್ಲೇಬ್ಯಾಕ್‌ನ ಪ್ರಗತಿ"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"ಸಬ್‌ಟೈಟಲ್ ಆನ್ ಆಗಿದೆ. ಅದನ್ನು ಮರೆಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"ಸಬ್‌ಟೈಟಲ್ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು ತೋರಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"ಮರುಪ್ಲೇ ಮಾಡಿ"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"ಪ್ಲೇ ಮಾಡಿ"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"ವಿರಾಮಗೊಳಿಸಿ"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"ಹಿಂದಿನ ಮಾಧ್ಯಮ"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"ಮುಂದಿನ ಮಾಧ್ಯಮ"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"10 ಸೆಕೆಂಡ್‌ಗಳಷ್ಟು ಹಿಂದಕ್ಕೆ ಹೋಗಿ"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"30 ಸೆಕೆಂಡ್‌ಗಳಷ್ಟು ಮುಂದಕ್ಕೆ ಹೋಗಿ"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"ಪೂರ್ಣ ಸ್ಕ್ರೀನ್"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-ko/strings.xml b/media2/media2-widget/src/main/res/values-ko/strings.xml
deleted file mode 100644
index c22e7c3..0000000
--- a/media2/media2-widget/src/main/res/values-ko/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"끄기"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"오디오 트랙"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"없음"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"재생 속도"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"보통"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"트랙 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"트랙 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"트랙 <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"동영상 제목 알 수 없음"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"노래 제목 알 수 없음"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"아티스트 알 수 없음"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"요청한 항목을 재생할 수 없습니다."</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"확인"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"뒤로"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"이전 버튼 목록으로 돌아가기"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"버튼 더보기"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"재생 진행률"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"설정"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"자막이 켜져 있습니다. 자막을 숨기려면 클릭하세요."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"자막이 꺼져 있습니다. 자막을 표시하려면 클릭하세요."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"다시 재생"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"재생"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"일시중지"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"이전 미디어"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"다음 미디어"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10초 되감기"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30초 앞으로 이동"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"전체 화면"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ky/strings.xml b/media2/media2-widget/src/main/res/values-ky/strings.xml
deleted file mode 100644
index 09861346..0000000
--- a/media2/media2-widget/src/main/res/values-ky/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Өчүк"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Аудио трек"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Жок"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Ойнотуу ылдамдыгы"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Орточо"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>-трек"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>-трек - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>-трек"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Видеонун аталышы белгисиз"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Ырдын аталышы белгисиз"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Аткаруучу белгисиз"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Сиз сураган нерсе ойнотулбай койду"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ЖАРАЙТ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Артка"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Мурунку баскыч тизмесине кайтуу"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Дагы баскычтарды көрүү"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Ойнотуу көрсөткүчү"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Жөндөөлөр"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Коштомо жазуу күйүк. Жашыруу үчүн чыкылдатыңыз."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Коштомо жазуу өчүк. Аны көрсөтүү үчүн чыкылдатыңыз."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Кайра ойноотуу"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Ойнотуу"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Тындыруу"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Мурунку медиа"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Кийинки медиа"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 секунд артка түрдүрүү"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 секунд алдыга түрдүрүү"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Толук экран"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-lo/strings.xml b/media2/media2-widget/src/main/res/values-lo/strings.xml
deleted file mode 100644
index 606e633..0000000
--- a/media2/media2-widget/src/main/res/values-lo/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ປິດ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ແທຣັກສຽງ"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ບໍ່ມີ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ຄວາມໄວການສາຍ"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ທຳມະດາ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ແທຣັກ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ແທຣັກ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ແທຣັກ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ບໍ່ຮູ້ຊື່ວິດີໂອ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ບໍ່ຮູ້ຈັກຊື່ເພງ"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"ບໍ່ຮູ້ຈັກສິນລະປິນ"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"ບໍ່ສາມາດຫຼິ້ນລາຍການທີ່ທ່ານຮ້ອງຂໍໄວ້"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ຕົກລົງ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ກັບຄືນ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ກັບໄປທີ່ລາຍຊື່ປຸ່ມກ່ອນໜ້າ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"ເບິ່ງປຸ່ມເພີ່ມເຕີມ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ສະຖານະການຫຼິ້ນ"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ການຕັ້ງຄ່າ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"ເປີດຄຳແປແລ້ວ. ຄລິກເພື່ອເຊື່ອງມັນ."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"ຄຳແປປິດຢູ່. ຄລິກເພື່ອສະແດງມັນ."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ສາຍຄືນໃໝ່"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ຫຼິ້ນ"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ຢຸດຊົ່ວຄາວ"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"ມີເດຍຜ່ານມາ"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"ມີເດຍຕໍ່ໄປ"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"ກັບຫຼັງ 10 ວິນາທີ"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"ເລື່ອນໄປໜ້າ 30 ວິນາທີ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ເຕັມຈໍ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-lt/strings.xml b/media2/media2-widget/src/main/res/values-lt/strings.xml
deleted file mode 100644
index f0976fc..0000000
--- a/media2/media2-widget/src/main/res/values-lt/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Išjungti"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Garso takelis"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nėra"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Atkūrimo sparta"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Įprasta"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g> takelis"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g> takelis – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g> takelis"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Nežinomas vaizdo įrašo pavadinimas"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Nežinomas dainos pavadinimas"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Nežinomas atlikėjas"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Nepavyko paleisti elemento, dėl kurio pateikėte užklausą"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Gerai"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Atgal"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Atgal į ankstesnių mygtukų sąrašas"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Žr. daugiau mygtukų"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Atkūrimo eiga"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Nustatymai"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitrai įjungti. Spustelėkite, kad jie būtų slepiami."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitrai išjungti. Spustelėkite, kad jie būtų rodomi."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Pakartoti"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Leisti"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pristabdyti"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Ankstesnis medijos elementas"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Kitas medijos elementas"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Atsukti atgal 10 sek."</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Persukti pirmyn 30 sek."</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Visas ekranas"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-lv/strings.xml b/media2/media2-widget/src/main/res/values-lv/strings.xml
deleted file mode 100644
index ad41fd91..0000000
--- a/media2/media2-widget/src/main/res/values-lv/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Izslēgti"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio ieraksts"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nav"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Atskaņošanas ātrums"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normāls"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. ieraksts"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. ieraksts – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. ieraksts"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Nezināms video nosaukums"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Nezināms dziesmas nosaukums"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Nezināms izpildītājs"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Nevarēja atskaņot pieprasīto vienumu."</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Labi"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Atpakaļ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Atpakaļ uz iepriekšējo pogu sarakstu"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Skatīt citas pogas"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Atskaņošanas norise"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Iestatījumi"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitri ir ieslēgti. Noklikšķiniet, lai tos paslēptu."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitri ir izslēgti. Noklikšķiniet, lai tos parādītu."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Atskaņot vēlreiz"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Atskaņot"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Apturēt"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Iepriekšējais multivides vienums"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Nākamais multivides vienums"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Attīt atpakaļ par 10 sekundēm"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Pāriet 30 sekundes uz priekšu"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pilnekrāna režīms"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-mk/strings.xml b/media2/media2-widget/src/main/res/values-mk/strings.xml
deleted file mode 100644
index 116cb176..0000000
--- a/media2/media2-widget/src/main/res/values-mk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Исклучено"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Аудиозапис"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Нема"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Брзина на репродукцијата"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Нормално"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Песна <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Песна <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Песна <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Непознат наслов на видео"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Непознат наслов на песна"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Непознат изведувач"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Не може да се пушти ставката што ја побаравте"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Во ред"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Назад"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Назад кон списокот со претходното копче"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Прикажи повеќе копчиња"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Напредок на репродукцијата"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Поставки"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Титлот е вклучен. Кликнете за да го скриете."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Титлот е исклучен. Кликнете за да го прикажете."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Пушти повторно"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Пушти"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Пауза"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Претходни содржини"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Следна содржина"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Премотајте 10 секунди наназад"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Премотајте 30 секунди нанапред"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Цел екран"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ml/strings.xml b/media2/media2-widget/src/main/res/values-ml/strings.xml
deleted file mode 100644
index d2cbbfe..0000000
--- a/media2/media2-widget/src/main/res/values-ml/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ഓഫ്"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ഓഡിയോ ട്രാക്ക്"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ഒന്നുമില്ല"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"പ്ലേബാക്ക് വേഗത"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"സാധാരണ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ട്രാക്ക് <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ട്രാക്ക് <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ട്രാക്ക് <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"വീഡിയോയുടെ പേര് അജ്ഞാതം"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"പാട്ടിൻ്റെ പേര് അജ്ഞാതം"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"അജ്ഞാത ആർട്ടിസ്‌റ്റ്"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"നിങ്ങൾ അഭ്യർത്ഥിച്ച ഇനം പ്ലേ ചെയ്യാനായില്ല"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ശരി"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"പിന്നോട്ട്"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"മുമ്പത്തെ ബട്ടൺ ലിസ്‌റ്റിലേക്ക് പോവുക"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"കൂടുതൽ ബട്ടണുകൾ കാണുക"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"പ്ലേബാക്ക് പുരോഗതി"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ക്രമീകരണം"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"സബ്‌ടൈറ്റിൽ ഓണാണ്. അത് മറയ്‌ക്കാൻ ക്ലിക്ക് ചെയ്യുക."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"സബ്‌ടൈറ്റിൽ ഓഫാണ്. അത് കാണിക്കാൻ ക്ലിക്ക് ചെയ്യുക."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"വീണ്ടും പ്ലേ ചെയ്യുക"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"പ്ലേ ചെയ്യുക"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"തൽക്കാലം നിർത്തുക"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"മുമ്പത്തെ മീഡിയ"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"അടുത്ത മീഡിയ"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 സെക്കൻഡ് പിന്നോട്ട് പോവുക"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 സെക്കൻഡ് മുന്നോട്ട് പോവുക"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"പൂർണ്ണ സ്‌ക്രീൻ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-mn/strings.xml b/media2/media2-widget/src/main/res/values-mn/strings.xml
deleted file mode 100644
index ed6e42f..0000000
--- a/media2/media2-widget/src/main/res/values-mn/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Унтраалттай"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Аудио зам"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Хоосон"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Дахин тоглуулах хурд"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Хэвийн"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Бичлэг <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Бичлэг <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Бичлэг <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Видеоны нэр тодорхойгүй"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Дууны нэр тодорхойгүй"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Уран бүтээлч тодорхойгүй"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Таны хүсэлт тавьсан зүйлийг тоглуулж чадсангүй"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Буцах"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Өмнөх товчлуурын жагсаалт руу буцах"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Бусад товчлуурыг харах"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Дахин тоглуулах явц"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Тохиргоо"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Хадмал асаалттай байна. Үүнийг нуухын тулд товшино уу."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Хадмал унтраалттай байна. Үүнийг харуулахын тулд товшино уу."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Дахин тоглуулах"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Тоглуулах"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Түр зогсоох"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Өмнөх медиа"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Дараах медиа"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 секундээр ухраах"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 секундээр урагшлуулах"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Бүтэн дэлгэц"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-mr/strings.xml b/media2/media2-widget/src/main/res/values-mr/strings.xml
deleted file mode 100644
index 53f4a21..0000000
--- a/media2/media2-widget/src/main/res/values-mr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"बंद"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ऑडिओ ट्रॅक"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"काहीही नाही"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"प्लेबॅकचा वेग"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"साधारण"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ट्रॅक <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ट्रॅक <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ट्रॅक <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"व्हिडिओचे शीर्षक अज्ञात"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"गाण्याचे शीर्षक अज्ञात"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"अज्ञात कलाकार"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"तुम्ही विनंती केलेला आयटम प्ले करणे शक्य झाले नाही"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ओके"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"परत"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"मागील बटण सूचीवर परत जा"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"आणखी बटण पाहा"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"प्लेबॅक प्रगती"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"सेटिंग्ज"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"सबटायटल सुरू आहे. ते लपवण्यासाठी क्लिक करा."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"सबटायटल बंद आहे. ते दाखवण्यासाठी क्लिक करा."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"रीप्ले करा"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"प्ले करा"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"थांबवा"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"मागील मीडिया"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"पुढील मीडिया"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"दहा सेकंदांनी मागे जा"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"३० सेकंदांनी पुढे जा"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"फुल स्क्रीन"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ms/strings.xml b/media2/media2-widget/src/main/res/values-ms/strings.xml
deleted file mode 100644
index c462b92..0000000
--- a/media2/media2-widget/src/main/res/values-ms/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Mati"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Runut audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Tiada"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Kelajuan main balik"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Biasa"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Lagu <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Runut <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Lagu <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Tajuk video tidak diketahui"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Tajuk lagu tidak diketahui"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artis tidak diketahui"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Tidak dapat memainkan item yang anda minta"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Kembali"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Kembali ke senarai butang terdahulu"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Lihat lagi butang"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Kemajuan main balik"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Tetapan"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Sari kata dihidupkan. Klik untuk menyembunyikan sari kata."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Sari kata dimatikan. Klik untuk menunjukkan sari kata."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Main semula"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Main"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Jeda"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Media sebelumnya"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Media seterusnya"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Mandir 10 saat"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Maju ke hadapan sebanyak 30 saat"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Skrin penuh"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-my/strings.xml b/media2/media2-widget/src/main/res/values-my/strings.xml
deleted file mode 100644
index a52e85a..0000000
--- a/media2/media2-widget/src/main/res/values-my/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ပိတ်ထားသည်"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"သီချင်း"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"တစ်ခုမျှမဟုတ်"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ဗီဒီယို အမြန်နှုန်း"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ပုံမှန်"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"အပုဒ်ရေ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"အပုဒ်ရေ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"အပုဒ်‌ရေ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ဗီဒီယိုခေါင်းစဉ်ကို မသိပါ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"အမည်မသိ သီချင်းခေါင်းစဉ်"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"အမည်မသိ အနုပညာရှင်"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"သင်တောင်းဆိုထားသည့်အရာကို ဖွင့်၍မရပါ"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"နောက်သို့"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ယခင်ခလုတ်စာရင်းသို့ ပြန်သွားရန်"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"နောက်ထပ်ခလုတ်များကို ကြည့်ရန်"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"သီချင်းဖွင့်မှု အနေအထား"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ဆက်တင်များ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"စာတန်းထိုးကို ဖွင့်ထားသည်။ ၎င်းကိုဝှက်ရန် နှိပ်ပါ။"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"စာတန်းထိုးကို ပိတ်ထားသည်။ ၎င်းကိုကြည့်ရန် နှိပ်ပါ။"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ပြန်ဖွင့်ရန်"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ဖွင့်ရန်"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ခဏရပ်ရန်"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"ပြီးခဲ့သည့်တစ်ခု"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"နောက်တစ်ခု"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"နောက်သို့ ၁၀ စက္ကန့် ပြန်ရစ်ရန်"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"အရှေ့သို့ စက္ကန့် ၃၀ ရစ်ရန်"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"မျက်နှာပြင်အပြည့်"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-nb/strings.xml b/media2/media2-widget/src/main/res/values-nb/strings.xml
deleted file mode 100644
index 20d3a2e..0000000
--- a/media2/media2-widget/src/main/res/values-nb/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Av"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Lydspor"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ingen"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Avspillingshastighet"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Spor <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Spor <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Spor <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Ukjent videotittel"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Ukjent sangtittel"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Ukjent artist"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Kunne ikke spille av elementet du har bedt om"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Tilbake"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Tilbake til forrige knappeliste"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Se flere knapper"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Avspillingsfremdrift"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Innstillinger"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Undertekster er på. Klikk for å skjule dem."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Undertekster er av. Klikk for å vise dem."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Spill om igjen"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Spill av"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Sett på pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Forrige media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Neste media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Spol tilbake 10 sekunder"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Gå 30 sekunder fremover"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Fullskjerm"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ne/strings.xml b/media2/media2-widget/src/main/res/values-ne/strings.xml
deleted file mode 100644
index cd5ba75..0000000
--- a/media2/media2-widget/src/main/res/values-ne/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"अफ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"अडियो ट्र्याक"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"कुनै पनि होइन"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"प्लेब्याकको गति"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"साधारण"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ट्र्याक <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ट्र्याक <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ट्र्याक <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"भिडियोको शीर्षक अज्ञात"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"गीतको शीर्षक अज्ञात"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"कलाकारको नाम अज्ञात"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"तपाईंले अनुरोध गर्नुभएको वस्तु प्ले गर्न सकिएन"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ठिक छ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"पछाडि जानुहोस्"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"बटनको अघिल्लो सूचीमा फर्कनुहोस्"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"थप बटनहरू हेर्नुहोस्"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"प्लेब्याकको प्रगति"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"सेटिङ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"उपशीर्षक सक्रिय छ। यसलाई लुकाउन क्लिक गर्नुहोस्।"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"उपशीर्षक निष्क्रिय छ। यसलाई देखाउन क्लिक गर्नुहोस्।"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"रिप्ले गर्नुहोस्"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"प्ले गर्नुहोस्"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"पज गर्नुहोस्"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"अघिल्लो मिडिया"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"अर्को मिडिया"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"१० सेकेन्ड रिवाइन्ड गर्नुहोस्"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"३० सेकेन्ड अघि जानुहोस्"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"फुल स्क्रिन"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-nl/strings.xml b/media2/media2-widget/src/main/res/values-nl/strings.xml
index 17e6d83..19b7ae8 100644
--- a/media2/media2-widget/src/main/res/values-nl/strings.xml
+++ b/media2/media2-widget/src/main/res/values-nl/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Uit"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audiotrack"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Geen"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Afspeelsnelheid"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normaal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Titel van video onbekend"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Titel van nummer onbekend"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artiest onbekend"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Kan het gevraagde item niet afspelen"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Terug"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Terug naar vorige lijst met knoppen"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Meer knoppen bekijken"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Afspeelvoortgang"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Instellingen"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Ondertiteling is ingeschakeld. Klik om deze te verbergen."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Ondertiteling is uitgeschakeld. Klik om deze weer te geven."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Opnieuw afspelen"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Afspelen"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Onderbreken"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Vorige media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Volgende media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Tien seconden terugspoelen"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Dertig seconden vooruitgaan"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Volledig scherm"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Uit"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Audiotrack"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Geen"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Afspeelsnelheid"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normaal"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Titel van video onbekend"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Titel van nummer onbekend"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Artiest onbekend"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Kan het gevraagde item niet afspelen"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"OK"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Terug"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Terug naar vorige knoppenlijst"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"Meer knoppen bekijken"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Afspeelvoortgang"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Instellingen"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Ondertiteling aan. Klik om te verbergen."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Ondertiteling uit. Klik om te tonen."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Opnieuw afspelen"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Afspelen"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Pauzeren"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Vorige media"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Volgende media"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"10 seconden terugspoelen"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"30 seconden vooruitgaan"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Volledig scherm"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-or/strings.xml b/media2/media2-widget/src/main/res/values-or/strings.xml
deleted file mode 100644
index b930eb5..0000000
--- a/media2/media2-widget/src/main/res/values-or/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ବନ୍ଦ ଅଛି"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ଅଡିଓ ଟ୍ରାକ୍"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"କିଛି ନାହିଁ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ପ୍ଲେବ୍ୟାକ୍‌ର ସ୍ପିଡ୍"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ସାଧାରଣ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ଟ୍ରାକ୍ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ଟ୍ରାକ୍ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ଟ୍ରାକ୍ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ଭିଡିଓର ଟାଇଟେଲ୍ ଅଜଣା ଅଟେ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ଗୀତର ଟାଇଟେଲ୍ ଅଜଣା ଅଟେ"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"ଅଜଣା କଳାକାର"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"ଆପଣ ଅନୁରୋଧ କରିଥିବା ଆଇଟମ୍ ଚଲାଯାଇପାରିଲା ନାହିଁ"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ଠିକ୍ ଅଛି"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ପଛକୁ ଫେରନ୍ତୁ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ପୂର୍ବବର୍ତ୍ତୀ ବଟନ୍ ତାଲିକାକୁ ଫେରିଯାଆନ୍ତୁ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"ଅଧିକ ବଟନ୍ ଦେଖନ୍ତୁ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ପ୍ଲେବ୍ୟାକ୍‌ର ପ୍ରଗତି"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ସେଟିଂସ୍"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"ସବ୍‌ଟାଇଟେଲ୍ ଚାଲୁ ଅଛି। ଏହାକୁ ଲୁଚାଇବା ପାଇଁ କ୍ଲିକ୍ କରନ୍ତୁ।"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"ସବ୍‌ଟାଇଟେଲ୍ ବନ୍ଦ ଅଛି। ଏହାକୁ ଦେଖାଇବା ପାଇଁ କ୍ଲିକ୍ କରନ୍ତୁ।"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ପୁଣି ଚଲାନ୍ତୁ"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ଚଲାନ୍ତୁ"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ବିରତ କରନ୍ତୁ"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"ପୂର୍ବବର୍ତ୍ତୀ ମିଡିଆ"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"ପରବର୍ତ୍ତୀ ମିଡିଆ"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 ସେକେଣ୍ଡ ପଛକୁ ଯାଆନ୍ତୁ"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 ସେକେଣ୍ଡ ଆଗକୁ ଯାଆନ୍ତୁ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-pa/strings.xml b/media2/media2-widget/src/main/res/values-pa/strings.xml
deleted file mode 100644
index ebcd6fc..0000000
--- a/media2/media2-widget/src/main/res/values-pa/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ਬੰਦ"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ਆਡੀਓ ਟਰੈਕ"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ਕੋਈ ਨਹੀਂ"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ਚਲਾਉਣ ਦੀ ਗਤੀ"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ਸਧਾਰਨ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ਟਰੈਕ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ਟਰੈਕ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ਟਰੈਕ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ਅਗਿਆਤ ਵੀਡੀਓ ਸਿਰਲੇਖ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ਅਗਿਆਤ ਗੀਤ ਸਿਰਲੇਖ"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"ਕਲਾਕਾਰ ਅਗਿਆਤ ਹੈ"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਬੇਨਤੀ ਕੀਤੀ ਗਈ ਆਈਟਮ ਨਹੀਂ ਚਲਾਈ ਜਾ ਸਕੀ"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ਠੀਕ ਹੈ"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ਪਿੱਛੇ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"ਪਿਛਲੀ ਬਟਨ ਸੂਚੀ \'ਤੇ ਵਾਪਸ ਜਾਓ"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"\'ਹੋਰ ਦੇਖੋ\' ਬਟਨ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ਪਲੇਬੈਕ ਪ੍ਰਗਤੀ"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ਸੈਟਿੰਗਾਂ"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"ਉਪਸਿਰਲੇਖ ਚਾਲੂ ਹੈ। ਇਸਨੂੰ ਲੁਕਾਉਣ ਲਈ ਕਲਿੱਕ ਕਰੋ।"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"ਉਪਸਿਰਲੇਖ ਬੰਦ ਹੈ। ਇਸਨੂੰ ਦਿਖਾਉਣ ਲਈ ਕਲਿੱਕ ਕਰੋ।"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"ਮੁੜ ਚਲਾਓ"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ਚਲਾਓ"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"ਰੋਕੋ"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"ਪਿਛਲਾ ਮੀਡੀਆ"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"ਅਗਲਾ ਮੀਡੀਆ"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 ਸਕਿੰਟ ਪਿੱਛੇ ਕਰੋ"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 ਸਕਿੰਟ ਅੱਗੇ ਜਾਓ"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"ਪੂਰੀ-ਸਕ੍ਰੀਨ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-pl/strings.xml b/media2/media2-widget/src/main/res/values-pl/strings.xml
index 2174db0..8815f25 100644
--- a/media2/media2-widget/src/main/res/values-pl/strings.xml
+++ b/media2/media2-widget/src/main/res/values-pl/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Wył."</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Ścieżka audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Brak"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Szybkość odtwarzania"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normalna"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Ścieżka <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Ścieżka <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Ścieżka <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Nieznany tytuł filmu"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Nieznany tytuł utworu"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Nieznany wykonawca"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Nie można odtworzyć żądanego elementu"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Wstecz"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Wróć do poprzedniej listy przycisków"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Pokaż więcej przycisków"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Postęp odtwarzania"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Ustawienia"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Napisy są włączone. Kliknij, by je ukryć."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Napisy są wyłączone. Kliknij, by je wyświetlać."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Odtwórz ponownie"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Odtwórz"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Wstrzymaj"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Poprzedni plik multimedialny"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Następny plik multimedialny"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Przewiń do tyłu o 10 sekund"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Przejdź o 30 sekund do przodu"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Pełny ekran"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Wyłączono"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Ścieżka audio"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Brak"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Szybkość odtwarzania"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normalna"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Utwór <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Utwór <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Utwór <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Nieznany tytuł filmu"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Nieznany tytuł utworu"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Nieznany wykonawca"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Nie można odtworzyć wybranego elementu"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"OK"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Wstecz"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Wróć do poprzedniej listy przycisków"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"Pokaż więcej przycisków"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Postęp odtwarzania"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Ustawienia"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Napisy są włączone. Kliknij, by je ukryć."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Napisy są wyłączone. Kliknij, by je wyświetlać."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Odtwórz ponownie"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Odtwórz"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Wstrzymaj"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Poprzedni plik multimedialny"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Następny plik multimedialny"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Przewiń do tyłu o 10 sekund"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Przejdź o 30 sekund do przodu"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Pełny ekran"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-pt-rBR/strings.xml b/media2/media2-widget/src/main/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 13a817a..0000000
--- a/media2/media2-widget/src/main/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desativado"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Faixa de áudio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nenhum"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocidade da reprodução"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Faixa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Faixa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>: <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Faixa <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Título do vídeo desconhecido"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Título da música desconhecido"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista desconhecido"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Não foi possível abrir o item solicitado"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Voltar"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Voltar à lista de botões anterior"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ver mais botões"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Andamento da reprodução"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Configurações"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"As legendas estão ativadas. Clique para ocultá-las."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"As legendas estão desativadas. Clique para exibi-las."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Repetir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Tocar"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausar"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Mídia anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Próxima mídia"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Retroceder 10 segundos"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avançar 30 segundos"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Tela cheia"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-pt-rPT/strings.xml b/media2/media2-widget/src/main/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 697f595..0000000
--- a/media2/media2-widget/src/main/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desativado"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Faixa de áudio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nenhuma"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocidade de reprodução"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Faixa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Faixa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Faixa <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Título do vídeo desconhecido"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Título da música desconhecido"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista desconhecido"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Não foi possível reproduzir o item solicitado."</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Anterior"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Voltar à lista de botões anterior"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ver mais botões"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progresso da reprodução"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Definições"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"As legendas estão ativadas. Clique para as ocultar."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"As legendas estão desativadas. Clique para as mostrar."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Repetir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Reproduzir"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausar"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Conteúdo multimédia anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Conteúdo multimédia seguinte"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Recuar 10 segundos"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avançar 30 segundos"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Ecrã inteiro"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-pt/strings.xml b/media2/media2-widget/src/main/res/values-pt/strings.xml
deleted file mode 100644
index 13a817a..0000000
--- a/media2/media2-widget/src/main/res/values-pt/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Desativado"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Faixa de áudio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Nenhum"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Velocidade da reprodução"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Faixa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Faixa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>: <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Faixa <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Título do vídeo desconhecido"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Título da música desconhecido"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artista desconhecido"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Não foi possível abrir o item solicitado"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Voltar"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Voltar à lista de botões anterior"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ver mais botões"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Andamento da reprodução"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Configurações"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"As legendas estão ativadas. Clique para ocultá-las."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"As legendas estão desativadas. Clique para exibi-las."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Repetir"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Tocar"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausar"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Mídia anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Próxima mídia"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Retroceder 10 segundos"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Avançar 30 segundos"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Tela cheia"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ro/strings.xml b/media2/media2-widget/src/main/res/values-ro/strings.xml
deleted file mode 100644
index 5b20984..0000000
--- a/media2/media2-widget/src/main/res/values-ro/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Dezactivat"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Înregistrare audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Fără"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Viteza de redare"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Melodia <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Melodia <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Melodia <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Titlul videoclipului este necunoscut"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Titlul melodiei este necunoscut"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artist necunoscut"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Articolul solicitat nu a putut fi redat"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Înapoi"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Înapoi la lista anterioară de butoane"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Vedeți mai multe butoane"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progresul redării"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Setări"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Subtitrarea este activată. Dați clic pentru a o ascunde."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Subtitrarea este dezactivată. Dați clic pentru a o afișa."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Redați din nou"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Redați"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Întrerupeți"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Conținutul media anterior"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Conținutul media următor"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Derulați înapoi zece secunde"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Derulați înainte 30 de secunde"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Ecran complet"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ru/strings.xml b/media2/media2-widget/src/main/res/values-ru/strings.xml
deleted file mode 100644
index 324114f..0000000
--- a/media2/media2-widget/src/main/res/values-ru/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Отключено"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Трек"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Нет текста"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Скорость воспроизведения"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Обычная"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Трек <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Трек <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. Язык: <xliff:g id="LANG">%2$s</xliff:g>."</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Трек <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Без названия"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Без названия"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Неизвестный исполнитель"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Не удалось воспроизвести выбранное видео."</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ОК"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Назад"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Вернуться к предыдущему списку кнопок"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Ещё кнопки"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Воспроизведение"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Настройки"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Субтитры включены. Нажмите, чтобы скрыть их."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Субтитры выключены. Нажмите, чтобы включить их."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Повторить"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Воспроизвести"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Приостановить"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Перейти к предыдущему медиафайлу"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Перейти к следующему медиафайлу"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Перемотать на 10 секунд назад"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Перемотать на 30 секунд вперед"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Полноэкранный режим"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-si/strings.xml b/media2/media2-widget/src/main/res/values-si/strings.xml
index 45d7d9a..01a49b3 100644
--- a/media2/media2-widget/src/main/res/values-si/strings.xml
+++ b/media2/media2-widget/src/main/res/values-si/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ක්‍රියාවිරහිතයි"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ශ්‍රව්‍ය ඛණ්ඩය"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"කිසිවක් නැත"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"පසුධාවන වේගය"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"සාමාන්‍ය"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ශ්‍රව්‍ය ඛණ්ඩය <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"සංගීත ඛණ්ඩය <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ශ්‍රව්‍ය ඛණ්ඩය <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"වීඩියෝ මාතෘකාව නොදනී"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ගීතයේ මාතෘකාව නොදනී"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"කලාකරු නොදනී"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"ඔබ ඉල්ලූ අයිතමය වාදනය කළ නොහැකි විය"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"හරි"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"ආපසු"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"පෙර බොත්තම් ලැයිස්තුවට ආපසු"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"තව බොත්තම් බලන්න"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"පසුධාවන ප්‍රගතිය"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"සැකසීම්"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"උපසිරැසි ක්‍රියාත්මකයි. එය සැඟවීමට ක්ලික් කරන්න."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"උපසිරැසි ක්‍රියාවිරහිතයි. එය පෙන්වීමට ක්ලික් කරන්න."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"යළි වාදනය"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"වාදනය"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"විරාමය"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"පෙර මාධ්‍ය"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"මීළඟ මාධ්‍යය"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"තත්පර 10කින් ආපස්සට"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"තත්පර 30කින් ඉදිරියට යන්න"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"පූර්ණ තිරය"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"ක්‍රියාවිරහිතයි"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"ශ්‍රව්‍ය ඛණ්ඩය"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"කිසිවක් නැත"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"පසුධාවන වේගය"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"සාමාන්‍ය"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g> ඛණ්ඩය"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g> ඛණ්ඩය - <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g> ඛණ්ඩය"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"වීඩියෝ මාතෘකාව නොදනී"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"ගීතයේ මාතෘකාව නොදනී"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"කලාකරු නොදනී"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"ඔබ ඉල්ලූ අයිතමය වාදනය කළ නොහැකි විය"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"හරි"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"ආපසු"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"පෙර බොත්තම් ලැයිස්තුවට ආපසු"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"තව බොත්තම් බලන්න"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"පසුධාවන ප්‍රගතිය"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"සැකසීම්"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"උපසිරැසි ක්‍රියාත්මකයි. එය සැඟවීමට ක්ලික් කරන්න."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"උපසිරැසි ක්‍රියාවිරහිතයි. එය පෙන්වීමට ක්ලික් කරන්න."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"යළි වාදනය කරන්න"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"වාදනය කරන්න"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"විරාම ගන්වන්න"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"පෙර මාධ්‍යය"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"ඊලඟ මාධ්‍යය"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"තත්පර 10කින් ආපස්සට"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"තත්පර 30කින් ඉදිරියට යන්න"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"පූර්ණ තිරය"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-sk/strings.xml b/media2/media2-widget/src/main/res/values-sk/strings.xml
deleted file mode 100644
index 1afb388..0000000
--- a/media2/media2-widget/src/main/res/values-sk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Vypnuté"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Zvuková stopa"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Žiadna"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Rýchlosť prehrávania"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normálna"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. verzia titulkov"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. verzia titulkov – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. stopa"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Neznámy názov videa"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Neznámy názov skladby"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Neznámy interpret"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Požadovanú položku sa nepodarilo prehrať"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Späť"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Späť na predchádzajúci zoznam tlačidiel"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Zobraziť ďalšie tlačidlá"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Priebeh prehrávania"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Nastavenia"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Titulky sú zapnuté. Skryjete ich kliknutím."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Titulky sú vypnuté. Zobrazíte ich kliknutím."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Prehrať znova"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Prehrať"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pozastaviť"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Predchádzajúce médiá"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Ďalšie médiá"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Pretočiť o 10 sekúnd dozadu"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Prejsť o 30 sekúnd vpred"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Celá obrazovka"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-sl/strings.xml b/media2/media2-widget/src/main/res/values-sl/strings.xml
deleted file mode 100644
index 4afb60c..0000000
--- a/media2/media2-widget/src/main/res/values-sl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Izklopljeno"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Zvočni posnetek"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Brez"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Hitrost predvajanja"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Običajno"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Podnapis <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Podnapis <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Skladba <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Neznan naslov videoposnetka"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Neznan naslov skladbe"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Neznan izvajalec"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Želene vsebine ni bilo mogoče predvajati"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"V redu"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Nazaj"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Nazaj na prejšnji seznam gumbov"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Prikaži več gumbov"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Potek predvajanja"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Nastavitve"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Podnapisi so vklopljeni. Kliknite, če jih želite skriti."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Podnapisi so izklopljeni. Kliknite, če jih želite prikazati."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Znova predvajaj"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Predvajaj"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Začasno zaustavi"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Prejšnja predstavnostna vsebina"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Naslednja predstavnostna vsebina"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Pomik nazaj za 10 sekund"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Pomik naprej za 30 sekund"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Celozaslonsko"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-sq/strings.xml b/media2/media2-widget/src/main/res/values-sq/strings.xml
index 30ef773..bbac7b6 100644
--- a/media2/media2-widget/src/main/res/values-sq/strings.xml
+++ b/media2/media2-widget/src/main/res/values-sq/strings.xml
@@ -17,33 +17,33 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Joaktiv"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Pjesë audio"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Asnjë"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Shpejtësia e luajtjes"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normale"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Kënga <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Pjesa muzikore <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Kënga <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Titulli i videos i panjohur"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Titulli i këngës i panjohur"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Artisti i panjohur"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Artikulli i kërkuar nuk mund të luhej"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Në rregull"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Pas"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Kthehu te lista e butonave të mëparshëm"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Shiko më shumë butona"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progresi i luajtjes"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Cilësimet"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Titrat janë aktive. Kliko për t\'i fshehur."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Titrat janë joaktive. Kliko për t\'i shfaqur."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Riluaj"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Luaj"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pauzë"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Media e mëparshme"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Media tjetër"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rikthe me 10 sekonda"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Shko përpara me 30 sekonda"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Ekrani i plotë"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Joaktiv"</string>
+    <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Pjesë audio"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Asnjë"</string>
+    <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Shpejtësia e luajtjes"</string>
+    <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normal"</string>
+    <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
+    <string name="MediaControlView_subtitle_track_number_text" msgid="2241078077382492349">"Kënga <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
+    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="2268860463481696609">"Pjesa muzikore <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
+    <string name="MediaControlView_audio_track_number_text" msgid="4263103361854223806">"Kënga <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
+    <string name="mcv2_non_music_title_unknown_text" msgid="2032814146738922144">"Titulli i videos i panjohur"</string>
+    <string name="mcv2_music_title_unknown_text" msgid="6037645626002038645">"Titulli i këngës i panjohur"</string>
+    <string name="mcv2_music_artist_unknown_text" msgid="5393558204040775454">"Artisti i panjohur"</string>
+    <string name="mcv2_playback_error_text" msgid="6061787693725630293">"Artikulli i kërkuar nuk mund të luhej"</string>
+    <string name="mcv2_error_dialog_button" msgid="5940167897992933850">"Në rregull"</string>
+    <string name="mcv2_back_button_desc" msgid="1540894858499118373">"Pas"</string>
+    <string name="mcv2_overflow_left_button_desc" msgid="2749567167276435888">"Kthehu te lista e butonave të mëparshëm"</string>
+    <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"Shiko më shumë butona"</string>
+    <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"Progresi i luajtjes"</string>
+    <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Cilësimet"</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Titrat janë aktive. Kliko për t\'i fshehur."</string>
+    <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Titrat janë joaktive. Kliko për t\'i shfaqur."</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Riluaj"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Luaj"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Vendos në pauzë"</string>
+    <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Media e mëparshme"</string>
+    <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Media tjetër"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Rikthe me 10 sekonda"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Shko përpara me 30 sekonda"</string>
+    <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Ekrani i plotë"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-sr/strings.xml b/media2/media2-widget/src/main/res/values-sr/strings.xml
deleted file mode 100644
index 012f2aa..0000000
--- a/media2/media2-widget/src/main/res/values-sr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Искључи"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Аудио снимак"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Ништа"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Брзина репродукције"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Нормално"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. текстуални запис"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. текстуални запис – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. песма"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Непознат назив видеа"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Непознат назив песме"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Непознат извођач"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Нисмо успели да пустимо ставку коју сте захтевали"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Потврди"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Назад"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Назад на претходну листу дугмади"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Прикажи још дугмади"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Напредовање репродукције"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Подешавања"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Титл је укључен. Кликните да бисте га сакрили."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Титл је искључен. Кликните да бисте га приказали."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Пусти опет"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Пусти"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Паузирај"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Претходна медијска датотека"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Следећа медијска датотека"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Премотај уназад 10 секунди"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Премотај 30 секунди унапред"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Цео екран"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-sv/strings.xml b/media2/media2-widget/src/main/res/values-sv/strings.xml
deleted file mode 100644
index d539d78..0000000
--- a/media2/media2-widget/src/main/res/values-sv/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Av"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Ljudspår"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Inget"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Uppspelningshastighet"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Spår <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Spår <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Spår <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Okänd videotitel"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Okänd låttitel"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Okänd artist"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Det gick inte att spela upp det valda objektet"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Tillbaka"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Tillbaka till föregående knapplista"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Visa fler knappar"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Uppspelningsförlopp"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Inställningar"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Undertexter har aktiverats. Klicka för att dölja dem."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Undertexter har inaktiverats. Klicka för att visa dem."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Spela upp igen"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Spela upp"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pausa"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Föregående media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Nästa media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Spola bakåt tio sekunder"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Spola framåt 30 sekunder"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Helskärm"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-sw/strings.xml b/media2/media2-widget/src/main/res/values-sw/strings.xml
deleted file mode 100644
index 34f2843..0000000
--- a/media2/media2-widget/src/main/res/values-sw/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Imezimwa"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Wimbo wa sauti"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Hamna"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Kasi ya kucheza"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Kawaida"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Wimbo wa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Wimbo wa <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Wimbo wa <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Jina la video halijulikani"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Jina la wimbo halijulikani"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Msanii hajulikani"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Imeshindwa kucheza video uliyoomba"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Sawa"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Nyuma"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Rudi kwenye orodha ya kitufe cha awali"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Angalia vitufe vingine"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Kiasi cha uchezaji"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Mipangilio"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Umewasha manukuu. Bofya ili uyafiche."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Umezima manukuu. Bofya ili uyaonyeshe."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Cheza tena"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Cheza"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Sitisha"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Maudhui yaliyotangulia"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Maudhui yanayofuata"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Rudi nyuma kwa sekunde 10"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Sogeza mbele kwa sekunde 30"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Skrini nzima"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ta/strings.xml b/media2/media2-widget/src/main/res/values-ta/strings.xml
deleted file mode 100644
index a294c83..0000000
--- a/media2/media2-widget/src/main/res/values-ta/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ஆஃப்"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ஆடியோ டிராக்"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ஏதுமில்லை"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"வீடியோ இயக்க வேகம்"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"இயல்பு"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"டிராக்: <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"டிராக் <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"டிராக்: <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"வீடியோ தலைப்பு தெரியவில்லை"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"பாடல் தலைப்பு தெரியவில்லை"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"கலைஞர் பெயர் தெரியவில்லை"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"இந்த வீடியோவைப் பிளே செய்ய இயலவில்லை"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"சரி"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"முந்தையதற்குச் செல்வதற்கான பட்டன்"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"முந்தைய பட்டன் பட்டியலுக்குச் செல்வதற்கான பட்டன்"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"மேலும் பட்டன்களைக் காட்டும்"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"வீடியோவின் இயக்கம்"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"அமைப்புகள்"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"வசனம் ஆன் செய்யப்பட்டுள்ளது. மறைப்பதற்குக் கிளிக் செய்யவும்."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"வசனம் ஆஃப் செய்யப்பட்டுள்ளது. காட்டுவதற்குக் கிளிக் செய்யவும்."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"மீண்டும் பிளே செய்வதற்கான பட்டன்"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"பிளே செய்வதற்கான பட்டன்"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"இடைநிறுத்துவதற்கான பட்டன்"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"முந்தைய மீடியாவிற்குச் செல்வதற்கான பட்டன்"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"அடுத்த மீடியாவிற்குச் செல்வதற்கான பட்டன்"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 வினாடிகள் பின்செல்வதற்கான பட்டன்"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 வினாடிகள் முன்செல்வதற்கான பட்டன்"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"முழுத்திரை"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-te/strings.xml b/media2/media2-widget/src/main/res/values-te/strings.xml
deleted file mode 100644
index 399c201..0000000
--- a/media2/media2-widget/src/main/res/values-te/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ఆఫ్‌లో ఉంది"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"ఆడియో ట్రాక్"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ఏవీ లేవు"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ప్లేబ్యాక్ వేగం"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"సాధారణం"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ట్రాక్ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ట్రాక్ <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ట్రాక్ <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"వీడియో పేరు తెలియదు"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"పాట పేరు తెలియదు"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"కళాకారులు తెలియదు"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"మీరు అభ్యర్థించిన అంశాన్ని ప్లే చేయడం సాధ్యపడలేదు"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"సరే"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"వెనుకకు తీసుకెళ్తుంది"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"మునుపటి బటన్ జాబితాకు తిరిగి వెళ్తుంది"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"మరిన్ని బటన్‌లను చూడండి"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ప్లేబ్యాక్ ప్రోగ్రెస్"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"సెట్టింగ్‌లు"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"ఉపశీర్షికలు ఆన్‌లో ఉన్నాయి. వాటిని దాచడానికి క్లిక్ చేయండి."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"ఉపశీర్షికలు ఆఫ్‌లో ఉన్నాయి. వాటిని చూపడానికి క్లిక్ చేయండి."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"మళ్లీ ప్లే చేస్తుంది"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"ప్లే చేస్తుంది"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"పాజ్ చేస్తుంది"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"మునుపటి మీడియా"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"తర్వాతి మీడియా"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 సెకన్లు రివైండ్ చేస్తుంది"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 సెకన్లు ఫార్వర్డ్ చేస్తుంది"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"పూర్తి స్క్రీన్"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-th/strings.xml b/media2/media2-widget/src/main/res/values-th/strings.xml
deleted file mode 100644
index a29d7bd..0000000
--- a/media2/media2-widget/src/main/res/values-th/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"ปิด"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"แทร็กเสียง"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"ไม่มี"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"ความเร็วในการเล่น"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"ปกติ"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"แทร็ก <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"แทร็ก <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"แทร็ก <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ไม่ทราบชื่อวิดีโอ"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"ไม่ทราบชื่อเพลง"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"ไม่ทราบศิลปิน"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"เล่นวิดีโอที่คุณขอไม่ได้"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ตกลง"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"กลับ"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"กลับไปที่รายการปุ่มก่อนหน้า"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"ดูปุ่มอื่นๆ"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"ความคืบหน้าในการเล่น"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"การตั้งค่า"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"คำบรรยายเปิดอยู่ คลิกเพื่อซ่อน"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"คำบรรยายปิดอยู่ คลิกเพื่อแสดง"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"เล่นซ้ำ"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"เล่น"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"หยุดชั่วคราว"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"สื่อก่อนหน้า"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"สื่อถัดไป"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"กรอกลับ 10 วินาที"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"ข้ามไปข้างหน้า 30 วินาที"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"เต็มหน้าจอ"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-tl/strings.xml b/media2/media2-widget/src/main/res/values-tl/strings.xml
deleted file mode 100644
index 2ebb018..0000000
--- a/media2/media2-widget/src/main/res/values-tl/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"I-off"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio track"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Wala"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Bilis ng pag-playback"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Track <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Track <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Hindi alam ang pamagat ng video"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Hindi alam ang pamagat ng kanta"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Hindi kilalang artist"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Hindi ma-play ang item na hiniling mo"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Bumalik"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Bumalik sa nakaraang listahan ng button"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Tumingin pa ng mga button"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Progreso ng pag-playback"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Mga Setting"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Naka-on ang subtitle. I-click para itago ito."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Naka-off ang subtitle. I-click para ipakita ito."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"I-replay"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"I-play"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"I-pause"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Nakaraang media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Susunod na media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"I-rewind nang 10 segundo"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"I-forward nang 30 segundo"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Full screen"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-tr/strings.xml b/media2/media2-widget/src/main/res/values-tr/strings.xml
deleted file mode 100644
index 2480bab..0000000
--- a/media2/media2-widget/src/main/res/values-tr/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Kapalı"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Ses parçası"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Yok"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Çalma hızı"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. parça"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"<xliff:g id="TRACK_NUMBER">%1$d</xliff:g>. parça - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"<xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>. parça"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Video başlığı bilinmiyor"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Şarkı adı bilinmiyor"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Sanatçı bilinmiyor"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"İstekte bulunduğunuz öğe oynatılamadı"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"Tamam"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Geri"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Önceki düğme listesine dön"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Diğer düğmeleri göster"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Oynatmanın ilerleme durumu"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Ayarlar"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Altyazı açık. Altyazıyı gizlemek için tıklayın."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Altyazı kapalı. Altyazıyı göstermek için tıklayın."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Tekrar oynat"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Oynat"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Duraklat"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Önceki medya"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Sonraki medya"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 saniye geri sar"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 saniye ileri git"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Tam ekran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-uk/strings.xml b/media2/media2-widget/src/main/res/values-uk/strings.xml
deleted file mode 100644
index b17d70a..0000000
--- a/media2/media2-widget/src/main/res/values-uk/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Вимкнено"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Звукова доріжка"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Немає"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Швидкість відтворення"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Звичайна"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Композиція <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Композиція <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Композиція <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Невідома назва відео"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Невідома назва пісні"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Невідомий виконавець"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Не вдалося відтворити відео"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Назад"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Повернутися до попереднього списку кнопок"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Показати інші кнопки"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Прогрес відтворення"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Налаштування"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Субтитри ввімкнено. Натисніть, щоб сховати."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Субтитри вимкнено. Натисніть, щоб показати."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Повторити"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Відтворити"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Призупинити"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Попередній медіафайл"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Наступний медіафайл"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Перемотати назад на 10 секунд"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Перемотати на 30 секунд уперед"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"На весь екран"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-ur/strings.xml b/media2/media2-widget/src/main/res/values-ur/strings.xml
deleted file mode 100644
index 6900fd8..0000000
--- a/media2/media2-widget/src/main/res/values-ur/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"آف"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"آڈیو ٹریک"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"کوئی نہیں"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"پلے بیک کی رفتار"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"عام"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"ٹریک <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"ٹریک <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"ٹریک <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"ویڈیو کا عنوان نامعلوم ہے"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"گانے کا عنوان نامعلوم ہے"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"فنکار نامعلوم ہے"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"آپ کا مطلوبہ آئٹم نہیں چلایا جا سکا"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"ٹھیک ہے"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"پیچھے"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"بٹنز کی پچھلی فہرست پر واپس جائیں"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"مزید بٹنز دیکھیں"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"پلے بیک کی پیش رفت"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"ترتیبات"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"سب ٹائٹل آن ہے۔ اسے چھپانے کے لئے کلک کریں۔"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"سب ٹائٹل آف ہے۔ اسے دکھانے کے لئے کلک کریں۔"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"دوبارہ چلائیں"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"چلائیں"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"موقوف کریں"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"پچھلا میڈیا"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"اگلا میڈیا"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 سیکنڈ تک پیچھے جائیں"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 سیکنڈ تک آگے جائیں"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"پوری اسکرین"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-uz/strings.xml b/media2/media2-widget/src/main/res/values-uz/strings.xml
deleted file mode 100644
index 8aae600..0000000
--- a/media2/media2-widget/src/main/res/values-uz/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Yoqilmagan"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Audio trek"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Hech qanday"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Ijro tezligi"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Normal"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Trek <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Trek <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Trek <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Video nomi notanish"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Nomsiz"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Notanish ijrochi"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Tanlangan video ijro qilinmadi"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Orqaga"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Avvalgi roʻyxatga qaytish"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Boshqa tugmalar"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Ijro jarayoni"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Sozlamalar"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Taglavha yoniq. Uni berkitish uchun bosing."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Taglavha yopiq. Uni ochish uchun bosing."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Takrorlash"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Ijro"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Pauza"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Avvalgi media"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Keyingi media"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"10 soniya orqaga"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"30 soniya oldinga"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Butun ekran"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-vi/strings.xml b/media2/media2-widget/src/main/res/values-vi/strings.xml
deleted file mode 100644
index 35ff6b9..0000000
--- a/media2/media2-widget/src/main/res/values-vi/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Đang tắt"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Bản âm thanh"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Không"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Tốc độ phát"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Bình thường"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Bản nhạc <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Bản nhạc <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> – <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Bản nhạc <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Tiêu đề video không xác định"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Tiêu đề bài hát không xác định"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Nghệ sĩ không xác định"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Không thể phát mục bạn yêu cầu"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"OK"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Quay lại"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Quay lại danh sách nút trước đó"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Xem các nút khác"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Tiến trình phát"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Cài đặt"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Phụ đề đang bật. Nhấp để ẩn."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Phụ đề đang tắt. Nhấp để hiển thị."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Phát lại"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Phát"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Tạm dừng"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Nội dung nghe nhìn trước đó"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Nội dung nghe nhìn tiếp theo"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Tua lại 10 giây"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Tua đi 30 giây"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Toàn màn hình"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-zh-rCN/strings.xml b/media2/media2-widget/src/main/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 5ae63fd..0000000
--- a/media2/media2-widget/src/main/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"关闭"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"音轨"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"无"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"播放速度"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"常速"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"字幕轨 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"字幕轨 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"音轨 <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"未知视频名称"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"未知歌曲名称"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"未知音乐人"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"无法播放您请求的内容"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"确定"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"返回"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"返回上一个按钮列表"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"查看更多按钮"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"播放进度"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"设置"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"字幕已开启。点击即可隐藏。"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"字幕已关闭。点击即可显示。"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"重放"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"播放"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"暂停"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"上一项媒体内容"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"下一项媒体内容"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"快退 10 秒"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"快进 30 秒"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"全屏"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-zh-rHK/strings.xml b/media2/media2-widget/src/main/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 29e654a..0000000
--- a/media2/media2-widget/src/main/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"關閉"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"音軌"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"無"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"播放速度"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"正常"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"曲目 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"曲目 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"曲目 <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"影片標題不明"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"歌名不明"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"演出者不明"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"無法播放您要求的影片"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"確定"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"返回"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"返回上一個按鈕清單"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"查看更多按鈕"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"播放進度"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"設定"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"字幕已開啟,按一下即可隱藏。"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"字幕已關閉,按一下即可顯示。"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"重播"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"播放"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"暫停"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"上一個媒體"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"下一個媒體"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"倒帶 10 秒"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"前轉 30 秒"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"全螢幕"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-zh-rTW/strings.xml b/media2/media2-widget/src/main/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 247b3d6..0000000
--- a/media2/media2-widget/src/main/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"關閉"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"音軌"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"無"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"播放速度"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"正常"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"曲目 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"曲目 <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"曲目 <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"未知的影片標題"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"未知的曲名"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"未知的演出者"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"無法播放你要求的項目"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"確定"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"返回"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"返回前一個按鈕清單"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"顯示更多按鈕"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"播放進度"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"設定"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"字幕已開啟。按一下即可隱藏。"</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"字幕已關閉。按一下即可顯示。"</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"重播"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"播放"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"暫停"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"上一個媒體"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"下一個媒體"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"倒轉 10 秒"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"快轉 30 秒"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"全螢幕"</string>
-</resources>
diff --git a/media2/media2-widget/src/main/res/values-zu/strings.xml b/media2/media2-widget/src/main/res/values-zu/strings.xml
deleted file mode 100644
index c20da51..0000000
--- a/media2/media2-widget/src/main/res/values-zu/strings.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-  ~ 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.
-   -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="1845015629089301203">"Valiwe"</string>
-    <string name="MediaControlView_audio_track_text" msgid="3532548952520840186">"Ithrekhi yomsindo"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="549548876131348304">"Lutho"</string>
-    <string name="MediaControlView_playback_speed_text" msgid="8150324864582460559">"Isivinini sokudlala"</string>
-    <string name="MediaControlView_playback_speed_normal" msgid="480754169449450083">"Ivamile"</string>
-    <string name="MediaControlView_time_placeholder" msgid="4037918370566028719">"00:00:00"</string>
-    <string name="MediaControlView_subtitle_track_number_text" msgid="7764843500931103738">"Ithrekhi <xliff:g id="TRACK_NUMBER">%1$d</xliff:g>"</string>
-    <string name="MediaControlView_subtitle_track_number_and_lang_text" msgid="4652664932814816449">"Ithrekhi <xliff:g id="TRACK_NUMBER">%1$d</xliff:g> - <xliff:g id="LANG">%2$s</xliff:g>"</string>
-    <string name="MediaControlView_audio_track_number_text" msgid="4764598467753473351">"Ithrekhi <xliff:g id="AUDIO_NUMBER">%1$d</xliff:g>"</string>
-    <string name="mcv2_non_music_title_unknown_text" msgid="5414417081368449210">"Isihloko sevidiyo asaziwa"</string>
-    <string name="mcv2_music_title_unknown_text" msgid="6768779662371844918">"Isihloko sengoma asaziwa"</string>
-    <string name="mcv2_music_artist_unknown_text" msgid="1475333855817994058">"Umculi akaziwa"</string>
-    <string name="mcv2_playback_error_text" msgid="1201919666572302119">"Ayikwazi ukudlala into oyicelile"</string>
-    <string name="mcv2_error_dialog_button" msgid="1892680062375516133">"KULUNGILE"</string>
-    <string name="mcv2_back_button_desc" msgid="5728972524527278943">"Emuva"</string>
-    <string name="mcv2_overflow_left_button_desc" msgid="4619938179240477643">"Buyela emuva kuhlu lwenkinobho yangaphambilini"</string>
-    <string name="mcv2_overflow_right_button_desc" msgid="3959698281663418432">"Bona imiphumela eminingi"</string>
-    <string name="mcv2_seek_bar_desc" msgid="2626125787370091731">"Ukuqhubeka kokudlalwa"</string>
-    <string name="mcv2_settings_button_desc" msgid="8453746936008970620">"Izilungiselelo"</string>
-    <string name="mcv2_cc_is_on" msgid="8890320846743698774">"Umbhalo ongezansi uvuliwe. Chofoza ukuze uwufihle."</string>
-    <string name="mcv2_cc_is_off" msgid="6888583680833967030">"Umbhalo ongezansi uvaliwe. Chofoza ukuze uwubonise."</string>
-    <string name="mcv2_replay_button_desc" msgid="3498082316888662782">"Dlala futhi"</string>
-    <string name="mcv2_play_button_desc" msgid="1994649551115596877">"Dlala"</string>
-    <string name="mcv2_pause_button_desc" msgid="997297527148989963">"Phumula"</string>
-    <string name="mcv2_previous_button_desc" msgid="5367141424871007842">"Imidiya yangaphambilini"</string>
-    <string name="mcv2_next_button_desc" msgid="4799850472802157220">"Imidiya elandelayo"</string>
-    <string name="mcv2_rewind_button_desc" msgid="5725552141091554735">"Buyisela emuva ngamasekhondi angu-10"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="7189466356853482980">"Hamba phambili ngamasekhondi angu-30"</string>
-    <string name="mcv2_full_screen_button_desc" msgid="6900438429115580036">"Iskrini esigcwele"</string>
-</resources>
diff --git a/mediarouter/mediarouter/api/api_lint.ignore b/mediarouter/mediarouter/api/api_lint.ignore
index 4208103..9db8fc8 100644
--- a/mediarouter/mediarouter/api/api_lint.ignore
+++ b/mediarouter/mediarouter/api/api_lint.ignore
@@ -97,8 +97,6 @@
     Method can be invoked as a "in" operator from Kotlin: `contains` (this is usually desirable; just make sure it makes sense for this type of object)
 
 
-MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteDescriptor.Builder#addControlFilters(java.util.Collection<android.content.IntentFilter>):
-    androidx.mediarouter.media.MediaRouteDescriptor does not declare a `getControlFilterss()` method matching method androidx.mediarouter.media.MediaRouteDescriptor.Builder.addControlFilters(java.util.Collection<android.content.IntentFilter>)
 MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setCanDisconnect(boolean):
     androidx.mediarouter.media.MediaRouteDescriptor does not declare a `canDisconnect()` method matching method androidx.mediarouter.media.MediaRouteDescriptor.Builder.setCanDisconnect(boolean)
 MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setIsDynamicGroupRoute(boolean):
@@ -109,524 +107,14 @@
     androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor does not declare a `isIsTransferable()` method matching method androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder.setIsTransferable(boolean)
 MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#setIsUnselectable(boolean):
     androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor does not declare a `isIsUnselectable()` method matching method androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder.setIsUnselectable(boolean)
-MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#addRoutes(java.util.Collection<androidx.mediarouter.media.MediaRouteDescriptor>):
-    androidx.mediarouter.media.MediaRouteProviderDescriptor does not declare a `getRoutess()` method matching method androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder.addRoutes(java.util.Collection<androidx.mediarouter.media.MediaRouteDescriptor>)
 MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#setSupportsDynamicGroupRoute(boolean):
     androidx.mediarouter.media.MediaRouteProviderDescriptor does not declare a `isSupportsDynamicGroupRoute()` method matching method androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder.setSupportsDynamicGroupRoute(boolean)
-MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteSelector.Builder#addControlCategories(java.util.Collection<java.lang.String>):
-    androidx.mediarouter.media.MediaRouteSelector does not declare a `getControlCategoriess()` method matching method androidx.mediarouter.media.MediaRouteSelector.Builder.addControlCategories(java.util.Collection<java.lang.String>)
-MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteSelector.Builder#addControlCategory(String):
-    androidx.mediarouter.media.MediaRouteSelector does not declare a `getControlCategorys()` method matching method androidx.mediarouter.media.MediaRouteSelector.Builder.addControlCategory(String)
 MissingGetterMatchingBuilder: androidx.mediarouter.media.MediaRouteSelector.Builder#addSelector(androidx.mediarouter.media.MediaRouteSelector):
     androidx.mediarouter.media.MediaRouteSelector does not declare a `getSelectors()` method matching method androidx.mediarouter.media.MediaRouteSelector.Builder.addSelector(androidx.mediarouter.media.MediaRouteSelector)
 
 
-MissingNullability: androidx.mediarouter.app.MediaRouteActionProvider#MediaRouteActionProvider(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteActionProvider`
-MissingNullability: androidx.mediarouter.app.MediaRouteActionProvider#onCreateActionView():
-    Missing nullability on method `onCreateActionView` return
-MissingNullability: androidx.mediarouter.app.MediaRouteActionProvider#onCreateMediaRouteButton():
-    Missing nullability on method `onCreateMediaRouteButton` return
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#MediaRouteButton(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteButton`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#MediaRouteButton(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteButton`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#MediaRouteButton(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `MediaRouteButton`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#MediaRouteButton(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteButton`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#MediaRouteButton(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `MediaRouteButton`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#onCreateDrawableState(int):
-    Missing nullability on method `onCreateDrawableState` return
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#setRemoteIndicatorDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `d` in method `setRemoteIndicatorDrawable`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#setRouteSelector(androidx.mediarouter.media.MediaRouteSelector) parameter #0:
-    Missing nullability on parameter `selector` in method `setRouteSelector`
-MissingNullability: androidx.mediarouter.app.MediaRouteButton#verifyDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `who` in method `verifyDrawable`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialog#MediaRouteChooserDialog(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteChooserDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialog#MediaRouteChooserDialog(android.content.Context, int) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteChooserDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialog#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialog#setTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setTitle`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#getRouteSelector():
-    Missing nullability on method `getRouteSelector` return
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#onConfigurationChanged(android.content.res.Configuration) parameter #0:
-    Missing nullability on parameter `newConfig` in method `onConfigurationChanged`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#onCreateChooserDialog(android.content.Context, android.os.Bundle):
-    Missing nullability on method `onCreateChooserDialog` return
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#onCreateChooserDialog(android.content.Context, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `context` in method `onCreateChooserDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#onCreateChooserDialog(android.content.Context, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateChooserDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#onCreateDialog(android.os.Bundle):
-    Missing nullability on method `onCreateDialog` return
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#onCreateDialog(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteChooserDialogFragment#setRouteSelector(androidx.mediarouter.media.MediaRouteSelector) parameter #0:
-    Missing nullability on parameter `selector` in method `setRouteSelector`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#MediaRouteControllerDialog(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteControllerDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#MediaRouteControllerDialog(android.content.Context, int) parameter #0:
-    Missing nullability on parameter `context` in method `MediaRouteControllerDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#getMediaControlView():
-    Missing nullability on method `getMediaControlView` return
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#getMediaSession():
-    Missing nullability on method `getMediaSession` return
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#getRoute():
-    Missing nullability on method `getRoute` return
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#onCreateMediaControlView(android.os.Bundle):
-    Missing nullability on method `onCreateMediaControlView` return
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#onCreateMediaControlView(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateMediaControlView`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#onKeyDown(int, android.view.KeyEvent) parameter #1:
-    Missing nullability on parameter `event` in method `onKeyDown`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialog#onKeyUp(int, android.view.KeyEvent) parameter #1:
-    Missing nullability on parameter `event` in method `onKeyUp`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialogFragment#onConfigurationChanged(android.content.res.Configuration) parameter #0:
-    Missing nullability on parameter `newConfig` in method `onConfigurationChanged`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialogFragment#onCreateControllerDialog(android.content.Context, android.os.Bundle):
-    Missing nullability on method `onCreateControllerDialog` return
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialogFragment#onCreateControllerDialog(android.content.Context, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `context` in method `onCreateControllerDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialogFragment#onCreateControllerDialog(android.content.Context, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateControllerDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialogFragment#onCreateDialog(android.os.Bundle):
-    Missing nullability on method `onCreateDialog` return
-MissingNullability: androidx.mediarouter.app.MediaRouteControllerDialogFragment#onCreateDialog(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateDialog`
-MissingNullability: androidx.mediarouter.app.MediaRouteDiscoveryFragment#getMediaRouter():
-    Missing nullability on method `getMediaRouter` return
-MissingNullability: androidx.mediarouter.app.MediaRouteDiscoveryFragment#getRouteSelector():
-    Missing nullability on method `getRouteSelector` return
-MissingNullability: androidx.mediarouter.app.MediaRouteDiscoveryFragment#onCreateCallback():
-    Missing nullability on method `onCreateCallback` return
-MissingNullability: androidx.mediarouter.app.MediaRouteDiscoveryFragment#setRouteSelector(androidx.mediarouter.media.MediaRouteSelector) parameter #0:
-    Missing nullability on parameter `selector` in method `setRouteSelector`
-MissingNullability: androidx.mediarouter.media.MediaItemStatus#asBundle():
-    Missing nullability on method `asBundle` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus#fromBundle(android.os.Bundle):
-    Missing nullability on method `fromBundle` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus#fromBundle(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `bundle` in method `fromBundle`
-MissingNullability: androidx.mediarouter.media.MediaItemStatus#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#Builder(androidx.mediarouter.media.MediaItemStatus) parameter #0:
-    Missing nullability on parameter `status` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#setContentDuration(long):
-    Missing nullability on method `setContentDuration` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#setContentPosition(long):
-    Missing nullability on method `setContentPosition` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#setExtras(android.os.Bundle):
-    Missing nullability on method `setExtras` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#setExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `setExtras`
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#setPlaybackState(int):
-    Missing nullability on method `setPlaybackState` return
-MissingNullability: androidx.mediarouter.media.MediaItemStatus.Builder#setTimestamp(long):
-    Missing nullability on method `setTimestamp` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#asBundle():
-    Missing nullability on method `asBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#fromBundle(android.os.Bundle):
-    Missing nullability on method `fromBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#fromBundle(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `bundle` in method `fromBundle`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getControlFilters():
-    Missing nullability on method `getControlFilters` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getDescription():
-    Missing nullability on method `getDescription` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getIconUri():
-    Missing nullability on method `getIconUri` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getId():
-    Missing nullability on method `getId` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getName():
-    Missing nullability on method `getName` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor#getSettingsActivity():
-    Missing nullability on method `getSettingsActivity` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#Builder(String, String) parameter #0:
-    Missing nullability on parameter `id` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#Builder(String, String) parameter #1:
-    Missing nullability on parameter `name` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#Builder(androidx.mediarouter.media.MediaRouteDescriptor) parameter #0:
-    Missing nullability on parameter `descriptor` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#addControlFilter(android.content.IntentFilter):
-    Missing nullability on method `addControlFilter` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#addControlFilter(android.content.IntentFilter) parameter #0:
-    Missing nullability on parameter `filter` in method `addControlFilter`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#addControlFilters(java.util.Collection<android.content.IntentFilter>):
-    Missing nullability on method `addControlFilters` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#addControlFilters(java.util.Collection<android.content.IntentFilter>) parameter #0:
-    Missing nullability on parameter `filters` in method `addControlFilters`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setCanDisconnect(boolean):
-    Missing nullability on method `setCanDisconnect` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setConnectionState(int):
-    Missing nullability on method `setConnectionState` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setDescription(String):
-    Missing nullability on method `setDescription` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setDescription(String) parameter #0:
-    Missing nullability on parameter `description` in method `setDescription`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setDeviceType(int):
-    Missing nullability on method `setDeviceType` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setEnabled(boolean):
-    Missing nullability on method `setEnabled` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setExtras(android.os.Bundle):
-    Missing nullability on method `setExtras` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `setExtras`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setIconUri(android.net.Uri):
-    Missing nullability on method `setIconUri` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setIconUri(android.net.Uri) parameter #0:
-    Missing nullability on parameter `iconUri` in method `setIconUri`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setId(String):
-    Missing nullability on method `setId` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setId(String) parameter #0:
-    Missing nullability on parameter `id` in method `setId`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setIsDynamicGroupRoute(boolean):
-    Missing nullability on method `setIsDynamicGroupRoute` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setName(String):
-    Missing nullability on method `setName` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setName(String) parameter #0:
-    Missing nullability on parameter `name` in method `setName`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setPlaybackStream(int):
-    Missing nullability on method `setPlaybackStream` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setPlaybackType(int):
-    Missing nullability on method `setPlaybackType` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setPresentationDisplayId(int):
-    Missing nullability on method `setPresentationDisplayId` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setSettingsActivity(android.content.IntentSender):
-    Missing nullability on method `setSettingsActivity` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setSettingsActivity(android.content.IntentSender) parameter #0:
-    Missing nullability on parameter `is` in method `setSettingsActivity`
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setVolume(int):
-    Missing nullability on method `setVolume` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setVolumeHandling(int):
-    Missing nullability on method `setVolumeHandling` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDescriptor.Builder#setVolumeMax(int):
-    Missing nullability on method `setVolumeMax` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDiscoveryRequest#MediaRouteDiscoveryRequest(androidx.mediarouter.media.MediaRouteSelector, boolean) parameter #0:
-    Missing nullability on parameter `selector` in method `MediaRouteDiscoveryRequest`
-MissingNullability: androidx.mediarouter.media.MediaRouteDiscoveryRequest#asBundle():
-    Missing nullability on method `asBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDiscoveryRequest#fromBundle(android.os.Bundle):
-    Missing nullability on method `fromBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteDiscoveryRequest#fromBundle(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `bundle` in method `fromBundle`
-MissingNullability: androidx.mediarouter.media.MediaRouteDiscoveryRequest#getSelector():
-    Missing nullability on method `getSelector` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider#getContext():
-    Missing nullability on method `getContext` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider#getHandler():
-    Missing nullability on method `getHandler` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider#getMetadata():
-    Missing nullability on method `getMetadata` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider#setDiscoveryRequest(androidx.mediarouter.media.MediaRouteDiscoveryRequest) parameter #0:
-    Missing nullability on parameter `request` in method `setDiscoveryRequest`
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController#notifyDynamicRoutesChanged(java.util.Collection<androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor>) parameter #0:
-    Missing nullability on parameter `routes` in method `notifyDynamicRoutesChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController#onRemoveMemberRoute(String) parameter #0:
-    Missing nullability on parameter `routeId` in method `onRemoveMemberRoute`
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#Builder(androidx.mediarouter.media.MediaRouteDescriptor) parameter #0:
-    Missing nullability on parameter `descriptor` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#Builder(androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor) parameter #0:
-    Missing nullability on parameter `dynamicRouteDescriptor` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#setIsGroupable(boolean):
-    Missing nullability on method `setIsGroupable` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#setIsTransferable(boolean):
-    Missing nullability on method `setIsTransferable` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#setIsUnselectable(boolean):
-    Missing nullability on method `setIsUnselectable` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder#setSelectionState(int):
-    Missing nullability on method `setSelectionState` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.ProviderMetadata#getComponentName():
-    Missing nullability on method `getComponentName` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.ProviderMetadata#getPackageName():
-    Missing nullability on method `getPackageName` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProvider.RouteController#onControlRequest(android.content.Intent, androidx.mediarouter.media.MediaRouter.ControlRequestCallback) parameter #0:
-    Missing nullability on parameter `intent` in method `onControlRequest`
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor#asBundle():
-    Missing nullability on method `asBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor#fromBundle(android.os.Bundle):
-    Missing nullability on method `fromBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor#fromBundle(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `bundle` in method `fromBundle`
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#Builder(androidx.mediarouter.media.MediaRouteProviderDescriptor) parameter #0:
-    Missing nullability on parameter `descriptor` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#addRoute(androidx.mediarouter.media.MediaRouteDescriptor):
-    Missing nullability on method `addRoute` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#addRoute(androidx.mediarouter.media.MediaRouteDescriptor) parameter #0:
-    Missing nullability on parameter `route` in method `addRoute`
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#addRoutes(java.util.Collection<androidx.mediarouter.media.MediaRouteDescriptor>):
-    Missing nullability on method `addRoutes` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#addRoutes(java.util.Collection<androidx.mediarouter.media.MediaRouteDescriptor>) parameter #0:
-    Missing nullability on parameter `routes` in method `addRoutes`
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder#setSupportsDynamicGroupRoute(boolean):
-    Missing nullability on method `setSupportsDynamicGroupRoute` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderService#getMediaRouteProvider():
-    Missing nullability on method `getMediaRouteProvider` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderService#onBind(android.content.Intent):
-    Missing nullability on method `onBind` return
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderService#onBind(android.content.Intent) parameter #0:
-    Missing nullability on parameter `intent` in method `onBind`
-MissingNullability: androidx.mediarouter.media.MediaRouteProviderService#onCreateMediaRouteProvider():
-    Missing nullability on method `onCreateMediaRouteProvider` return
 MissingNullability: androidx.mediarouter.media.MediaRouteSelector#EMPTY:
     Missing nullability on field `EMPTY` in class `class androidx.mediarouter.media.MediaRouteSelector`
-MissingNullability: androidx.mediarouter.media.MediaRouteSelector#asBundle():
-    Missing nullability on method `asBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteSelector#contains(androidx.mediarouter.media.MediaRouteSelector) parameter #0:
-    Missing nullability on parameter `selector` in method `contains`
-MissingNullability: androidx.mediarouter.media.MediaRouteSelector#fromBundle(android.os.Bundle):
-    Missing nullability on method `fromBundle` return
-MissingNullability: androidx.mediarouter.media.MediaRouteSelector#getControlCategories():
-    Missing nullability on method `getControlCategories` return
-MissingNullability: androidx.mediarouter.media.MediaRouteSelector#hasControlCategory(String) parameter #0:
-    Missing nullability on parameter `category` in method `hasControlCategory`
-MissingNullability: androidx.mediarouter.media.MediaRouteSelector#matchesControlFilters(java.util.List<android.content.IntentFilter>) parameter #0:
-    Missing nullability on parameter `filters` in method `matchesControlFilters`
-MissingNullability: androidx.mediarouter.media.MediaRouter#addCallback(androidx.mediarouter.media.MediaRouteSelector, androidx.mediarouter.media.MediaRouter.Callback) parameter #0:
-    Missing nullability on parameter `selector` in method `addCallback`
-MissingNullability: androidx.mediarouter.media.MediaRouter#addCallback(androidx.mediarouter.media.MediaRouteSelector, androidx.mediarouter.media.MediaRouter.Callback) parameter #1:
-    Missing nullability on parameter `callback` in method `addCallback`
-MissingNullability: androidx.mediarouter.media.MediaRouter#getBluetoothRoute():
-    Missing nullability on method `getBluetoothRoute` return
-MissingNullability: androidx.mediarouter.media.MediaRouter#getInstance(android.content.Context):
-    Missing nullability on method `getInstance` return
-MissingNullability: androidx.mediarouter.media.MediaRouter#getMediaSessionToken():
-    Missing nullability on method `getMediaSessionToken` return
-MissingNullability: androidx.mediarouter.media.MediaRouter#getProviders():
-    Missing nullability on method `getProviders` return
-MissingNullability: androidx.mediarouter.media.MediaRouter#getRoutes():
-    Missing nullability on method `getRoutes` return
-MissingNullability: androidx.mediarouter.media.MediaRouter#setMediaSession(Object) parameter #0:
-    Missing nullability on parameter `mediaSession` in method `setMediaSession`
-MissingNullability: androidx.mediarouter.media.MediaRouter#setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat) parameter #0:
-    Missing nullability on parameter `mediaSession` in method `setMediaSessionCompat`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onProviderAdded(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.ProviderInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onProviderAdded`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onProviderAdded(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.ProviderInfo) parameter #1:
-    Missing nullability on parameter `provider` in method `onProviderAdded`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onProviderChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.ProviderInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onProviderChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onProviderChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.ProviderInfo) parameter #1:
-    Missing nullability on parameter `provider` in method `onProviderChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onProviderRemoved(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.ProviderInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onProviderRemoved`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onProviderRemoved(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.ProviderInfo) parameter #1:
-    Missing nullability on parameter `provider` in method `onProviderRemoved`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteAdded(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteAdded`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteAdded(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteAdded`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRoutePresentationDisplayChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRoutePresentationDisplayChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRoutePresentationDisplayChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRoutePresentationDisplayChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteRemoved(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteRemoved`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteRemoved(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteRemoved`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteSelected(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteSelected`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteSelected(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteSelected`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteUnselected(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteUnselected`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteUnselected(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteUnselected`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteUnselected(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo, int) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteUnselected`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteUnselected(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo, int) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteUnselected`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteVolumeChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `router` in method `onRouteVolumeChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.Callback#onRouteVolumeChanged(androidx.mediarouter.media.MediaRouter, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `onRouteVolumeChanged`
-MissingNullability: androidx.mediarouter.media.MediaRouter.ControlRequestCallback#onError(String, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `error` in method `onError`
-MissingNullability: androidx.mediarouter.media.MediaRouter.ControlRequestCallback#onError(String, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `data` in method `onError`
-MissingNullability: androidx.mediarouter.media.MediaRouter.ControlRequestCallback#onResult(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `data` in method `onResult`
-MissingNullability: androidx.mediarouter.media.MediaRouter.ProviderInfo#getComponentName():
-    Missing nullability on method `getComponentName` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.ProviderInfo#getPackageName():
-    Missing nullability on method `getPackageName` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.ProviderInfo#getProviderInstance():
-    Missing nullability on method `getProviderInstance` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.ProviderInfo#getRoutes():
-    Missing nullability on method `getRoutes` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.RouteInfo#getControlFilters():
-    Missing nullability on method `getControlFilters` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.RouteInfo#getIconUri():
-    Missing nullability on method `getIconUri` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.RouteInfo#getName():
-    Missing nullability on method `getName` return
-MissingNullability: androidx.mediarouter.media.MediaRouter.RouteInfo#getProvider():
-    Missing nullability on method `getProvider` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus#asBundle():
-    Missing nullability on method `asBundle` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus#fromBundle(android.os.Bundle):
-    Missing nullability on method `fromBundle` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus#fromBundle(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `bundle` in method `fromBundle`
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#Builder(androidx.mediarouter.media.MediaSessionStatus) parameter #0:
-    Missing nullability on parameter `status` in method `Builder`
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#build():
-    Missing nullability on method `build` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#setExtras(android.os.Bundle):
-    Missing nullability on method `setExtras` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#setExtras(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `extras` in method `setExtras`
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#setQueuePaused(boolean):
-    Missing nullability on method `setQueuePaused` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#setSessionState(int):
-    Missing nullability on method `setSessionState` return
-MissingNullability: androidx.mediarouter.media.MediaSessionStatus.Builder#setTimestamp(long):
-    Missing nullability on method `setTimestamp` return
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#RemotePlaybackClient(android.content.Context, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #0:
-    Missing nullability on parameter `context` in method `RemotePlaybackClient`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#RemotePlaybackClient(android.content.Context, androidx.mediarouter.media.MediaRouter.RouteInfo) parameter #1:
-    Missing nullability on parameter `route` in method `RemotePlaybackClient`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#endSession(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `extras` in method `endSession`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#endSession(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `endSession`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#enqueue(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #0:
-    Missing nullability on parameter `contentUri` in method `enqueue`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#enqueue(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #1:
-    Missing nullability on parameter `mimeType` in method `enqueue`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#enqueue(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #2:
-    Missing nullability on parameter `metadata` in method `enqueue`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#enqueue(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #4:
-    Missing nullability on parameter `extras` in method `enqueue`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#enqueue(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #5:
-    Missing nullability on parameter `callback` in method `enqueue`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#getSessionId():
-    Missing nullability on method `getSessionId` return
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#getSessionStatus(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `extras` in method `getSessionStatus`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#getSessionStatus(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `getSessionStatus`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#getStatus(String, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #0:
-    Missing nullability on parameter `itemId` in method `getStatus`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#getStatus(String, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #1:
-    Missing nullability on parameter `extras` in method `getStatus`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#getStatus(String, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #2:
-    Missing nullability on parameter `callback` in method `getStatus`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#pause(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `extras` in method `pause`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#pause(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `pause`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#play(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #0:
-    Missing nullability on parameter `contentUri` in method `play`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#play(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #1:
-    Missing nullability on parameter `mimeType` in method `play`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#play(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #2:
-    Missing nullability on parameter `metadata` in method `play`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#play(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #4:
-    Missing nullability on parameter `extras` in method `play`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#play(android.net.Uri, String, android.os.Bundle, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #5:
-    Missing nullability on parameter `callback` in method `play`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#remove(String, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #0:
-    Missing nullability on parameter `itemId` in method `remove`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#remove(String, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #1:
-    Missing nullability on parameter `extras` in method `remove`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#remove(String, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #2:
-    Missing nullability on parameter `callback` in method `remove`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#resume(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `extras` in method `resume`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#resume(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `resume`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#seek(String, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #0:
-    Missing nullability on parameter `itemId` in method `seek`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#seek(String, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #2:
-    Missing nullability on parameter `extras` in method `seek`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#seek(String, long, android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback) parameter #3:
-    Missing nullability on parameter `callback` in method `seek`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#sendMessage(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `message` in method `sendMessage`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#sendMessage(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `sendMessage`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#setOnMessageReceivedListener(androidx.mediarouter.media.RemotePlaybackClient.OnMessageReceivedListener) parameter #0:
-    Missing nullability on parameter `listener` in method `setOnMessageReceivedListener`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#setSessionId(String) parameter #0:
-    Missing nullability on parameter `sessionId` in method `setSessionId`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#setStatusCallback(androidx.mediarouter.media.RemotePlaybackClient.StatusCallback) parameter #0:
-    Missing nullability on parameter `callback` in method `setStatusCallback`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#startSession(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `extras` in method `startSession`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#startSession(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `startSession`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#stop(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #0:
-    Missing nullability on parameter `extras` in method `stop`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient#stop(android.os.Bundle, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback) parameter #1:
-    Missing nullability on parameter `callback` in method `stop`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ActionCallback#onError(String, int, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `error` in method `onError`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ActionCallback#onError(String, int, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `data` in method `onError`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #0:
-    Missing nullability on parameter `data` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #1:
-    Missing nullability on parameter `sessionId` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #2:
-    Missing nullability on parameter `sessionStatus` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #3:
-    Missing nullability on parameter `itemId` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #4:
-    Missing nullability on parameter `itemStatus` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.OnMessageReceivedListener#onMessageReceived(String, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `sessionId` in method `onMessageReceived`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.OnMessageReceivedListener#onMessageReceived(String, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `message` in method `onMessageReceived`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus) parameter #0:
-    Missing nullability on parameter `data` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus) parameter #1:
-    Missing nullability on parameter `sessionId` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback#onResult(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus) parameter #2:
-    Missing nullability on parameter `sessionStatus` in method `onResult`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onItemStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #0:
-    Missing nullability on parameter `data` in method `onItemStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onItemStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #1:
-    Missing nullability on parameter `sessionId` in method `onItemStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onItemStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #2:
-    Missing nullability on parameter `sessionStatus` in method `onItemStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onItemStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #3:
-    Missing nullability on parameter `itemId` in method `onItemStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onItemStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus, String, androidx.mediarouter.media.MediaItemStatus) parameter #4:
-    Missing nullability on parameter `itemStatus` in method `onItemStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onSessionChanged(String) parameter #0:
-    Missing nullability on parameter `sessionId` in method `onSessionChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onSessionStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus) parameter #0:
-    Missing nullability on parameter `data` in method `onSessionStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onSessionStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus) parameter #1:
-    Missing nullability on parameter `sessionId` in method `onSessionStatusChanged`
-MissingNullability: androidx.mediarouter.media.RemotePlaybackClient.StatusCallback#onSessionStatusChanged(android.os.Bundle, String, androidx.mediarouter.media.MediaSessionStatus) parameter #2:
-    Missing nullability on parameter `sessionStatus` in method `onSessionStatusChanged`
 
 
 RegistrationName: androidx.mediarouter.media.MediaRouter#addCallback(androidx.mediarouter.media.MediaRouteSelector, androidx.mediarouter.media.MediaRouter.Callback):
diff --git a/mediarouter/mediarouter/src/androidTest/AndroidManifest.xml b/mediarouter/mediarouter/src/androidTest/AndroidManifest.xml
index 0b06c49..38b578c 100644
--- a/mediarouter/mediarouter/src/androidTest/AndroidManifest.xml
+++ b/mediarouter/mediarouter/src/androidTest/AndroidManifest.xml
@@ -22,7 +22,7 @@
             android:name="androidx.mediarouter.app.MediaRouteChooserDialogTestActivity"
             android:label="MediaRouteChooserDialogTestActivity"
             android:theme="@style/Theme.AppCompat" />
-
+        <activity android:name="androidx.mediarouter.media.MediaRouter2TestActivity" />
         <service
             android:name="androidx.mediarouter.media.StubMediaRouteProviderService"
             android:exported="true">
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
index c94d87a..61ab858 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
@@ -57,8 +57,9 @@
     private static final String TAG = "MR2Test";
     private static final int TIMEOUT_MS = 5_000;
 
-    Context mContext;
-    MediaRouter mRouter;
+    private Context mContext;
+    private MediaRouter mRouter;
+    private MediaRouter.Callback mPlaceholderCallback = new MediaRouter.Callback() { };
     StubMediaRouteProviderService mService;
     StubMediaRouteProviderService.StubMediaRouteProvider mProvider;
     MediaRouteProviderService.MediaRouteProviderServiceImplApi30 mServiceImpl;
@@ -80,6 +81,14 @@
         mSelector = new MediaRouteSelector.Builder()
                 .addControlCategory(StubMediaRouteProviderService.CATEGORY_TEST)
                 .build();
+        MediaRouter2TestActivity.startActivity(mContext);
+
+        getInstrumentation().runOnMainSync(() -> {
+            MediaRouteSelector placeholderSelector = new MediaRouteSelector.Builder()
+                    .addControlCategory("placeholder category").build();
+            mRouter.addCallback(placeholderSelector, mPlaceholderCallback,
+                    MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
+        });
 
         new PollingCheck(TIMEOUT_MS) {
             @Override
@@ -105,11 +114,13 @@
     @After
     public void tearDown() {
         getInstrumentation().runOnMainSync(() -> {
+            mRouter.removeCallback(mPlaceholderCallback);
             for (MediaRouter.Callback callback : mCallbacks) {
                 mRouter.removeCallback(callback);
             }
             mCallbacks.clear();
         });
+        MediaRouter2TestActivity.finishActivity();
     }
 
     @Test
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2TestActivity.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2TestActivity.java
new file mode 100644
index 0000000..660fe42
--- /dev/null
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2TestActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.mediarouter.media;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import androidx.test.core.app.ActivityScenario;
+
+public class MediaRouter2TestActivity extends Activity {
+    private static ActivityScenario<MediaRouter2TestActivity> sActivityScenario;
+
+    public static ActivityScenario<MediaRouter2TestActivity> startActivity(Context context) {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClass(context, MediaRouter2TestActivity.class);
+        sActivityScenario = ActivityScenario.launch(intent);
+        return sActivityScenario;
+    }
+
+    public static void finishActivity() {
+        if (sActivityScenario != null) {
+            sActivityScenario.close();
+            sActivityScenario = null;
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setTurnScreenOn(true);
+        setShowWhenLocked(true);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+    }
+}
diff --git a/navigation/navigation-common-ktx/api/api_lint.ignore b/navigation/navigation-common-ktx/api/api_lint.ignore
index 290bfa9..f06b3a9 100644
--- a/navigation/navigation-common-ktx/api/api_lint.ignore
+++ b/navigation/navigation-common-ktx/api/api_lint.ignore
@@ -59,6 +59,14 @@
     Getter should be on the built object, not the builder: method androidx.navigation.PopUpToBuilder.getInclusive()
 
 
+GetterSetterNames: androidx.navigation.NavArgumentBuilder#getNullable():
+    Symmetric method for `setNullable` must be named `isNullable`; was `getNullable`
+GetterSetterNames: androidx.navigation.NavOptionsBuilder#getLaunchSingleTop():
+    Symmetric method for `setLaunchSingleTop` must be named `isLaunchSingleTop`; was `getLaunchSingleTop`
+GetterSetterNames: androidx.navigation.PopUpToBuilder#getInclusive():
+    Symmetric method for `setInclusive` must be named `isInclusive`; was `getInclusive`
+
+
 MissingBuildMethod: androidx.navigation.AnimBuilder:
     androidx.navigation.AnimBuilder does not declare a `build()` method, but builder classes are expected to
 MissingBuildMethod: androidx.navigation.NavActionBuilder:
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
index bcd1417..eac32a3 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
@@ -17,7 +17,7 @@
 package androidx.navigation.compose
 
 import android.net.Uri
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.core.net.toUri
 import androidx.navigation.NavDeepLinkRequest
@@ -45,7 +45,7 @@
         val key = "key"
         val arg = "myarg"
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(ComposeNavigator())
 
             NavHost(navController, startDestination = firstRoute) {
@@ -67,7 +67,7 @@
         val key = "key"
         val defaultArg = "default"
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(ComposeNavigator())
 
             NavHost(navController, startDestination = firstRoute) {
@@ -92,7 +92,7 @@
         val uriString = "https://www.example.com"
         val deeplink = NavDeepLinkRequest.Builder.fromUri(Uri.parse(uriString)).build()
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(ComposeNavigator())
 
             NavHost(navController, startDestination = firstRoute) {
@@ -115,7 +115,7 @@
     fun testNavigationNestedStart() {
         lateinit var navController: TestNavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(ComposeNavigator())
 
             NavHost(navController, startDestination = firstRoute) {
@@ -136,7 +136,7 @@
     fun testNavigationNestedInGraph() {
         lateinit var navController: TestNavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(ComposeNavigator())
 
             NavHost(navController, startDestination = firstRoute) {
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt
index 5ba5c48..48fa470 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavController
@@ -47,7 +47,7 @@
     fun testCurrentBackStackEntrySetGraph() {
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         composeTestRule.setContent {
-            val navController = TestNavHostController(AmbientContext.current)
+            val navController = TestNavHostController(LocalContext.current)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -66,7 +66,7 @@
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         lateinit var navController: NavController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -94,7 +94,7 @@
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         lateinit var navController: TestNavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -120,7 +120,7 @@
         lateinit var navController: NavController
         val navigator = TestNavigator()
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(navigator)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
@@ -156,7 +156,7 @@
         lateinit var navController: NavController
         val navigator = TestNavigator()
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
             navController.navigatorProvider.addNavigator(navigator)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
@@ -195,7 +195,7 @@
     fun testGetBackStackEntry() {
         lateinit var navController: NavController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -224,7 +224,7 @@
     fun testGetBackStackEntryNoEntryFound() {
         lateinit var navController: NavController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
index dc344d4..2b61132 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
@@ -28,7 +28,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
@@ -55,7 +55,7 @@
     fun testSingleDestinationSet() {
         lateinit var navController: NavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             NavHost(navController, startDestination = "first") {
                 test("first")
@@ -71,7 +71,7 @@
     fun testNavigate() {
         lateinit var navController: NavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             NavHost(navController, startDestination = "first") {
                 test("first")
@@ -149,7 +149,7 @@
     fun testPop() {
         lateinit var navController: TestNavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(AmbientContext.current)
+            navController = TestNavHostController(LocalContext.current)
 
             NavHost(navController, startDestination = "first") {
                 test("first")
@@ -175,7 +175,7 @@
         lateinit var state: MutableState<String>
         composeTestRule.setContent {
             state = remember { mutableStateOf("first") }
-            val context = AmbientContext.current
+            val context = LocalContext.current
             navController = remember { TestNavHostController(context) }
 
             NavHost(navController, startDestination = state.value) {
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
index 13ed100..166dbec 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
@@ -24,9 +24,9 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.SaveableStateHolder
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
-import androidx.compose.ui.platform.AmbientContext
-import androidx.compose.ui.platform.AmbientLifecycleOwner
-import androidx.compose.ui.platform.AmbientViewModelStoreOwner
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.platform.LocalViewModelStoreOwner
 import androidx.compose.ui.viewinterop.viewModel
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.ViewModel
@@ -80,9 +80,9 @@
  */
 @Composable
 public fun NavHost(navController: NavHostController, graph: NavGraph) {
-    var context = AmbientContext.current
-    val lifecycleOwner = AmbientLifecycleOwner.current
-    val viewModelStore = AmbientViewModelStoreOwner.current.viewModelStore
+    var context = LocalContext.current
+    val lifecycleOwner = LocalLifecycleOwner.current
+    val viewModelStore = LocalViewModelStoreOwner.current.viewModelStore
     val rememberedGraph = remember { graph }
 
     // on successful recompose we setup the navController with proper inputs
@@ -124,8 +124,8 @@
             // while in the scope of the composable, we provide the navBackStackEntry as the
             // ViewModelStoreOwner and LifecycleOwner
             Providers(
-                AmbientViewModelStoreOwner provides currentNavBackStackEntry,
-                AmbientLifecycleOwner provides currentNavBackStackEntry
+                LocalViewModelStoreOwner provides currentNavBackStackEntry,
+                LocalLifecycleOwner provides currentNavBackStackEntry
             ) {
                 saveableStateHolder.SaveableStateProvider {
                     destination.content(currentNavBackStackEntry)
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt
index 7d7533a..08c66a0 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt
@@ -26,7 +26,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.core.net.toUri
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavController
@@ -76,7 +76,7 @@
  */
 @Composable
 public fun rememberNavController(): NavHostController {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     return rememberSaveable(saver = NavControllerSaver(context)) {
         createNavController(context)
     }
diff --git a/navigation/navigation-fragment/api/api_lint.ignore b/navigation/navigation-fragment/api/api_lint.ignore
deleted file mode 100644
index df9ffae..0000000
--- a/navigation/navigation-fragment/api/api_lint.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-MissingGetterMatchingBuilder: androidx.navigation.fragment.FragmentNavigator.Extras.Builder#addSharedElements(java.util.Map<android.view.View,java.lang.String>):
-    androidx.navigation.fragment.FragmentNavigator.Extras does not declare a `getSharedElementss()` method matching method androidx.navigation.fragment.FragmentNavigator.Extras.Builder.addSharedElements(java.util.Map<android.view.View,java.lang.String>)
diff --git a/navigation/navigation-runtime/api/api_lint.ignore b/navigation/navigation-runtime/api/api_lint.ignore
index e40c09a..15edacb 100644
--- a/navigation/navigation-runtime/api/api_lint.ignore
+++ b/navigation/navigation-runtime/api/api_lint.ignore
@@ -13,9 +13,5 @@
     androidx.navigation.NavDeepLinkBuilder does not declare a `build()` method, but builder classes are expected to
 
 
-MissingGetterMatchingBuilder: androidx.navigation.ActivityNavigator.Extras.Builder#addFlags(int):
-    androidx.navigation.ActivityNavigator.Extras does not declare a `getFlagss()` method matching method androidx.navigation.ActivityNavigator.Extras.Builder.addFlags(int)
-
-
 TopLevelBuilder: androidx.navigation.NavDeepLinkBuilder:
     Builder should be defined as inner class: androidx.navigation.NavDeepLinkBuilder
diff --git a/navigation/settings.gradle b/navigation/settings.gradle
index 0a27e02..558cb8c 100644
--- a/navigation/settings.gradle
+++ b/navigation/settings.gradle
@@ -23,6 +23,7 @@
     if (name.startsWith(":navigation")) return true
     if (name == ":annotation:annotation-sampled") return true
     if (name == ":compose:integration-tests:demos:common") return true
+    if (name == ":lifecycle:lifecycle-viewmodel-savedstate") return true
     if (name.startsWith(":internal-testutils-navigation")) return true
     if (name.startsWith(":internal-testutils-runtime")) return true
     if (name.startsWith(":internal-testutils-truth")) return true
diff --git a/paging/common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt b/paging/common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
index 8ddaaf0..0b70976 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
@@ -351,15 +351,31 @@
         stateHolder.withLock { state ->
             when (loadType) {
                 PREPEND -> {
-                    val firstPageIndex =
+                    var firstPageIndex =
                         state.initialPageIndex + generationalHint.hint.originalPageOffsetFirst - 1
+
+                    // If the pages before the first page in presenter have been dropped in
+                    // fetcher, then we cannot count them towards loadedItems.
+                    if (firstPageIndex > state.pages.lastIndex) {
+                        itemsLoaded += config.pageSize * (firstPageIndex - state.pages.lastIndex)
+                        firstPageIndex = state.pages.lastIndex
+                    }
+
                     for (pageIndex in 0..firstPageIndex) {
                         itemsLoaded += state.pages[pageIndex].data.size
                     }
                 }
                 APPEND -> {
-                    val lastPageIndex =
+                    var lastPageIndex =
                         state.initialPageIndex + generationalHint.hint.originalPageOffsetLast + 1
+
+                    // If the pages after the last page in presenter have been dropped in
+                    // fetcher, then we cannot count them towards loadedItems.
+                    if (lastPageIndex < 0) {
+                        itemsLoaded += config.pageSize * -lastPageIndex
+                        lastPageIndex = 0
+                    }
+
                     for (pageIndex in lastPageIndex..state.pages.lastIndex) {
                         itemsLoaded += state.pages[pageIndex].data.size
                     }
diff --git a/paging/common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt b/paging/common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt
index c1caf9d..e2d8d4e 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt
@@ -2044,6 +2044,86 @@
         }
     }
 
+    /**
+     * The case where all pages from presenter have been dropped in fetcher, so instead of
+     * counting dropped pages against prefetchDistance, we should clamp that logic to only count
+     * pages that have been loaded.
+     */
+    @Test
+    fun doLoad_prependPresenterPagesDropped() = testScope.runBlockingTest {
+        val pageFetcher = PageFetcher(pagingSourceFactory, 50, config)
+        val fetcherState = collectFetcherState(pageFetcher)
+
+        advanceUntilIdle()
+        assertThat(fetcherState.newEvents()).containsExactly(
+            LoadStateUpdate<Int>(REFRESH, false, Loading),
+            createRefresh(50..51)
+        )
+
+        // Send a hint from a presenter state that only sees pages well after the pages loaded in
+        // fetcher state:
+        // [hint], [50, 51], [52], [53], [54], [55]
+        fetcherState.pagingDataList[0].receiver.accessHint(
+            ViewportHint.Access(
+                pageOffset = 4,
+                indexInPage = -6,
+                presentedItemsBefore = -6,
+                presentedItemsAfter = 2,
+                originalPageOffsetFirst = 4,
+                originalPageOffsetLast = 6
+            )
+        )
+        advanceUntilIdle()
+
+        assertThat(fetcherState.newEvents()).containsExactly(
+            LoadStateUpdate<Int>(loadType = PREPEND, fromMediator = false, loadState = Loading),
+            createPrepend(pageOffset = -1, range = 49..49, startState = Loading),
+            createPrepend(pageOffset = -2, range = 48..48, startState = NotLoading.Incomplete),
+        )
+
+        fetcherState.job.cancel()
+    }
+
+    /**
+     * The case where all pages from presenter have been dropped in fetcher, so instead of
+     * counting dropped pages against prefetchDistance, we should clamp that logic to only count
+     * pages that have been loaded.
+     */
+    @Test
+    fun doLoad_appendPresenterPagesDropped() = testScope.runBlockingTest {
+        val pageFetcher = PageFetcher(pagingSourceFactory, 50, config)
+        val fetcherState = collectFetcherState(pageFetcher)
+
+        advanceUntilIdle()
+        assertThat(fetcherState.newEvents()).containsExactly(
+            LoadStateUpdate<Int>(REFRESH, false, Loading),
+            createRefresh(50..51)
+        )
+
+        // Send a hint from a presenter state that only sees pages well before the pages loaded in
+        // fetcher state:
+        // [46], [47], [48], [49], [50, 51], [hint]
+        fetcherState.pagingDataList[0].receiver.accessHint(
+            ViewportHint.Access(
+                pageOffset = -4,
+                indexInPage = 6,
+                presentedItemsBefore = 2,
+                presentedItemsAfter = -6,
+                originalPageOffsetFirst = -6,
+                originalPageOffsetLast = -4
+            )
+        )
+        advanceUntilIdle()
+
+        assertThat(fetcherState.newEvents()).containsExactly(
+            LoadStateUpdate<Int>(loadType = APPEND, fromMediator = false, loadState = Loading),
+            createAppend(pageOffset = 1, range = 52..52, endState = Loading),
+            createAppend(pageOffset = 2, range = 53..53, endState = NotLoading.Incomplete),
+        )
+
+        fetcherState.job.cancel()
+    }
+
     @Test
     fun remoteMediator_initialLoadErrorTriggersLocal() = testScope.runBlockingTest {
         @OptIn(ExperimentalPagingApi::class)
diff --git a/paging/paging-compose/integration-tests/paging-demos/src/main/java/androidx/paging/compose/demos/room/PagingRoomSample.kt b/paging/paging-compose/integration-tests/paging-demos/src/main/java/androidx/paging/compose/demos/room/PagingRoomSample.kt
index 93dea17..780a5ac 100644
--- a/paging/paging-compose/integration-tests/paging-demos/src/main/java/androidx/paging/compose/demos/room/PagingRoomSample.kt
+++ b/paging/paging-compose/integration-tests/paging-demos/src/main/java/androidx/paging/compose/demos/room/PagingRoomSample.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.platform.AmbientContext
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.unit.sp
 import androidx.paging.Pager
 import androidx.paging.PagingConfig
@@ -35,7 +35,7 @@
 
 @Composable
 fun PagingRoomDemo() {
-    val context = AmbientContext.current
+    val context = LocalContext.current
     val dao: UserDao = AppDatabase.getInstance(context).userDao()
     val scope = rememberCoroutineScope()
 
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 4c0d815..50fb416 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -28,7 +28,7 @@
 androidx.enableDocumentation=false
 # Disable coverage
 androidx.coverageEnabled=false
-androidx.playground.snapshotBuildId=7095513
-androidx.playground.metalavaBuildId=7093240
+androidx.playground.snapshotBuildId=7116060
+androidx.playground.metalavaBuildId=7109364
 androidx.playground.dokkaBuildId=7019924
 androidx.studio.type=playground
diff --git a/preference/preference/api/api_lint.ignore b/preference/preference/api/api_lint.ignore
index baa6674..3abb208 100644
--- a/preference/preference/api/api_lint.ignore
+++ b/preference/preference/api/api_lint.ignore
@@ -49,6 +49,16 @@
     Registration methods should have overload that accepts delivery Executor: `setPreferenceComparisonCallback`
 
 
+GetterSetterNames: androidx.preference.Preference#setKey(String):
+    Symmetric method for `hasKey` must be named `setHasKey`; was `setKey`
+GetterSetterNames: androidx.preference.SeekBarPreference#getShowSeekBarValue():
+    Symmetric method for `setShowSeekBarValue` must be named `isShowSeekBarValue`; was `getShowSeekBarValue`
+GetterSetterNames: androidx.preference.SeekBarPreference#getUpdatesContinuously():
+    Symmetric method for `setUpdatesContinuously` must be named `isUpdatesContinuously`; was `getUpdatesContinuously`
+GetterSetterNames: androidx.preference.TwoStatePreference#getDisableDependentsState():
+    Symmetric method for `setDisableDependentsState` must be named `isDisableDependentsState`; was `getDisableDependentsState`
+
+
 InternalField: androidx.preference.TwoStatePreference#mChecked:
     Internal field mChecked must not be exposed
 
diff --git a/recyclerview/recyclerview/api/api_lint.ignore b/recyclerview/recyclerview/api/api_lint.ignore
index 30a7dca..648e471 100644
--- a/recyclerview/recyclerview/api/api_lint.ignore
+++ b/recyclerview/recyclerview/api/api_lint.ignore
@@ -121,6 +121,24 @@
     Parameter type is concrete collection (`java.util.ArrayList`); must be higher-level interface
 
 
+GetterSetterNames: androidx.recyclerview.widget.LinearLayoutManager#getRecycleChildrenOnDetach():
+    Symmetric method for `setRecycleChildrenOnDetach` must be named `isRecycleChildrenOnDetach`; was `getRecycleChildrenOnDetach`
+GetterSetterNames: androidx.recyclerview.widget.LinearLayoutManager#getReverseLayout():
+    Symmetric method for `setReverseLayout` must be named `isReverseLayout`; was `getReverseLayout`
+GetterSetterNames: androidx.recyclerview.widget.LinearLayoutManager#getStackFromEnd():
+    Symmetric method for `setStackFromEnd` must be named `isStackFromEnd`; was `getStackFromEnd`
+GetterSetterNames: androidx.recyclerview.widget.RecyclerView#getClipToPadding():
+    Symmetric method for `setClipToPadding` must be named `isClipToPadding`; was `getClipToPadding`
+GetterSetterNames: androidx.recyclerview.widget.RecyclerView#getPreserveFocusAfterLayout():
+    Symmetric method for `setPreserveFocusAfterLayout` must be named `isPreserveFocusAfterLayout`; was `getPreserveFocusAfterLayout`
+GetterSetterNames: androidx.recyclerview.widget.RecyclerView.ViewHolder#setIsRecyclable(boolean):
+    Symmetric method for `isRecyclable` must be named `setRecyclable`; was `setIsRecyclable`
+GetterSetterNames: androidx.recyclerview.widget.SimpleItemAnimator#getSupportsChangeAnimations():
+    Symmetric method for `setSupportsChangeAnimations` must be named `isSupportsChangeAnimations`; was `getSupportsChangeAnimations`
+GetterSetterNames: androidx.recyclerview.widget.StaggeredGridLayoutManager#getReverseLayout():
+    Symmetric method for `setReverseLayout` must be named `isReverseLayout`; was `getReverseLayout`
+
+
 InternalField: androidx.recyclerview.widget.LinearLayoutManager.LayoutChunkResult#mConsumed:
     Internal field mConsumed must not be exposed
 InternalField: androidx.recyclerview.widget.LinearLayoutManager.LayoutChunkResult#mFinished:
diff --git a/room/compiler-processing-testing/build.gradle b/room/compiler-processing-testing/build.gradle
index b3a42f6..109c5db 100644
--- a/room/compiler-processing-testing/build.gradle
+++ b/room/compiler-processing-testing/build.gradle
@@ -41,6 +41,34 @@
     implementation(KOTLIN_ANNOTATION_PROCESSING_EMBEDDABLE)
 }
 
+/**
+ * Create a properties file with versions that can be read from the test helper to setup test
+ * projects.
+ * see: b/178725084
+ */
+def testPropsOutDir = project.layout.buildDirectory.dir("test-config")
+def writeTestPropsTask = tasks.register("prepareTestConfiguration", WriteProperties.class) {
+    description = "Generates a properties file with the current environment for compilation tests"
+    setOutputFile(testPropsOutDir.map {
+        it.file("androidx.room.compiler.processing.util.CompilationTestCapabilities.Config" +
+                ".properties")
+    })
+    property("kotlinVersion", KOTLIN_VERSION)
+    property("kspVersion", KSP_VERSION)
+}
+
+java {
+    sourceSets {
+        main {
+            resources.srcDir(testPropsOutDir)
+        }
+    }
+}
+
+tasks.named("compileKotlin").configure {
+    dependsOn(writeTestPropsTask)
+}
+
 androidx {
     name = "AndroidX Room XProcessor Testing"
     type = LibraryType.ANNOTATION_PROCESSOR
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
index 8e57001..1eb4ef8 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
@@ -20,6 +20,7 @@
 import androidx.room.compiler.processing.util.XTestInvocation
 import javax.lang.model.SourceVersion
 
+@Suppress("VisibleForTests")
 class SyntheticJavacProcessor(
     val handler: (XTestInvocation) -> Unit,
 ) : JavacTestProcessor(), SyntheticProcessor {
@@ -33,7 +34,8 @@
         result = kotlin.runCatching {
             handler(
                 XTestInvocation(
-                    processingEnv = xEnv
+                    processingEnv = xEnv,
+                    roundEnv = roundEnv
                 ).also {
                     invocationInstances.add(it)
                 }
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
index 77ea907..742d704 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
@@ -58,7 +58,8 @@
         result = kotlin.runCatching {
             handler(
                 XTestInvocation(
-                    processingEnv = xEnv
+                    processingEnv = xEnv,
+                    roundEnv = XRoundEnv.create(xEnv)
                 ).also {
                     invocationInstances.add(it)
                 }
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
index c54b005..b3ed7a3 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
@@ -19,6 +19,7 @@
 import androidx.room.compiler.processing.SyntheticJavacProcessor
 import androidx.room.compiler.processing.SyntheticProcessor
 import androidx.room.compiler.processing.util.runner.CompilationTestRunner
+import com.google.common.truth.Fact.fact
 import com.google.common.truth.Fact.simpleFact
 import com.google.common.truth.FailureMetadata
 import com.google.common.truth.Subject
@@ -27,6 +28,7 @@
 import com.google.testing.compile.Compilation
 import com.google.testing.compile.CompileTester
 import com.tschuchort.compiletesting.KotlinCompilation
+import java.io.File
 import javax.tools.Diagnostic
 
 /**
@@ -46,6 +48,8 @@
      */
     internal val successfulCompilation: Boolean,
 ) {
+    internal abstract val generatedSources: List<Source>
+
     private val diagnostics = processor.messageWatcher.diagnostics()
 
     fun diagnosticsOfKind(kind: Diagnostic.Kind) = diagnostics[kind].orEmpty()
@@ -69,6 +73,10 @@
                 }
                 appendLine()
             }
+            appendLine("Generated files:")
+            generatedSources.forEach {
+                appendLine(it.relativePath)
+            }
             appendLine("RAW OUTPUT:")
             appendLine(rawOutput())
         }
@@ -145,6 +153,33 @@
     }
 
     /**
+     * Asserts that the given source file is generated.
+     *
+     * Unlike Java compile testing, which does structural comparison, this method executes a line
+     * by line comparison and is only able to ignore spaces and empty lines.
+     */
+    fun generatedSource(source: Source) = chain {
+        val match = actual().generatedSources.firstOrNull {
+            it.relativePath == source.relativePath
+        }
+        if (match == null) {
+            failWithActual(
+                simpleFact("Didn't generate $source")
+            )
+            return@chain
+        }
+        val mismatch = source.findMismatch(match)
+        if (mismatch != null) {
+            failWithActual(
+                simpleFact("Generated code does not match expected"),
+                fact("mismatch", mismatch),
+                fact("expected", source.contents),
+                fact("actual", match.contents),
+            )
+        }
+    }
+
+    /**
      * Called after handler is invoked to check its compilation failure assertion against the
      * compilation result.
      */
@@ -164,10 +199,9 @@
         if (processingException != null) {
             // processor has an error which we want to throw but we also want the subject, hence
             // we wrap it
-            throw AssertionError(
-                "Processor reported an error. See the cause for details\n" +
-                    "$compilationResult",
-                processingException
+            throw createProcessorAssertionError(
+                compilationResult = compilationResult,
+                realError = processingException
             )
         }
     }
@@ -193,6 +227,19 @@
         }
     }
 
+    /**
+     * Helper method to create an exception that does not include the stack trace from the test
+     * infra, instead, it just reports the stack trace of the actual error with added log.
+     */
+    private fun createProcessorAssertionError(
+        compilationResult: CompilationResult,
+        realError: Throwable
+    ) = object : AssertionError("processor did throw an error\n$compilationResult", realError) {
+        override fun fillInStackTrace(): Throwable {
+            return realError
+        }
+    }
+
     companion object {
         private val FACTORY =
             Factory<CompilationResultSubject, CompilationResult> { metadata, actual ->
@@ -219,6 +266,16 @@
     processor = processor,
     successfulCompilation = delegate.status() == Compilation.Status.SUCCESS
 ) {
+    override val generatedSources: List<Source> by lazy {
+        if (successfulCompilation) {
+            delegate.generatedSourceFiles().map(Source::fromJavaFileObject)
+        } else {
+            // java compile testing does not provide access to generated files when compilation
+            // fails
+            emptyList()
+        }
+    }
+
     override fun rawOutput(): String {
         return delegate.diagnostics().joinToString {
             it.toString()
@@ -231,13 +288,35 @@
     @Suppress("unused")
     private val delegate: KotlinCompilation.Result,
     processor: SyntheticProcessor,
-    successfulCompilation: Boolean
+    successfulCompilation: Boolean,
+    outputSourceDirs: List<File>,
 ) : CompilationResult(
     testRunnerName = testRunner.name,
     processor = processor,
     successfulCompilation = successfulCompilation
 ) {
+    override val generatedSources: List<Source> by lazy {
+        outputSourceDirs.flatMap { srcRoot ->
+            srcRoot.walkTopDown().mapNotNull { sourceFile ->
+                when {
+                    sourceFile.name.endsWith(".java") -> {
+                        val qName = sourceFile.absolutePath.substringAfter(
+                            srcRoot.absolutePath
+                        ).dropWhile { it == '/' }
+                            .replace('/', '.')
+                            .dropLast(".java".length)
+                        Source.loadJavaSource(sourceFile, qName)
+                    }
+                    sourceFile.name.endsWith(".kt") -> {
+                        Source.loadKotlinSource(sourceFile)
+                    }
+                    else -> null
+                }
+            }
+        }
+    }
+
     override fun rawOutput(): String {
         return delegate.messages
     }
-}
\ No newline at end of file
+}
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationTestCapabilities.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationTestCapabilities.kt
new file mode 100644
index 0000000..b5a1934
--- /dev/null
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationTestCapabilities.kt
@@ -0,0 +1,92 @@
+/*
+ * 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.room.compiler.processing.util
+
+import org.junit.AssumptionViolatedException
+import java.util.Properties
+
+/**
+ * Provides the information about compilation test capabilities.
+ * see: b/178725084
+ */
+object CompilationTestCapabilities {
+    /**
+     * `true` if we can run KSP tests.
+     */
+    val canTestWithKsp: Boolean
+
+    init {
+        val config = Config.load()
+        canTestWithKsp = config.canEnableKsp()
+    }
+
+    /**
+     * Checks if KSP tests can be run and if not, throws an [AssumptionViolatedException] to skip
+     * the test.
+     */
+    fun assumeKspIsEnabled() {
+        if (!canTestWithKsp) {
+            throw AssumptionViolatedException("KSP tests are not enabled")
+        }
+    }
+
+    internal data class Config(
+        val kotlinVersion: String,
+        val kspVersion: String
+    ) {
+        fun canEnableKsp(): Boolean {
+            val reducedKotlin = reduceVersions(kotlinVersion)
+            val reducedKsp = reduceVersions(kspVersion)
+            return reducedKotlin.contentEquals(reducedKsp)
+        }
+
+        /**
+         * Reduces the version to some approximation by taking major and minor versions and the
+         * first character of the patch. We use this to check if ksp and kotlin are compatible,
+         * feel free to change it if it does not work as it is only an approximation
+         * e.g. 1.4.20 becomes 1.4.2, 1.40.210-foobar becomes 1.40.2
+         */
+        private fun reduceVersions(version: String): Array<String?> {
+            val sections = version.split('.')
+            return arrayOf(
+                sections.getOrNull(0),
+                sections.getOrNull(1),
+                sections.getOrNull(2)?.trim()?.first()?.toString(),
+            )
+        }
+
+        companion object {
+            /**
+             * Load the test configuration from resources.
+             */
+            fun load(): Config {
+                val props = Properties()
+                val resourceName = "/${Config::class.java.canonicalName}.properties"
+                CompilationTestCapabilities::class.java
+                    .getResource(resourceName)
+                    .openStream()
+                    .use {
+                        props.load(it)
+                    }
+                return Config(
+                    kotlinVersion = props.getProperty("kotlinVersion") as String,
+                    kspVersion = props.getProperty("kspVersion") as String
+                )
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
index 7b806e2..e74f1b9 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
@@ -51,8 +51,19 @@
             false
         }
     }
-    // make sure some tests did run
-    assertThat(runCount).isGreaterThan(0)
+    // make sure some tests did run. Ksp tests might be disabled so if it is the only test given,
+    // ignore the check
+    val minTestCount = when {
+        CompilationTestCapabilities.canTestWithKsp ||
+            (runners.toList() - KspCompilationTestRunner).isNotEmpty() -> {
+            1
+        }
+        else -> {
+            // is ok if we don't run any tests if ksp is disabled and it is the only test
+            0
+        }
+    }
+    assertThat(runCount).isAtLeast(minTestCount)
 }
 
 fun runProcessorTestWithoutKsp(
@@ -109,7 +120,7 @@
  */
 fun runJavaProcessorTest(
     sources: List<Source>,
-    classpath: List<File>,
+    classpath: List<File> = emptyList(),
     handler: (XTestInvocation) -> Unit
 ) {
     runTests(
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/Source.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/Source.kt
index 68df609..abafbad 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/Source.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/Source.kt
@@ -26,11 +26,18 @@
  * Common abstraction for test sources in kotlin and java
  */
 sealed class Source {
+    abstract val relativePath: String
+    abstract val contents: String
     abstract fun toJFO(): JavaFileObject
     abstract fun toKotlinSourceFile(srcRoot: File): SourceFile
+
+    override fun toString(): String {
+        return "SourceFile[$relativePath]"
+    }
+
     class JavaSource(
         val qName: String,
-        val contents: String
+        override val contents: String
     ) : Source() {
         override fun toJFO(): JavaFileObject {
             return JavaFileObjects.forSourceString(
@@ -40,7 +47,7 @@
         }
 
         override fun toKotlinSourceFile(srcRoot: File): SourceFile {
-            val outFile = srcRoot.resolve(relativePath())
+            val outFile = srcRoot.resolve(relativePath)
                 .also {
                     it.parentFile.mkdirs()
                     it.writeText(contents)
@@ -48,21 +55,20 @@
             return SourceFile.fromPath(outFile)
         }
 
-        private fun relativePath(): String {
-            return qName.replace(".", "/") + ".java"
-        }
+        override val relativePath
+            get() = qName.replace(".", "/") + ".java"
     }
 
     class KotlinSource(
-        val filePath: String,
-        val contents: String
+        override val relativePath: String,
+        override val contents: String
     ) : Source() {
         override fun toJFO(): JavaFileObject {
             throw IllegalStateException("cannot include kotlin code in javac compilation")
         }
 
         override fun toKotlinSourceFile(srcRoot: File): SourceFile {
-            val outFile = srcRoot.resolve(filePath).also {
+            val outFile = srcRoot.resolve(relativePath).also {
                 it.parentFile.mkdirs()
                 it.writeText(contents)
             }
@@ -94,5 +100,56 @@
                 code
             )
         }
+
+        /**
+         * Convenience method to convert JFO's to the Source objects in XProcessing so that we can
+         * convert room tests to the common API w/o major code refactor
+         */
+        fun fromJavaFileObject(javaFileObject: JavaFileObject): Source {
+            val uri = javaFileObject.toUri()
+            // parse name from uri
+            val contents = javaFileObject.openReader(true).use {
+                it.readText()
+            }
+            val qName = if (uri.scheme == "mem") {
+                // in java compile testing, path includes SOURCE_OUTPUT, drop it
+                uri.path.substringAfter("SOURCE_OUTPUT/").replace('/', '.')
+            } else {
+                uri.path.replace('/', '.')
+            }
+            val javaExt = ".java"
+            check(qName.endsWith(javaExt)) {
+                "expected a java source file, $qName does not seem like one"
+            }
+
+            return java(qName.dropLast(javaExt.length), contents)
+        }
+
+        fun loadKotlinSource(
+            file: File
+        ): Source {
+            check(file.exists() && file.name.endsWith(".kt"))
+            return kotlin(file.absolutePath, file.readText())
+        }
+
+        fun loadJavaSource(
+            file: File,
+            qName: String
+        ): Source {
+            check(file.exists() && file.name.endsWith(".java"))
+            return java(qName, file.readText())
+        }
+
+        fun load(
+            file: File,
+            qName: String
+        ): Source {
+            check(file.exists())
+            return when {
+                file.name.endsWith(".kt") -> loadKotlinSource(file)
+                file.name.endsWith(".java") -> loadJavaSource(file, qName)
+                else -> error("invalid file extension ${file.name}")
+            }
+        }
     }
 }
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/SourceFileAssertions.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/SourceFileAssertions.kt
new file mode 100644
index 0000000..e5f3000
--- /dev/null
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/SourceFileAssertions.kt
@@ -0,0 +1,68 @@
+/*
+ * 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.room.compiler.processing.util
+
+/**
+ * Compares two source files and returns the line that does not match.
+ *
+ * It ignores all indentation and empty lines but is incapable of omitting comments etc (like
+ * java compile testing does).
+ */
+internal fun Source.findMismatch(other: Source): SourceFileMismatch? {
+    val myLines = contents.lineSequence().nonEmptySourceLines()
+    val otherLines = other.contents.lineSequence().nonEmptySourceLines()
+    do {
+        val myLine = myLines.nextOrNull()
+        val otherLine = otherLines.nextOrNull()
+        if (myLine?.content != otherLine?.content) {
+            return SourceFileMismatch(
+                myLine,
+                otherLine
+            )
+        }
+    } while (myLine != null || otherLine != null)
+    return null
+}
+
+/**
+ * Associate each line with an index ([Line]) while also dropping empty lines and trimming each
+ * line.
+ */
+private fun Sequence<String>.nonEmptySourceLines() =
+    map {
+        it.trim()
+    }.mapIndexed { index, content ->
+        Line(index + 1, content)
+    }.filterNot {
+        it.content.isNullOrBlank()
+    }.iterator()
+
+private fun <T> Iterator<T>.nextOrNull(): T? = if (this.hasNext()) {
+    next()
+} else {
+    null
+}
+
+internal data class SourceFileMismatch(
+    val expected: Line?,
+    val actual: Line?
+)
+
+internal data class Line(
+    val pos: Int,
+    val content: String?
+)
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt
index d7d0e75..8f927343 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/XTestInvocation.kt
@@ -17,6 +17,7 @@
 package androidx.room.compiler.processing.util
 
 import androidx.room.compiler.processing.XProcessingEnv
+import androidx.room.compiler.processing.XRoundEnv
 import kotlin.reflect.KClass
 
 /**
@@ -24,6 +25,7 @@
  */
 class XTestInvocation(
     val processingEnv: XProcessingEnv,
+    val roundEnv: XRoundEnv
 ) {
     /**
      * Extension mechanism to allow putting objects into invocation that can be retrieved later.
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt
index 6a98998..438ee44 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KaptCompilationTestRunner.kt
@@ -42,7 +42,8 @@
             testRunner = this,
             delegate = result,
             processor = syntheticJavacProcessor,
-            successfulCompilation = result.exitCode == KotlinCompilation.ExitCode.OK
+            successfulCompilation = result.exitCode == KotlinCompilation.ExitCode.OK,
+            outputSourceDirs = listOf(compilation.kaptSourceDir, compilation.kaptKotlinGeneratedDir)
         )
     }
 }
\ No newline at end of file
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
index 91a2b21..c562e7d 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
@@ -20,6 +20,7 @@
 import androidx.room.compiler.processing.util.CompilationResult
 import androidx.room.compiler.processing.util.KotlinCompilationUtil
 import androidx.room.compiler.processing.util.KotlinCompileTestingCompilationResult
+import androidx.room.compiler.processing.util.CompilationTestCapabilities
 import androidx.room.compiler.processing.util.Source
 import com.tschuchort.compiletesting.KotlinCompilation
 import com.tschuchort.compiletesting.SourceFile
@@ -33,7 +34,7 @@
     override val name: String = "ksp"
 
     override fun canRun(params: TestCompilationParameters): Boolean {
-        return true
+        return CompilationTestCapabilities.canTestWithKsp
     }
 
     override fun compile(params: TestCompilationParameters): CompilationResult {
@@ -76,7 +77,11 @@
             delegate = result,
             processor = syntheticKspProcessor,
             successfulCompilation = result.exitCode == KotlinCompilation.ExitCode.OK &&
-                !hasErrorDiagnostics
+                !hasErrorDiagnostics,
+            outputSourceDirs = listOf(
+                kspCompilation.kspJavaSourceDir,
+                kspCompilation.kspKotlinSourceDir
+            )
         )
     }
 
diff --git a/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt
new file mode 100644
index 0000000..84adf25
--- /dev/null
+++ b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt
@@ -0,0 +1,136 @@
+/*
+ * 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.room.compiler.processing.util
+
+import com.google.common.truth.Truth.assertThat
+import com.squareup.javapoet.JavaFile
+import com.squareup.javapoet.TypeName
+import com.squareup.javapoet.TypeSpec
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+typealias TestRunner = (block: (XTestInvocation) -> Unit) -> Unit
+
+@RunWith(Parameterized::class)
+class GeneratedCodeMatchTest internal constructor(
+    private val runTest: TestRunner
+) {
+    @Test
+    fun successfulGeneratedCodeMatch() {
+        val file = JavaFile.builder(
+            "foo.bar",
+            TypeSpec.classBuilder("Baz").build()
+        ).build()
+        runTest { invocation ->
+            if (invocation.processingEnv.findTypeElement("foo.bar.Baz") == null) {
+                invocation.processingEnv.filer.write(
+                    file
+                )
+            }
+            invocation.assertCompilationResult {
+                generatedSource(
+                    Source.java(
+                        "foo.bar.Baz",
+                        file.toString()
+                    )
+                )
+            }
+        }
+    }
+
+    @Test
+    fun missingGeneratedCode() {
+        val result = runCatching {
+            runTest { invocation ->
+                invocation.assertCompilationResult {
+                    generatedSource(
+                        Source.java(
+                            "foo.bar.Baz",
+                            ""
+                        )
+                    )
+                }
+            }
+        }
+        assertThat(result.exceptionOrNull())
+            .hasMessageThat()
+            .contains("Didn't generate SourceFile[foo/bar/Baz.java]")
+    }
+
+    @Test
+    fun missingGeneratedCode_contentMismatch() {
+        val generated = JavaFile.builder(
+            "foo.bar",
+            TypeSpec.classBuilder("Baz")
+                .addField(
+                    TypeName.BOOLEAN, "bar"
+                )
+                .build()
+        ).build()
+        val expected = JavaFile.builder(
+            "foo.bar",
+            TypeSpec.classBuilder("Baz").addField(
+                TypeName.BOOLEAN, "foo"
+            ).build()
+        ).build()
+        val result = runCatching {
+            runTest { invocation: XTestInvocation ->
+                if (invocation.processingEnv.findTypeElement("foo.bar.Baz") == null) {
+                    invocation.processingEnv.filer.write(generated)
+                }
+                invocation.assertCompilationResult {
+                    generatedSource(
+                        Source.java("foo.bar.Baz", expected.toString())
+                    )
+                }
+            }
+        }
+
+        val mismatch = SourceFileMismatch(
+            expected = Line(
+                pos = 4,
+                content = "boolean foo;"
+            ),
+            actual = Line(
+                pos = 4,
+                content = "boolean bar;"
+            )
+        )
+        assertThat(result.exceptionOrNull()).hasMessageThat().contains(mismatch.toString())
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun runners(): List<TestRunner> = listOfNotNull(
+            { block: (XTestInvocation) -> Unit ->
+                runJavaProcessorTest(sources = emptyList(), handler = block)
+            },
+            { block: (XTestInvocation) -> Unit ->
+                runKaptTest(sources = emptyList(), handler = block)
+            },
+            if (CompilationTestCapabilities.canTestWithKsp) {
+                { block: (XTestInvocation) -> Unit ->
+                    runKspTest(sources = emptyList(), handler = block)
+                }
+            } else {
+                null
+            }
+        )
+    }
+}
diff --git a/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestConfigTest.kt b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestConfigTest.kt
new file mode 100644
index 0000000..f442790
--- /dev/null
+++ b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestConfigTest.kt
@@ -0,0 +1,64 @@
+/*
+ * 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.room.compiler.processing.util
+
+import androidx.room.compiler.processing.util.CompilationTestCapabilities.Config
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class TestConfigTest {
+    @Test
+    fun checkConfigExists() {
+        val config = Config.load()
+        assertThat(config.kspVersion.isNotBlank()).isTrue()
+        assertThat(config.kotlinVersion.isNotBlank()).isTrue()
+    }
+
+    @Test
+    fun compatibilities() {
+        assertThat(
+            Config(
+                kotlinVersion = "1.4.20",
+                kspVersion = "1.4.20-blah-blah"
+            ).canEnableKsp()
+        ).isTrue()
+        assertThat(
+            Config(
+                kotlinVersion = "1.4.30",
+                kspVersion = "1.4.20-blah-blah"
+            ).canEnableKsp()
+        ).isFalse()
+        assertThat(
+            Config(
+                kotlinVersion = "1.5.30",
+                kspVersion = "1.4.20-blah-blah"
+            ).canEnableKsp()
+        ).isFalse()
+        assertThat(
+            Config(
+                kotlinVersion = "1.5",
+                kspVersion = "1.4.20-blah-blah"
+            ).canEnableKsp()
+        ).isFalse()
+        assertThat(
+            Config(
+                kotlinVersion = "1.5",
+                kspVersion = "1.5.20-blah-blah"
+            ).canEnableKsp()
+        ).isFalse()
+    }
+}
\ No newline at end of file
diff --git a/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestRunnerTest.kt b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestRunnerTest.kt
index def43fd..051dac1 100644
--- a/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestRunnerTest.kt
+++ b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/TestRunnerTest.kt
@@ -99,13 +99,15 @@
         assertThat(kaptResult.exceptionOrNull()).hasMessageThat()
             .contains(errorMessage)
 
-        val kspResult = runCatching {
-            runKspTest(
-                sources = listOf(src)
-            ) {}
+        if (CompilationTestCapabilities.canTestWithKsp) {
+            val kspResult = runCatching {
+                runKspTest(
+                    sources = listOf(src)
+                ) {}
+            }
+            assertThat(kspResult.exceptionOrNull()).hasMessageThat()
+                .contains(errorMessage)
         }
-        assertThat(kspResult.exceptionOrNull()).hasMessageThat()
-            .contains(errorMessage)
     }
 
     @Test
@@ -126,12 +128,14 @@
         assertThat(kaptResult.exceptionOrNull()).hasMessageThat()
             .contains(errorMessage)
 
-        val kspResult = runCatching {
-            runKspTest(
-                sources = listOf(src)
-            ) {}
+        if (CompilationTestCapabilities.canTestWithKsp) {
+            val kspResult = runCatching {
+                runKspTest(
+                    sources = listOf(src)
+                ) {}
+            }
+            assertThat(kspResult.exceptionOrNull()).hasMessageThat()
+                .contains(errorMessage)
         }
-        assertThat(kspResult.exceptionOrNull()).hasMessageThat()
-            .contains(errorMessage)
     }
 }
\ No newline at end of file
diff --git a/room/compiler-processing/build.gradle b/room/compiler-processing/build.gradle
index d2365d4..362439f 100644
--- a/room/compiler-processing/build.gradle
+++ b/room/compiler-processing/build.gradle
@@ -53,6 +53,11 @@
     }
 }
 
+tasks.withType(Test).configureEach {
+    // TODO: re-enable once b/177660733 is fixed.
+   it.systemProperty("androidx.room.compiler.processing.strict", "false")
+}
+
 androidx {
     name = "AndroidX Room XProcessor"
     type = LibraryType.ANNOTATION_PROCESSOR
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt
index 97a54a2..134cc91 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/JavacTestProcessor.kt
@@ -15,6 +15,7 @@
  */
 package androidx.room.compiler.processing
 
+import androidx.annotation.VisibleForTesting
 import androidx.room.compiler.processing.javac.JavacProcessingEnv
 import androidx.room.compiler.processing.javac.JavacRoundEnv
 import javax.annotation.processing.AbstractProcessor
@@ -27,6 +28,7 @@
  * This is only used in tests, the main processor uses an API similar to the processing step
  * in Auto Common.
  */
+@VisibleForTesting
 abstract class JavacTestProcessor : AbstractProcessor() {
     val xProcessingEnv by lazy {
         // lazily create this as it is not available on construction time
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
index fd78865..2ffba4d 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
@@ -22,4 +22,17 @@
  * @see XMethodElement
  * @see XExecutableElement
  */
-interface XConstructorElement : XExecutableElement
+interface XConstructorElement : XExecutableElement {
+    override val fallbackLocationText: String
+        get() = buildString {
+            append(enclosingTypeElement.qualifiedName)
+            append(".<init>")
+            append("(")
+            append(
+                parameters.joinToString(", ") {
+                    it.type.typeName.toString()
+                }
+            )
+            append(")")
+        }
+}
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
index 77fc091..a94f643 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
@@ -31,6 +31,11 @@
      * Returns the string representation of the Element's kind.
      */
     fun kindName(): String
+    /**
+     * When the location of an element is unknown, this String is appended to the diagnostic
+     * message. Without this information, developer gets no clue on where the error is.
+     */
+    val fallbackLocationText: String
 }
 
 /**
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt
index fe68eee..a65f3db 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt
@@ -24,4 +24,7 @@
      * The [XTypeElement] that declared this executable.
      */
     val enclosingTypeElement: XTypeElement
+
+    override val fallbackLocationText: String
+        get() = "$name in ${enclosingTypeElement.fallbackLocationText}"
 }
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
index 6034fdf..3845b69 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
@@ -39,6 +39,23 @@
      */
     val executableType: XMethodType
 
+    override val fallbackLocationText: String
+        get() = buildString {
+            append(enclosingTypeElement.qualifiedName)
+            append(".")
+            append(name)
+            append("(")
+            // don't report last parameter if it is a suspend function
+            append(
+                parameters.dropLast(
+                    if (isSuspendFunction()) 1 else 0
+                ).joinToString(", ") {
+                    it.type.typeName.toString()
+                }
+            )
+            append(")")
+        }
+
     /**
      * Returns true if this method has the default modifier.
      *
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingConfig.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingConfig.kt
new file mode 100644
index 0000000..25fed28
--- /dev/null
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingConfig.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.room.compiler.processing
+
+/**
+ * Utility class to change some behavior in tests, like adding more strict tests.
+ */
+internal object XProcessingConfig {
+    /**
+     * When true, we do more strict checks and fail instead of workarounds or fallback
+     * behaviors. Set to true in room's own tests.
+     */
+    val STRICT_MODE by lazy {
+        System.getProperty("$PROP_PREFIX.strict").toBoolean()
+    }
+
+    private const val PROP_PREFIX = "androidx.room.compiler.processing"
+}
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt
index 8cb97c9..0f41811 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt
@@ -19,6 +19,8 @@
 import androidx.annotation.VisibleForTesting
 import androidx.room.compiler.processing.javac.JavacProcessingEnv
 import androidx.room.compiler.processing.javac.JavacRoundEnv
+import androidx.room.compiler.processing.ksp.KspProcessingEnv
+import androidx.room.compiler.processing.ksp.KspRoundEnv
 import javax.annotation.processing.RoundEnvironment
 
 /**
@@ -36,7 +38,7 @@
     /**
      * Returns the set of [XElement]s that are annotated with the given [klass].
      */
-    fun getElementsAnnotatedWith(klass: Class<out Annotation>): Set<XElement>
+    fun getTypeElementsAnnotatedWith(klass: Class<out Annotation>): Set<XTypeElement>
 
     companion object {
         /**
@@ -44,10 +46,18 @@
          */
         fun create(
             processingEnv: XProcessingEnv,
-            roundEnvironment: RoundEnvironment
+            roundEnvironment: RoundEnvironment? = null
         ): XRoundEnv {
-            check(processingEnv is JavacProcessingEnv)
-            return JavacRoundEnv(processingEnv, roundEnvironment)
+            return when (processingEnv) {
+                is JavacProcessingEnv -> {
+                    checkNotNull(roundEnvironment)
+                    JavacRoundEnv(processingEnv, roundEnvironment)
+                }
+                is KspProcessingEnv -> {
+                    KspRoundEnv(processingEnv)
+                }
+                else -> error("invalid processing environment type: $processingEnv")
+            }
         }
     }
 }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
index ec4a09e..76e1e96 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
@@ -56,6 +56,9 @@
      */
     val enclosingTypeElement: XTypeElement?
 
+    override val fallbackLocationText: String
+        get() = qualifiedName
+
     /**
      * Returns `true` if this [XTypeElement] represents an interface
      */
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt
index 2278c43..3473ba1 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt
@@ -42,6 +42,7 @@
         element.parameters.mapIndexed { index, variable ->
             JavacMethodParameter(
                 env = env,
+                executable = this,
                 containing = containing,
                 element = variable,
                 kotlinMetadata = kotlinMetadata?.parameters?.getOrNull(index)
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt
index 03ad470..01fcd68 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt
@@ -22,6 +22,7 @@
 
 internal class JavacMethodParameter(
     env: JavacProcessingEnv,
+    private val executable: JavacExecutableElement,
     containing: JavacTypeElement,
     element: VariableElement,
     val kotlinMetadata: KmValueParameter?
@@ -30,4 +31,12 @@
         get() = kotlinMetadata?.name ?: super.name
     override val kotlinType: KmType?
         get() = kotlinMetadata?.type
+    override val fallbackLocationText: String
+        get() = if (executable is JavacMethodElement && executable.isSuspendFunction() &&
+            this === executable.parameters.last()
+        ) {
+            "return type of ${executable.fallbackLocationText}"
+        } else {
+            "$name in ${executable.fallbackLocationText}"
+        }
 }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacProcessingEnvMessager.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacProcessingEnvMessager.kt
index e49a5f7..6caebf2 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacProcessingEnvMessager.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacProcessingEnvMessager.kt
@@ -18,11 +18,8 @@
 
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XMessager
-import java.io.StringWriter
 import javax.annotation.processing.ProcessingEnvironment
 import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.util.Elements
 import javax.tools.Diagnostic
 
 internal class JavacProcessingEnvMessager(
@@ -33,7 +30,7 @@
         processingEnv.messager.printMessage(
             kind,
             if (javacElement != null && javacElement.isFromCompiledClass()) {
-                msg.appendElement(processingEnv.elementUtils, javacElement)
+                "$msg - ${element.fallbackLocationText}"
             } else {
                 msg
             },
@@ -67,26 +64,5 @@
                 false
             }
         }
-
-        private fun String.appendElement(elementUtils: Elements, element: Element): String {
-            return StringBuilder(this).apply {
-                append(" - ")
-                when (element.kind) {
-                    ElementKind.CLASS, ElementKind.INTERFACE, ElementKind.CONSTRUCTOR ->
-                        append(element)
-                    ElementKind.FIELD, ElementKind.METHOD, ElementKind.PARAMETER ->
-                        append("$element in ${element.enclosingElement}")
-                    else -> {
-                        // Not sure how to nicely print the element, delegate to utils then.
-                        append("In:\n")
-                        append(
-                            StringWriter().apply {
-                                elementUtils.printElements(this, element)
-                            }.toString()
-                        )
-                    }
-                }
-            }.toString()
-        }
     }
 }
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt
index 5f3ba5e..672a539 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt
@@ -16,12 +16,15 @@
 
 package androidx.room.compiler.processing.javac
 
+import androidx.annotation.VisibleForTesting
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XRoundEnv
+import androidx.room.compiler.processing.XTypeElement
 import com.google.auto.common.MoreElements
 import javax.annotation.processing.RoundEnvironment
 
-@Suppress("VisibleForTests", "UnstableApiUsage")
+@Suppress("UnstableApiUsage")
+@VisibleForTesting
 internal class JavacRoundEnv(
     private val env: JavacProcessingEnv,
     val delegate: RoundEnvironment
@@ -34,10 +37,11 @@
     }
 
     // TODO this is only for tests but we may need to support more types of elements
-    override fun getElementsAnnotatedWith(klass: Class<out Annotation>): Set<XElement> {
+    override fun getTypeElementsAnnotatedWith(klass: Class<out Annotation>): Set<XTypeElement> {
         val result = delegate.getElementsAnnotatedWith(klass)
-        return result.map {
-            check(MoreElements.isType(it))
+        return result.filter {
+            MoreElements.isType(it)
+        }.map {
             env.wrapTypeElement(MoreElements.asType(it))
         }.toSet()
     }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt
index d478ac4..dc10afa 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt
@@ -124,7 +124,7 @@
 private fun <R> Any.readAs(returnType: Class<R>): R? {
     return when {
         returnType.isArray -> {
-            val values = when (this) {
+            val values: List<Any?> = when (this) {
                 is List<*> -> {
                     // KSP might return list for arrays. convert it back.
                     this.mapNotNull {
@@ -139,14 +139,27 @@
                     listOf(this.readAs(returnType.componentType))
                 }
             }
-            val resultArray = java.lang.reflect.Array.newInstance(
-                returnType.componentType,
-                values.size
-            ) as Array<Any?>
-            values.forEachIndexed { index, value ->
-                resultArray[index] = value
+            if (returnType.componentType.isPrimitive) {
+                when (returnType) {
+                    IntArray::class.java ->
+                        (values as Collection<Int>).toIntArray()
+                    else -> {
+                        // We don't have the use case for these yet but could be implemented in
+                        // the future. Also need to implement them in JavacAnnotationBox
+                        // b/179081610
+                        error("Unsupported primitive array type: $returnType")
+                    }
+                }
+            } else {
+                val resultArray = java.lang.reflect.Array.newInstance(
+                    returnType.componentType,
+                    values.size
+                ) as Array<Any?>
+                values.forEachIndexed { index, value ->
+                    resultArray[index] = value
+                }
+                resultArray
             }
-            resultArray
         }
         returnType.isEnum -> {
             this.readAsEnum(returnType)
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
index 0648f76..73fdc00 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
@@ -49,6 +49,9 @@
         }
     }
 
+    override val fallbackLocationText: String
+        get() = "$name in ${method.fallbackLocationText}"
+
     override fun asMemberOf(other: XType): KspType {
         if (method.containing.type.isSameType(other)) {
             return type
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldOrdering.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldOrdering.kt
new file mode 100644
index 0000000..aa3c1c2
--- /dev/null
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldOrdering.kt
@@ -0,0 +1,214 @@
+/*
+ * 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.room.compiler.processing.ksp
+
+import androidx.room.compiler.processing.XFieldElement
+import androidx.room.compiler.processing.XProcessingConfig
+import com.google.devtools.ksp.symbol.KSClassDeclaration
+import com.google.devtools.ksp.symbol.Origin
+import java.lang.reflect.InvocationHandler
+import java.lang.reflect.Method
+import java.lang.reflect.Proxy
+
+/**
+ * When a compiled kotlin class is loaded from a `.class` file, its fields are not ordered in the
+ * same way they are declared in code.
+ * This particularly hurts Room where we generate the table structure in that order.
+ *
+ * This class implements a port of https://github.com/google/ksp/pull/260 via reflection until KSP
+ * (or kotlin compiler) fixes the problem. As this uses reflection, it is fail safe such that if it
+ * cannot find the correct order, it will just return in the order KSP returned instead of crashing.
+ */
+internal object KspFieldOrdering {
+    /**
+     * Sorts the given fields in the order they are declared in the backing class declaration.
+     */
+    fun orderFields(
+        owner: KSClassDeclaration,
+        fields: List<KspFieldElement>
+    ): List<KspFieldElement> {
+        // no reason to try to load .class if we don't have any fields to sort
+        if (fields.isEmpty()) return fields
+        val comparator = getFieldNamesComparator(owner)
+        return if (comparator == null) {
+            fields
+        } else {
+            fields.forEach {
+                // make sure each name gets registered so that if we didn't find it in .class for
+                // whatever reason, we keep the order given from KSP.
+                comparator.register(it.name)
+            }
+            fields.sortedWith(comparator)
+        }
+    }
+
+    /**
+     * Builds a field names comparator from the given class declaration if and only if its origin
+     * is CLASS.
+     * If it fails to find the order, returns null.
+     */
+    @Suppress("BanUncheckedReflection")
+    private fun getFieldNamesComparator(
+        ksClassDeclaration: KSClassDeclaration
+    ): FieldNameComparator? {
+        return try {
+            if (ksClassDeclaration.origin != Origin.CLASS) return null
+            val typeReferences = ReflectionReferences.getInstance(ksClassDeclaration) ?: return null
+            val descriptor = typeReferences.getDescriptorMethod.invoke(ksClassDeclaration)
+                ?: return null
+            if (!typeReferences.deserializedClassDescriptor.isInstance(descriptor)) {
+                return null
+            }
+            val descriptorSrc = typeReferences.descriptorSourceMethod.invoke(descriptor)
+                ?: return null
+            if (!typeReferences.kotlinJvmBinarySourceElement.isInstance(descriptorSrc)) {
+                return null
+            }
+            val binarySource = typeReferences.binaryClassMethod.invoke(descriptorSrc)
+                ?: return null
+
+            val fieldNameComparator = FieldNameComparator()
+            val invocationHandler = InvocationHandler { _, method, args ->
+                if (method.name == "visitField") {
+                    val nameAsString = typeReferences.asStringMethod.invoke(args[0])
+                    if (nameAsString is String) {
+                        fieldNameComparator.register(nameAsString)
+                    }
+                }
+                null
+            }
+
+            val proxy = Proxy.newProxyInstance(
+                ksClassDeclaration.javaClass.classLoader,
+                arrayOf(typeReferences.memberVisitor),
+                invocationHandler
+            )
+            typeReferences.visitMembersMethod.invoke(binarySource, proxy, null)
+            fieldNameComparator.seal()
+            fieldNameComparator
+        } catch (ignored: Throwable) {
+            // this is best effort, if it failed, just ignore
+            if (XProcessingConfig.STRICT_MODE) {
+                throw RuntimeException("failed to get fields", ignored)
+            }
+            null
+        }
+    }
+
+    /**
+     * Holder object to keep references to class/method instances.
+     */
+    private class ReflectionReferences private constructor(
+        classLoader: ClassLoader
+    ) {
+
+        val deserializedClassDescriptor: Class<*> = classLoader.loadClass(
+            "org.jetbrains.kotlin.serialization.deserialization.descriptors" +
+                ".DeserializedClassDescriptor"
+        )
+
+        val ksClassDeclarationDescriptorImpl: Class<*> = classLoader.loadClass(
+            "com.google.devtools.ksp.symbol.impl.binary.KSClassDeclarationDescriptorImpl"
+        )
+        val kotlinJvmBinarySourceElement: Class<*> = classLoader.loadClass(
+            "org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement"
+        )
+
+        val kotlinJvmBinaryClass: Class<*> = classLoader.loadClass(
+            "org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass"
+        )
+
+        val memberVisitor: Class<*> = classLoader.loadClass(
+            "org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass\$MemberVisitor"
+        )
+
+        val name: Class<*> = classLoader.loadClass(
+            "org.jetbrains.kotlin.name.Name"
+        )
+
+        val getDescriptorMethod: Method = ksClassDeclarationDescriptorImpl
+            .getDeclaredMethod("getDescriptor")
+
+        val descriptorSourceMethod: Method = deserializedClassDescriptor.getMethod("getSource")
+
+        val binaryClassMethod: Method = kotlinJvmBinarySourceElement.getMethod("getBinaryClass")
+
+        val visitMembersMethod: Method = kotlinJvmBinaryClass.getDeclaredMethod(
+            "visitMembers",
+            memberVisitor, ByteArray::class.java
+        )
+
+        val asStringMethod: Method = name.getDeclaredMethod("asString")
+
+        companion object {
+            private val FAILED = Any()
+            private var instance: Any? = null
+
+            /**
+             * Gets the cached instance or create a new one using the class loader of the given
+             * [ref] parameter.
+             */
+            fun getInstance(ref: Any): ReflectionReferences? {
+                if (instance == null) {
+                    instance = try {
+                        ReflectionReferences(ref::class.java.classLoader)
+                    } catch (ignored: Throwable) {
+                        FAILED
+                    }
+                }
+                return instance as? ReflectionReferences
+            }
+        }
+    }
+
+    private class FieldNameComparator : Comparator<XFieldElement> {
+        private var nextOrder: Int = 0
+        private var sealed: Boolean = false
+        private val orders = mutableMapOf<String, Int>()
+
+        /**
+         * Called when fields are read to lock the ordering.
+         * This is only relevant in tests as at runtime, we just do a best effort (add a new id
+         * for it) and continue.
+         */
+        fun seal() {
+            sealed = true
+        }
+
+        /**
+         * Registers the name with the next order id
+         */
+        fun register(name: String) {
+            getOrder(name)
+        }
+
+        /**
+         * Gets the order of the name. If it was not seen before, adds it to the list, giving it a
+         * new ID.
+         */
+        private fun getOrder(name: String) = orders.getOrPut(name) {
+            if (sealed && XProcessingConfig.STRICT_MODE) {
+                error("expected to find field $name but it is non-existent")
+            }
+            nextOrder++
+        }
+
+        override fun compare(field1: XFieldElement, field2: XFieldElement): Int {
+            return getOrder(field1.name).compareTo(getOrder(field2.name))
+        }
+    }
+}
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMessager.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMessager.kt
index 1497d90..de3c633 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMessager.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMessager.kt
@@ -19,6 +19,7 @@
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XMessager
 import com.google.devtools.ksp.processing.KSPLogger
+import com.google.devtools.ksp.symbol.NonExistLocation
 import javax.tools.Diagnostic
 
 internal class KspMessager(
@@ -26,6 +27,13 @@
 ) : XMessager() {
     override fun onPrintMessage(kind: Diagnostic.Kind, msg: String, element: XElement?) {
         val ksNode = (element as? KspElement)?.declaration
+
+        @Suppress("NAME_SHADOWING") // intentional to avoid reporting without location
+        val msg = if ((ksNode == null || ksNode.location == NonExistLocation) && element != null) {
+            "$msg - ${element.fallbackLocationText}"
+        } else {
+            msg
+        }
         when (kind) {
             Diagnostic.Kind.ERROR -> logger.error(msg, ksNode)
             Diagnostic.Kind.WARNING -> logger.warn(msg, ksNode)
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt
new file mode 100644
index 0000000..864b472
--- /dev/null
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.room.compiler.processing.ksp
+
+import androidx.annotation.VisibleForTesting
+import androidx.room.compiler.processing.XElement
+import androidx.room.compiler.processing.XRoundEnv
+import androidx.room.compiler.processing.XTypeElement
+import com.google.devtools.ksp.symbol.KSClassDeclaration
+
+@VisibleForTesting
+internal class KspRoundEnv(
+    private val env: KspProcessingEnv
+) : XRoundEnv {
+    override val rootElements: Set<XElement>
+        get() = TODO("not supported")
+
+    override fun getTypeElementsAnnotatedWith(klass: Class<out Annotation>): Set<XTypeElement> {
+        return env.resolver.getSymbolsWithAnnotation(
+            klass.canonicalName
+        ).filterIsInstance<KSClassDeclaration>()
+            .map {
+                env.wrapClassDeclaration(it)
+            }.toSet()
+    }
+}
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
index b2ffecd..c6fea2c 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
@@ -108,13 +108,23 @@
      */
     private val _declaredProperties by lazy {
         val declaredProperties = declaration.getDeclaredProperties()
+            .map {
+                KspFieldElement(
+                    env = env,
+                    declaration = it,
+                    containing = this
+                )
+            }.let {
+                // only order instance fields, we don't care about the order of companion fields.
+                KspFieldOrdering.orderFields(declaration, it)
+            }
+
         val companionProperties = declaration
             .findCompanionObject()
             ?.getDeclaredProperties()
             ?.filter {
                 it.isStatic()
             }.orEmpty()
-        (declaredProperties + companionProperties)
             .map {
                 KspFieldElement(
                     env = env,
@@ -122,6 +132,7 @@
                     containing = this
                 )
             }
+        declaredProperties + companionProperties
     }
 
     private val _declaredFieldsIncludingSupers by lazy {
@@ -179,6 +190,11 @@
                 }
                 it.declaration.isPrivate() -> false
                 setter != null -> !setter.modifiers.contains(Modifier.PRIVATE)
+                it.declaration.origin != Origin.KOTLIN -> {
+                    // no reason to generate synthetics non kotlin code. If it had a setter, that
+                    // would show up as a setter
+                    false
+                }
                 else -> it.declaration.isMutable
             }
             if (needsSetter) {
@@ -205,6 +221,11 @@
                 }
                 it.declaration.isPrivate() -> false
                 getter != null -> !getter.modifiers.contains(Modifier.PRIVATE)
+                it.declaration.origin != Origin.KOTLIN -> {
+                    // no reason to generate synthetics non kotlin code. If it had a getter, that
+                    // would show up as a getter
+                    false
+                }
                 else -> true
             }
 
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
index 9b67ea7..aad60a8 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
@@ -79,6 +79,9 @@
         )
     }
 
+    override val fallbackLocationText: String
+        get() = "return type of ${containing.fallbackLocationText}"
+
     override fun asMemberOf(other: XType): XType {
         check(other is KspType)
         val continuation = env.resolver.requireContinuationClass()
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
index 4989024..12326a1 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
@@ -223,11 +223,16 @@
                 delegate = origin.field.declaration.setter?.parameter,
                 filter = NO_USE_SITE
             ) {
-            override val name: String
-                get() = origin.name
+
+            override val name: String by lazy {
+                origin.field.declaration.setter?.parameter?.name?.asString() ?: "value"
+            }
             override val type: XType
                 get() = origin.field.type
 
+            override val fallbackLocationText: String
+                get() = "$name in ${origin.fallbackLocationText}"
+
             override fun asMemberOf(other: XType): XType {
                 return origin.field.asMemberOf(other)
             }
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/FallbackLocationInformationTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/FallbackLocationInformationTest.kt
new file mode 100644
index 0000000..f3ffbc0
--- /dev/null
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/FallbackLocationInformationTest.kt
@@ -0,0 +1,180 @@
+/*
+ * 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.room.compiler.processing
+
+import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.compileFiles
+import androidx.room.compiler.processing.util.getField
+import androidx.room.compiler.processing.util.getMethod
+import androidx.room.compiler.processing.util.runProcessorTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class FallbackLocationInformationTest {
+    @Test
+    fun errorMessageInClassFiles() {
+        val kotlinSource = Source.kotlin(
+            "KotlinSubject.kt",
+            """
+            package foo.bar
+            class KotlinSubject(val constructorProp:Int, constructorArg:Int) {
+                var prop: String = ""
+                var propWithAccessors: String
+                    get() = ""
+                    set(myValue) = TODO()
+                fun method1(arg1: Int): String = ""
+                suspend fun suspendFun(arg1:Int): String = ""
+            }
+            """.trimIndent()
+        )
+
+        val javaSource = Source.java(
+            "foo.bar.JavaSubject",
+            """
+            package foo.bar;
+            class JavaSubject {
+                String field1;
+                // naming this arg0 because javac cannot read the real param name after compilation
+                JavaSubject(int arg0) {
+                }
+                // naming this arg0 because javac cannot read the real param name after compilation
+                void method1(int arg0) {}
+            }
+            """.trimIndent()
+        )
+        // add a placeholder to not run tests w/ javac since we depend on compiled kotlin
+        // sources and javac fails to resolve metadata
+        val placeholder = Source.kotlin("MyPlaceholder.kt", "")
+        val dependency = compileFiles(listOf(kotlinSource, javaSource))
+        runProcessorTest(
+            sources = listOf(placeholder),
+            classpath = listOf(dependency)
+        ) { invocation ->
+            val kotlinSubject = invocation.processingEnv.requireTypeElement("foo.bar.KotlinSubject")
+            assertThat(
+                kotlinSubject.getField("prop").fallbackLocationText
+            ).isEqualTo(
+                "prop in foo.bar.KotlinSubject"
+            )
+            kotlinSubject.getMethod("method1").let { method ->
+                assertThat(
+                    method.fallbackLocationText
+                ).isEqualTo(
+                    "foo.bar.KotlinSubject.method1(int)"
+                )
+                assertThat(
+                    method.parameters.first().fallbackLocationText
+                ).isEqualTo(
+                    "arg1 in foo.bar.KotlinSubject.method1(int)"
+                )
+            }
+            kotlinSubject.getMethod("suspendFun").let { suspendFun ->
+                assertThat(
+                    suspendFun.fallbackLocationText
+                ).isEqualTo(
+                    "foo.bar.KotlinSubject.suspendFun(int)"
+                )
+                assertThat(
+                    suspendFun.parameters.last().fallbackLocationText
+                ).isEqualTo(
+                    "return type of foo.bar.KotlinSubject.suspendFun(int)"
+                )
+            }
+
+            assertThat(
+                kotlinSubject.getMethod("getProp").fallbackLocationText
+            ).isEqualTo(
+                "foo.bar.KotlinSubject.getProp()"
+            )
+            kotlinSubject.getMethod("setProp").let { propSetter ->
+                assertThat(
+                    propSetter.fallbackLocationText
+                ).isEqualTo(
+                    "foo.bar.KotlinSubject.setProp(java.lang.String)"
+                )
+                assertThat(
+                    propSetter.parameters.first().fallbackLocationText
+                ).isEqualTo(
+                    "<set-?> in foo.bar.KotlinSubject.setProp(java.lang.String)"
+                )
+            }
+
+            kotlinSubject.getMethod("setPropWithAccessors").let { propSetter ->
+                // javac does not know that this is synthetic setter
+                assertThat(
+                    propSetter.fallbackLocationText
+                ).isEqualTo(
+                    "foo.bar.KotlinSubject.setPropWithAccessors(java.lang.String)"
+                )
+                assertThat(
+                    propSetter.parameters.first().fallbackLocationText
+                ).isEqualTo(
+                    "myValue in foo.bar.KotlinSubject.setPropWithAccessors(java.lang.String)"
+                )
+            }
+
+            kotlinSubject.getConstructors().single().let { constructor ->
+                assertThat(
+                    constructor.fallbackLocationText
+                ).isEqualTo(
+                    "foo.bar.KotlinSubject.<init>(int, int)"
+                )
+                assertThat(
+                    constructor.parameters.first().fallbackLocationText
+                ).isEqualTo(
+                    "constructorProp in foo.bar.KotlinSubject.<init>" +
+                        "(int, int)"
+                )
+            }
+
+            val javaSubject = invocation.processingEnv.requireTypeElement("foo.bar.JavaSubject")
+            assertThat(
+                javaSubject.fallbackLocationText
+            ).isEqualTo(
+                "foo.bar.JavaSubject"
+            )
+            if (!invocation.isKsp) {
+                // TODO: re-enable after https://github.com/google/ksp/issues/273 is fixed.
+                javaSubject.getConstructors().single().let { constructor ->
+                    assertThat(
+                        constructor.fallbackLocationText
+                    ).isEqualTo(
+                        "foo.bar.JavaSubject.<init>(int)"
+                    )
+                    assertThat(
+                        constructor.parameters.single().fallbackLocationText
+                    ).isEqualTo(
+                        "arg0 in foo.bar.JavaSubject.<init>(int)"
+                    )
+                }
+            }
+
+            assertThat(
+                javaSubject.getField("field1").fallbackLocationText
+            ).isEqualTo(
+                "field1 in foo.bar.JavaSubject"
+            )
+            javaSubject.getMethod("method1").let { method ->
+                assertThat(
+                    method.fallbackLocationText
+                ).isEqualTo(
+                    "foo.bar.JavaSubject.method1(int)"
+                )
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt
index f604802..8f89b73 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.processing.util.CompilationTestCapabilities
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runKaptTest
 import androidx.room.compiler.processing.util.runKspTest
@@ -26,6 +27,7 @@
     @OptIn(ExperimentalStdlibApi::class)
     @Test
     fun testInternalsAndInlines() {
+        CompilationTestCapabilities.assumeKspIsEnabled()
         /**
          * parse same file w/ kapt and KSP and ensure results are the same.
          */
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/JavacTestProcessorTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/JavacTestProcessorTest.kt
index 59412d4..625454e 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/JavacTestProcessorTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/JavacTestProcessorTest.kt
@@ -41,7 +41,7 @@
         val testProcessor = object : JavacTestProcessor() {
             override fun doProcess(annotations: Set<XTypeElement>, roundEnv: XRoundEnv): Boolean {
                 invoked.set(true)
-                val annotatedElements = roundEnv.getElementsAnnotatedWith(
+                val annotatedElements = roundEnv.getTypeElementsAnnotatedWith(
                     OtherAnnotation::class.java
                 )
                 val targetElement = xProcessingEnv.requireTypeElement("foo.bar.Baz")
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/OrderOfFieldsTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/OrderOfFieldsTest.kt
new file mode 100644
index 0000000..24ce1ee
--- /dev/null
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/OrderOfFieldsTest.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.room.compiler.processing
+
+import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.compileFiles
+import androidx.room.compiler.processing.util.getAllFieldNames
+import androidx.room.compiler.processing.util.runProcessorTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+/**
+ * see: https://github.com/google/ksp/issues/250
+ */
+class OrderOfFieldsTest {
+    @Test
+    fun outOfOrderKotlin() {
+        val libSource = Source.kotlin(
+            "lib.kt",
+            """
+            class KotlinClass {
+                val b: String = TODO()
+                val a: String = TODO()
+                val c: String = TODO()
+                val isB:String = TODO()
+                val isA:String = TODO()
+                val isC:String = TODO()
+            }
+            """.trimIndent()
+        )
+        val classpath = compileFiles(listOf(libSource))
+        runProcessorTest(
+            sources = emptyList(),
+            classpath = listOf(classpath)
+        ) { invocation ->
+            val element = invocation.processingEnv.requireTypeElement("KotlinClass")
+            assertThat(element.getAllFieldNames())
+                .containsExactly("b", "a", "c", "isB", "isA", "isC")
+                .inOrder()
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
index b966fb6..0c74d71 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
@@ -17,6 +17,7 @@
 package androidx.room.compiler.processing
 
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithDefaults
+import androidx.room.compiler.processing.testcode.JavaAnnotationWithPrimitiveArray
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithTypeReferences
 import androidx.room.compiler.processing.testcode.JavaEnum
 import androidx.room.compiler.processing.testcode.MainAnnotation
@@ -372,6 +373,7 @@
                         typeElement.toAnnotationBox(JavaAnnotationWithDefaults::class)
                     checkNotNull(annotation)
                     assertThat(annotation.value.intVal).isEqualTo(3)
+                    assertThat(annotation.value.intArrayVal).isEqualTo(intArrayOf(1, 3, 5))
                     assertThat(annotation.value.stringArrayVal).isEqualTo(arrayOf("x", "y"))
                     assertThat(annotation.value.stringVal).isEqualTo("foo")
                     assertThat(
@@ -415,6 +417,47 @@
         }
     }
 
+    @Test
+    fun javaPrimitiveArray() {
+        // TODO: expand this test for other primitive types: 179081610
+        val javaSrc = Source.java(
+            "JavaSubject.java",
+            """
+            import androidx.room.compiler.processing.testcode.*;
+            class JavaSubject {
+                @JavaAnnotationWithPrimitiveArray(intArray = {1, 2, 3})
+                Object annotated1;
+            }
+            """.trimIndent()
+        )
+        val kotlinSrc = Source.kotlin(
+            "KotlinSubject.kt",
+            """
+            import androidx.room.compiler.processing.testcode.*;
+            class KotlinSubject {
+                @JavaAnnotationWithPrimitiveArray(intArray = [1, 2, 3])
+                val annotated1:Any = TODO()
+            }
+            """.trimIndent()
+        )
+        runProcessorTest(
+            sources = listOf(javaSrc, kotlinSrc)
+        ) { invocation ->
+            arrayOf("JavaSubject", "KotlinSubject").map {
+                invocation.processingEnv.requireTypeElement(it)
+            }.forEach { subject ->
+                val annotation = subject.getField("annotated1").toAnnotationBox(
+                    JavaAnnotationWithPrimitiveArray::class
+                )
+                assertThat(
+                    annotation?.value?.intArray
+                ).isEqualTo(
+                    intArrayOf(1, 2, 3)
+                )
+            }
+        }
+    }
+
     // helper function to read what we need
     private fun XAnnotated.getSuppressValues(): Array<String>? {
         return this.toAnnotationBox(SuppressWarnings::class)?.value?.value
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
index c88d944..f705a27 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
@@ -394,6 +394,77 @@
     }
 
     @Test
+    fun propertyGettersSetters() {
+        val dependencyJavaSource = Source.java(
+            "DependencyJavaSubject.java",
+            """
+            class DependencyJavaSubject {
+                int myField;
+                private int mutable;
+                int immutable;
+                int getMutable() {return 3;}
+                void setMutable(int x) {}
+                int getImmutable() {return 3;}
+            }
+            """.trimIndent()
+        )
+        val dependencyKotlinSource = Source.kotlin(
+            "DependencyKotlinSubject.kt",
+            """
+            class DependencyKotlinSubject {
+                private val myField = 0
+                var mutable: Int = 0
+                val immutable:Int = 0
+            }
+            """.trimIndent()
+        )
+        val dependency = compileFiles(listOf(dependencyJavaSource, dependencyKotlinSource))
+        val javaSource = Source.java(
+            "JavaSubject.java",
+            """
+            class JavaSubject {
+                int myField;
+                private int mutable;
+                int immutable;
+                int getMutable() {return 3;}
+                void setMutable(int x) {}
+                int getImmutable() {return 3;}
+            }
+            """.trimIndent()
+        )
+        val kotlinSource = Source.kotlin(
+            "KotlinSubject.kt",
+            """
+            class KotlinSubject {
+                private val myField = 0
+                var mutable: Int = 0
+                val immutable:Int = 0
+            }
+            """.trimIndent()
+        )
+        runProcessorTest(
+            listOf(javaSource, kotlinSource),
+            classpath = listOf(dependency)
+        ) { invocation ->
+            listOf(
+                "JavaSubject", "DependencyJavaSubject",
+                "KotlinSubject", "DependencyKotlinSubject"
+            ).map {
+                invocation.processingEnv.requireTypeElement(it)
+            }.forEach { subject ->
+                assertWithMessage(subject.qualifiedName)
+                    .that(
+                        subject.getDeclaredMethods().map {
+                            it.name
+                        }
+                    ).containsExactly(
+                        "getMutable", "setMutable", "getImmutable"
+                    )
+            }
+        }
+    }
+
+    @Test
     fun declaredAndInstanceMethods() {
         val src = Source.kotlin(
             "Foo.kt",
@@ -805,6 +876,7 @@
                 """.trimIndent()
             )
         )
+
         val classpath = compileFiles(
             createSources("lib")
         )
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt
index 2865715..c830506 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt
@@ -18,6 +18,7 @@
 
 import androidx.room.compiler.processing.javac.JavacProcessingEnv
 import androidx.room.compiler.processing.safeTypeName
+import androidx.room.compiler.processing.util.CompilationTestCapabilities
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.className
 import androidx.room.compiler.processing.util.kspResolver
@@ -167,6 +168,7 @@
      */
     @Test
     fun kaptGoldenTest() {
+        CompilationTestCapabilities.assumeKspIsEnabled()
         val src = Source.kotlin(
             "Foo.kt",
             """
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithDefaults.java b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithDefaults.java
index 26361dc..2a176c6 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithDefaults.java
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithDefaults.java
@@ -25,6 +25,7 @@
     Class<?> typeVal() default HashMap.class;
     Class[] typeArrayVal() default {LinkedHashMap.class};
     int intVal() default 3;
+    int[] intArrayVal() default {1, 3, 5};
     JavaEnum enumVal() default JavaEnum.DEFAULT;
     JavaEnum[] enumArrayVal() default {JavaEnum.VAL1, JavaEnum.VAL2};
     OtherAnnotation otherAnnotationVal() default @OtherAnnotation("def");
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java
new file mode 100644
index 0000000..e594177
--- /dev/null
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java
@@ -0,0 +1,25 @@
+/*
+ * 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.room.compiler.processing.testcode;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+public @interface JavaAnnotationWithPrimitiveArray {
+    int[] intArray() default {};
+}
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index 86d8b57..ed7f3ea 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -250,6 +250,10 @@
     }
 }
 
+tasks.withType(Test).configureEach {
+    it.systemProperty("androidx.room.compiler.processing.strict", "true")
+}
+
 androidx {
     name = "Android Room Compiler"
     type = LibraryType.COMPILER_PLUGIN
diff --git a/room/compiler/src/test/kotlin/androidx/room/ext/XRoundEnvExt.kt b/room/compiler/src/test/kotlin/androidx/room/ext/XRoundEnvExt.kt
deleted file mode 100644
index 10a7dd6..0000000
--- a/room/compiler/src/test/kotlin/androidx/room/ext/XRoundEnvExt.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.room.ext
-
-import androidx.room.compiler.processing.XRoundEnv
-import androidx.room.compiler.processing.XTypeElement
-import androidx.room.compiler.processing.isTypeElement
-
-/**
- * In tests, we frequently want type elements annotated with. This helper does that and ensures
- * we don't receive any element that is not an [XTypeElement].
- */
-fun XRoundEnv.getTypeElementsAnnotatedWith(
-    klass: Class<out Annotation>
-): Set<XTypeElement> {
-    return getElementsAnnotatedWith(klass).map {
-        check(it.isTypeElement())
-        it
-    }.toSet()
-}
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
index 04a7059..105bebb6 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.annotation.NonNull
 import androidx.room.Embedded
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Entity
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
index da5f29a..8e83ba6 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
@@ -20,7 +20,6 @@
 import androidx.room.Embedded
 import androidx.room.Fts3
 import androidx.room.Fts4
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.FtsEntity
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
index 443267a..d951b1a 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
@@ -105,7 +105,7 @@
             .failsToCompile()
             .withErrorContaining(
                 ProcessorErrors.INVALID_ANNOTATION_COUNT_IN_DAO_METHOD +
-                    " - getFoo() in test.library.MissingAnnotationsBaseDao"
+                    " - test.library.MissingAnnotationsBaseDao.getFoo()"
             )
     }
 
@@ -418,7 +418,7 @@
                     )
                     .nextRunHandler { invocation ->
                         val dao = invocation.roundEnv
-                            .getElementsAnnotatedWith(
+                            .getTypeElementsAnnotatedWith(
                                 androidx.room.Dao::class.java
                             )
                             .first()
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index f7df951..9cdfce9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -20,7 +20,6 @@
 import androidx.room.RoomProcessor
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
index 961298c..4531a61 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.Entity
 import androidx.room.compiler.processing.XFieldElement
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.solver.types.ColumnTypeAdapter
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
index 396a54e..b8ee82f 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.Fts4
 import androidx.room.FtsOptions
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
index 71f7bcb..9f5d417 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
@@ -23,7 +23,6 @@
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
index 1ecc005..3d03007 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.processor
 
 import androidx.room.compiler.processing.isTypeElement
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.parser.SqlParser
 import androidx.room.parser.expansion.ProjectionExpander
 import androidx.room.testing.TestInvocation
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
index 48590d0..801d997 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
@@ -27,7 +27,6 @@
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
 import androidx.room.compiler.processing.XType
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
 import androidx.room.solver.query.result.DataSourceFactoryQueryResultBinder
 import androidx.room.solver.query.result.ListQueryResultAdapter
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
index b1104c5..e6b825b 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
@@ -25,7 +25,6 @@
 import androidx.room.RawQuery
 import androidx.room.ext.PagingTypeNames
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.processor.ProcessorErrors.RAW_QUERY_STRING_PARAMETER_REMOVED
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
index 2114900..1810560 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
@@ -24,7 +24,6 @@
 import androidx.room.ext.RxJava3TypeNames
 import androidx.room.compiler.processing.XMethodElement
 import androidx.room.compiler.processing.XType
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.ShortcutMethod
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
index 2ae21b5..8fad90d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
@@ -19,7 +19,6 @@
 import COMMON
 import androidx.room.Dao
 import androidx.room.Transaction
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.TransactionMethod
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
index 7c325d5..cbb67cb 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
@@ -20,7 +20,6 @@
 import androidx.room.Query
 import androidx.room.ext.RoomTypeNames.ROOM_SQL_QUERY
 import androidx.room.ext.RoomTypeNames.STRING_UTIL
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.processor.QueryMethodProcessor
 import androidx.room.testing.TestProcessor
 import androidx.room.writer.QueryWriter
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/InProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/testing/InProcessorTest.kt
index 25c629a..0a14017 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/InProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/InProcessorTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.testing
 
+import androidx.room.compiler.processing.util.CompilationTestCapabilities
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
@@ -44,9 +45,15 @@
             ).isNotNull()
             runCount++
         }
-        // run 3 times: javac, kapt, ksp
+        // run 3 times: javac, kapt, ksp (if enabled)
         assertThat(
             runCount
-        ).isEqualTo(3)
+        ).isEqualTo(
+            2 + if (CompilationTestCapabilities.canTestWithKsp) {
+                1
+            } else {
+                0
+            }
+        )
     }
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
index 5688221..b41b1a5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
@@ -30,7 +30,6 @@
 import androidx.room.ext.RoomRxJava3TypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.processor.DatabaseViewProcessor
 import androidx.room.processor.TableEntityProcessor
 import androidx.room.solver.CodeGenScope
@@ -318,23 +317,4 @@
 
 fun String.toJFO(qName: String): JavaFileObject = JavaFileObjects.forSourceLines(qName, this)
 
-/**
- * Convenience method to convert JFO's to the Source objects in XProcessing so that we can
- * convert room tests to the common API w/o major code refactor
- */
-fun JavaFileObject.toSource(): Source {
-    val uri = this.toUri()
-    // parse name from uri
-    val contents = this.openReader(true).use {
-        it.readText()
-    }
-    val qName = uri.path.replace('/', '.')
-    val javaExt = ".java"
-    check(qName.endsWith(javaExt)) {
-        "expected a java source file, $qName does not seem like one"
-    }
-
-    return Source.java(qName.dropLast(javaExt.length), contents)
-}
-
-fun Collection<JavaFileObject>.toSources() = map { it.toSource() }
+fun Collection<JavaFileObject>.toSources() = map(Source::fromJavaFileObject)
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
index b78e3b3..a8f1e3c 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
@@ -18,7 +18,6 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.processor.DaoProcessor
 import androidx.room.testing.TestProcessor
 import com.google.common.truth.Truth
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
index 6ec2ffd..a61bb70 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.writer
 
 import androidx.annotation.NonNull
-import androidx.room.ext.getTypeElementsAnnotatedWith
 import androidx.room.processor.DatabaseProcessor
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
diff --git a/room/runtime/api/api_lint.ignore b/room/runtime/api/api_lint.ignore
index 09ab8d6..54fc7a2 100644
--- a/room/runtime/api/api_lint.ignore
+++ b/room/runtime/api/api_lint.ignore
@@ -38,7 +38,7 @@
 MissingGetterMatchingBuilder: androidx.room.RoomDatabase.Builder#addCallback(androidx.room.RoomDatabase.Callback):
     T does not declare a `getCallbacks()` method matching method androidx.room.RoomDatabase.Builder.addCallback(androidx.room.RoomDatabase.Callback)
 MissingGetterMatchingBuilder: androidx.room.RoomDatabase.Builder#addMigrations(androidx.room.migration.Migration...):
-    T does not declare a `getMigrationss()` method matching method androidx.room.RoomDatabase.Builder.addMigrations(androidx.room.migration.Migration...)
+    T does not declare a getter method matching method androidx.room.RoomDatabase.Builder.addMigrations(androidx.room.migration.Migration...) (expected one of: [getMigrations(), getMigrationses()])
 MissingGetterMatchingBuilder: androidx.room.RoomDatabase.Builder#addTypeConverter(Object):
     T does not declare a `getTypeConverters()` method matching method androidx.room.RoomDatabase.Builder.addTypeConverter(Object)
 MissingGetterMatchingBuilder: androidx.room.RoomDatabase.Builder#setJournalMode(androidx.room.RoomDatabase.JournalMode):
diff --git a/settings.gradle b/settings.gradle
index 6bd648e..4bcffa2 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -33,7 +33,7 @@
     if (!System.getenv().containsKey("ANDROIDX_PROJECTS")) return null
     String[] requestedFilter = System.getenv("ANDROIDX_PROJECTS").split(",")
     for (String requestedType : requestedFilter) {
-        switch (requestedType) {
+        switch (requestedType.toUpperCase()) {
             case "MAIN":
                 filter.add(BuildType.MAIN)
                 break
@@ -147,12 +147,12 @@
 includeProject(":arch:core:core-testing", "arch/core/core-testing", [BuildType.MAIN])
 includeProject(":asynclayoutinflater:asynclayoutinflater", "asynclayoutinflater/asynclayoutinflater", [BuildType.MAIN])
 includeProject(":autofill:autofill", "autofill/autofill", [BuildType.MAIN])
-includeProject(":benchmark:benchmark-benchmark", "benchmark/benchmark")
+includeProject(":benchmark:benchmark-benchmark", "benchmark/benchmark", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":benchmark:benchmark-common", "benchmark/common")
 includeProject(":benchmark:benchmark-gradle-plugin", "benchmark/gradle-plugin", [BuildType.MAIN])
 includeProject(":benchmark:benchmark-junit4", "benchmark/junit4")
 includeProject(":benchmark:benchmark-macro", "benchmark/macro", [BuildType.MAIN, BuildType.COMPOSE])
-includeProject(":benchmark:benchmark-perfetto", "benchmark/perfetto", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN])
+includeProject(":benchmark:benchmark-macro-junit4", "benchmark/macro-junit4", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":benchmark:integration-tests:crystalball-experiment", "benchmark/integration-tests/crystalball-experiment", [BuildType.MAIN])
 includeProject(":benchmark:integration-tests:dry-run-benchmark", "benchmark/integration-tests/dry-run-benchmark", [BuildType.MAIN])
 includeProject(":benchmark:integration-tests:macrobenchmark", "benchmark/integration-tests/macrobenchmark", [BuildType.MAIN, BuildType.COMPOSE])
@@ -267,6 +267,7 @@
 includeProject(":compose:ui:ui-text", "compose/ui/ui-text", [BuildType.COMPOSE])
 includeProject(":compose:ui:ui-text:ui-text-samples", "compose/ui/ui-text/samples", [BuildType.COMPOSE])
 includeProject(":compose:ui:ui-tooling", "compose/ui/ui-tooling", [BuildType.COMPOSE])
+includeProject(":compose:ui:ui-tooling-data", "compose/ui/ui-tooling-data", [BuildType.COMPOSE])
 includeProject(":compose:ui:ui-unit", "compose/ui/ui-unit", [BuildType.COMPOSE])
 includeProject(":compose:ui:ui-unit:ui-unit-samples", "compose/ui/ui-unit/samples", [BuildType.COMPOSE])
 includeProject(":compose:ui:ui-util", "compose/ui/ui-util", [BuildType.COMPOSE])
@@ -518,6 +519,7 @@
 includeProject(":wear:wear-tiles:wear-tiles-proto", "wear/wear-tiles/wear-tiles-proto",
         [BuildType.MAIN])
 includeProject(":wear:wear-tiles-data", "wear/wear-tiles-data", [BuildType.MAIN])
+includeProject(":wear:wear-tiles-renderer", "wear/wear-tiles-renderer", [BuildType.MAIN])
 includeProject(":wear:wear-watchface", "wear/wear-watchface", [BuildType.MAIN])
 includeProject(":wear:wear-watchface-complications-rendering", "wear/wear-watchface-complications-rendering", [BuildType.MAIN])
 includeProject(":wear:wear-watchface-client", "wear/wear-watchface-client", [BuildType.MAIN])
diff --git a/slices/view/api/current.txt b/slices/view/api/current.txt
index 8f4ab1c..00623eb 100644
--- a/slices/view/api/current.txt
+++ b/slices/view/api/current.txt
@@ -124,6 +124,7 @@
   @RequiresApi(19) public class RowView extends androidx.slice.widget.SliceChildView implements android.widget.AdapterView.OnItemSelectedListener android.view.View.OnClickListener {
     ctor public RowView(android.content.Context);
     method protected java.util.List<java.lang.String!> getEndItemKeys();
+    method protected androidx.slice.SliceItem? getPrimaryActionItem();
     method protected String? getPrimaryActionKey();
     method public void onClick(android.view.View);
     method public void onItemSelected(android.widget.AdapterView<?>, android.view.View, int, long);
diff --git a/slices/view/api/public_plus_experimental_current.txt b/slices/view/api/public_plus_experimental_current.txt
index 8f4ab1c..00623eb 100644
--- a/slices/view/api/public_plus_experimental_current.txt
+++ b/slices/view/api/public_plus_experimental_current.txt
@@ -124,6 +124,7 @@
   @RequiresApi(19) public class RowView extends androidx.slice.widget.SliceChildView implements android.widget.AdapterView.OnItemSelectedListener android.view.View.OnClickListener {
     ctor public RowView(android.content.Context);
     method protected java.util.List<java.lang.String!> getEndItemKeys();
+    method protected androidx.slice.SliceItem? getPrimaryActionItem();
     method protected String? getPrimaryActionKey();
     method public void onClick(android.view.View);
     method public void onItemSelected(android.widget.AdapterView<?>, android.view.View, int, long);
diff --git a/slices/view/api/restricted_current.txt b/slices/view/api/restricted_current.txt
index 490f80e..960fa08 100644
--- a/slices/view/api/restricted_current.txt
+++ b/slices/view/api/restricted_current.txt
@@ -204,6 +204,7 @@
   @RequiresApi(19) public class RowView extends androidx.slice.widget.SliceChildView implements android.widget.AdapterView.OnItemSelectedListener android.view.View.OnClickListener {
     ctor public RowView(android.content.Context);
     method protected java.util.List<java.lang.String!> getEndItemKeys();
+    method protected androidx.slice.SliceItem? getPrimaryActionItem();
     method protected String? getPrimaryActionKey();
     method public void onClick(android.view.View);
     method public void onItemSelected(android.widget.AdapterView<?>, android.view.View, int, long);
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowView.java b/slices/view/src/main/java/androidx/slice/widget/RowView.java
index 08cf037..f094431 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowView.java
@@ -324,6 +324,14 @@
     }
 
     /**
+     * Allows subclasses to access the SliceItem that can be used to fire an action.
+     */
+    @Nullable
+    protected SliceItem getPrimaryActionItem() {
+        return (mRowContent != null) ? mRowContent.getPrimaryAction() : null;
+    }
+
+    /**
      * Allows subclasses to access the key associated with the primary action of the row.
      */
     @Nullable
diff --git a/slices/view/src/main/res/values-fr-rCA/strings.xml b/slices/view/src/main/res/values-fr-rCA/strings.xml
index 6c9ca5b..63c7fcd 100644
--- a/slices/view/src/main/res/values-fr-rCA/strings.xml
+++ b/slices/view/src/main/res/values-fr-rCA/strings.xml
@@ -23,17 +23,14 @@
     <string name="abc_slice_updated" msgid="8155085405396453848">"Mise à jour : <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
       <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> minute</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
       <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> minutes</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
       <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> an</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
       <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> ans</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
       <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> jour</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
       <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> jours</item>
     </plurals>
     <string name="abc_slice_error" msgid="4188371422904147368">"Impossible de se connecter"</string>
diff --git a/slices/view/src/main/res/values-fr/strings.xml b/slices/view/src/main/res/values-fr/strings.xml
index 31238d1..47ff242 100644
--- a/slices/view/src/main/res/values-fr/strings.xml
+++ b/slices/view/src/main/res/values-fr/strings.xml
@@ -23,17 +23,14 @@
     <string name="abc_slice_updated" msgid="8155085405396453848">"Dernière mise à jour : <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
       <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> minute</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
       <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> minutes</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
       <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> an</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
       <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> ans</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
       <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> jour</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
       <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> jours</item>
     </plurals>
     <string name="abc_slice_error" msgid="4188371422904147368">"Impossible de se connecter"</string>
diff --git a/slices/view/src/main/res/values-hy/strings.xml b/slices/view/src/main/res/values-hy/strings.xml
index 962f469..d0a7c06 100644
--- a/slices/view/src/main/res/values-hy/strings.xml
+++ b/slices/view/src/main/res/values-hy/strings.xml
@@ -19,7 +19,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="abc_slice_more" msgid="1983560225998630901">"Ավելին"</string>
-    <string name="abc_slice_show_more" msgid="1567717014004692768">"Ցույց տալ ավելի շատ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Ցույց տալ ավելին"</string>
     <string name="abc_slice_updated" msgid="8155085405396453848">"Թարմացվել է <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
       <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> րոպե առաջ</item>
diff --git a/studiow b/studiow
index 8cf234f..b0ce0e9 100755
--- a/studiow
+++ b/studiow
@@ -12,16 +12,16 @@
   echo
   echo "Project subsets:"
   echo " m, main"
-  echo "  Open the project subset MAIN: non-Compose Jetpack libraries"
+  echo "  Open the project subset main: non-Compose Jetpack libraries"
   echo
   echo " c, compose"
-  echo "  Open the project subset COMPOSE"
+  echo "  Open the project subset compose"
   echo
   echo " f, flan"
-  echo "  Open the project subset FLAN: Fragment, Lifecycle, Activity, and Navigation"
+  echo "  Open the project subset flan: Fragment, Lifecycle, Activity, and Navigation"
   echo
   echo " a, all"
-  echo "  Open the project subset ALL"
+  echo "  Open the project subset all"
   echo
   exit 1
 }
@@ -49,16 +49,16 @@
   subsetArg="$arg"
   newSubset=""
   if [ "$subsetArg" == "m" -o "$subsetArg" == "main" ]; then
-    newSubset=MAIN
+    newSubset=main
   fi
   if [ "$subsetArg" == "c" -o "$subsetArg" == "compose" ]; then
-    newSubset=COMPOSE
+    newSubset=compose
   fi
   if [ "$subsetArg" == "f" -o "$subsetArg" == "flan" ]; then
-    newSubset=FLAN
+    newSubset=flan
   fi
   if [ "$subsetArg" == "a" -o "$subsetArg" == "all" ]; then
-    newSubset=ALL
+    newSubset=all
   fi
   if [ "$newSubset" == "" ]; then
     echo "Unrecognized argument: '$subsetArg'"
diff --git a/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore b/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore
index 3923f22..2b4e6f4 100644
--- a/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore
+++ b/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore
@@ -3,6 +3,10 @@
     Callback method names must follow the on<Something> style: canChildScrollUp
 
 
+GetterSetterNames: androidx.swiperefreshlayout.widget.CircularProgressDrawable#getArrowEnabled():
+    Symmetric method for `setArrowEnabled` must be named `isArrowEnabled`; was `getArrowEnabled`
+
+
 InternalField: androidx.swiperefreshlayout.widget.SwipeRefreshLayout#mFrom:
     Internal field mFrom must not be exposed
 InternalField: androidx.swiperefreshlayout.widget.SwipeRefreshLayout#mOriginalOffsetTop:
diff --git a/testutils/testutils-ktx/src/main/java/androidx/testutils/VerifyWithPolling.kt b/testutils/testutils-ktx/src/main/java/androidx/testutils/VerifyWithPolling.kt
new file mode 100644
index 0000000..0ef3098
--- /dev/null
+++ b/testutils/testutils-ktx/src/main/java/androidx/testutils/VerifyWithPolling.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.testutils
+
+import org.junit.Assert
+
+fun verifyWithPolling(
+    message: String,
+    periodMs: Long,
+    timeoutMs: Long,
+    tryBlock: () -> Boolean
+) {
+    var totalDurationMs = 0L
+    while (!tryBlock()) {
+        Thread.sleep(periodMs)
+
+        totalDurationMs += periodMs
+        if (totalDurationMs > timeoutMs) {
+            Assert.fail(message)
+        }
+    }
+}
\ No newline at end of file
diff --git a/transition/transition/api/api_lint.ignore b/transition/transition/api/api_lint.ignore
index e966073..ec4a1ff 100644
--- a/transition/transition/api/api_lint.ignore
+++ b/transition/transition/api/api_lint.ignore
@@ -3,6 +3,14 @@
     Context is distinct, so it must be the first argument (method `getSceneForLayout`)
 
 
+GetterSetterNames: androidx.transition.ChangeBounds#getResizeClip():
+    Symmetric method for `setResizeClip` must be named `isResizeClip`; was `getResizeClip`
+GetterSetterNames: androidx.transition.ChangeTransform#getReparent():
+    Symmetric method for `setReparent` must be named `isReparent`; was `getReparent`
+GetterSetterNames: androidx.transition.ChangeTransform#getReparentWithOverlay():
+    Symmetric method for `setReparentWithOverlay` must be named `isReparentWithOverlay`; was `getReparentWithOverlay`
+
+
 MissingNullability: androidx.transition.CircularPropagation#getStartDelay(android.view.ViewGroup, androidx.transition.Transition, androidx.transition.TransitionValues, androidx.transition.TransitionValues) parameter #0:
     Missing nullability on parameter `sceneRoot` in method `getStartDelay`
 MissingNullability: androidx.transition.CircularPropagation#getStartDelay(android.view.ViewGroup, androidx.transition.Transition, androidx.transition.TransitionValues, androidx.transition.TransitionValues) parameter #1:
diff --git a/viewpager/viewpager/api/api_lint.ignore b/viewpager/viewpager/api/api_lint.ignore
index 213736e..357127c 100644
--- a/viewpager/viewpager/api/api_lint.ignore
+++ b/viewpager/viewpager/api/api_lint.ignore
@@ -5,6 +5,10 @@
     Parameter type is concrete collection (`java.util.ArrayList`); must be higher-level interface
 
 
+GetterSetterNames: androidx.viewpager.widget.PagerTabStrip#getDrawFullUnderline():
+    Symmetric method for `setDrawFullUnderline` must be named `isDrawFullUnderline`; was `getDrawFullUnderline`
+
+
 ListenerInterface: androidx.viewpager.widget.ViewPager.SimpleOnPageChangeListener:
     Listeners should be an interface, or otherwise renamed Callback: SimpleOnPageChangeListener
 
diff --git a/wear/wear-complications-data/api/api_lint.ignore b/wear/wear-complications-data/api/api_lint.ignore
index 7f2ee21..6795795 100644
--- a/wear/wear-complications-data/api/api_lint.ignore
+++ b/wear/wear-complications-data/api/api_lint.ignore
@@ -19,32 +19,16 @@
     android.support.wearable.complications.ComplicationText does not declare a `getSurroundingText()` method matching method android.support.wearable.complications.ComplicationText.TimeFormatBuilder.setSurroundingText(CharSequence)
 MissingGetterMatchingBuilder: android.support.wearable.complications.ComplicationText.TimeFormatBuilder#setTimeZone(java.util.TimeZone):
     android.support.wearable.complications.ComplicationText does not declare a `getTimeZone()` method matching method android.support.wearable.complications.ComplicationText.TimeFormatBuilder.setTimeZone(java.util.TimeZone)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.BackgroundImageComplicationData.Builder#setTapAction(android.app.PendingIntent):
-    androidx.wear.complications.data.BackgroundImageComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.BackgroundImageComplicationData.Builder.setTapAction(android.app.PendingIntent)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.BackgroundImageComplicationData.Builder#setValidTimeRange(androidx.wear.complications.data.TimeRange):
-    androidx.wear.complications.data.BackgroundImageComplicationData does not declare a `getValidTimeRange()` method matching method androidx.wear.complications.data.BackgroundImageComplicationData.Builder.setValidTimeRange(androidx.wear.complications.data.TimeRange)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.LongTextComplicationData.Builder#setTapAction(android.app.PendingIntent):
     androidx.wear.complications.data.LongTextComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.LongTextComplicationData.Builder.setTapAction(android.app.PendingIntent)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.LongTextComplicationData.Builder#setValidTimeRange(androidx.wear.complications.data.TimeRange):
-    androidx.wear.complications.data.LongTextComplicationData does not declare a `getValidTimeRange()` method matching method androidx.wear.complications.data.LongTextComplicationData.Builder.setValidTimeRange(androidx.wear.complications.data.TimeRange)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.MonochromaticImageComplicationData.Builder#setTapAction(android.app.PendingIntent):
     androidx.wear.complications.data.MonochromaticImageComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.MonochromaticImageComplicationData.Builder.setTapAction(android.app.PendingIntent)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.MonochromaticImageComplicationData.Builder#setValidTimeRange(androidx.wear.complications.data.TimeRange):
-    androidx.wear.complications.data.MonochromaticImageComplicationData does not declare a `getValidTimeRange()` method matching method androidx.wear.complications.data.MonochromaticImageComplicationData.Builder.setValidTimeRange(androidx.wear.complications.data.TimeRange)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.NoPermissionComplicationData.Builder#setTapAction(android.app.PendingIntent):
-    androidx.wear.complications.data.NoPermissionComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.NoPermissionComplicationData.Builder.setTapAction(android.app.PendingIntent)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.RangedValueComplicationData.Builder#setTapAction(android.app.PendingIntent):
     androidx.wear.complications.data.RangedValueComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.RangedValueComplicationData.Builder.setTapAction(android.app.PendingIntent)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.RangedValueComplicationData.Builder#setValidTimeRange(androidx.wear.complications.data.TimeRange):
-    androidx.wear.complications.data.RangedValueComplicationData does not declare a `getValidTimeRange()` method matching method androidx.wear.complications.data.RangedValueComplicationData.Builder.setValidTimeRange(androidx.wear.complications.data.TimeRange)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.ShortTextComplicationData.Builder#setTapAction(android.app.PendingIntent):
     androidx.wear.complications.data.ShortTextComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.ShortTextComplicationData.Builder.setTapAction(android.app.PendingIntent)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.ShortTextComplicationData.Builder#setValidTimeRange(androidx.wear.complications.data.TimeRange):
-    androidx.wear.complications.data.ShortTextComplicationData does not declare a `getValidTimeRange()` method matching method androidx.wear.complications.data.ShortTextComplicationData.Builder.setValidTimeRange(androidx.wear.complications.data.TimeRange)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.SmallImageComplicationData.Builder#setTapAction(android.app.PendingIntent):
     androidx.wear.complications.data.SmallImageComplicationData does not declare a `getTapAction()` method matching method androidx.wear.complications.data.SmallImageComplicationData.Builder.setTapAction(android.app.PendingIntent)
-MissingGetterMatchingBuilder: androidx.wear.complications.data.SmallImageComplicationData.Builder#setValidTimeRange(androidx.wear.complications.data.TimeRange):
-    androidx.wear.complications.data.SmallImageComplicationData does not declare a `getValidTimeRange()` method matching method androidx.wear.complications.data.SmallImageComplicationData.Builder.setValidTimeRange(androidx.wear.complications.data.TimeRange)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.TimeDifferenceComplicationText.Builder#setDisplayAsNow(boolean):
     androidx.wear.complications.data.TimeDifferenceComplicationText does not declare a `isDisplayAsNow()` method matching method androidx.wear.complications.data.TimeDifferenceComplicationText.Builder.setDisplayAsNow(boolean)
 MissingGetterMatchingBuilder: androidx.wear.complications.data.TimeDifferenceComplicationText.Builder#setMinimumUnit(java.util.concurrent.TimeUnit):
diff --git a/wear/wear-complications-data/api/current.txt b/wear/wear-complications-data/api/current.txt
index a0b16ac..6d98164 100644
--- a/wear/wear-complications-data/api/current.txt
+++ b/wear/wear-complications-data/api/current.txt
@@ -208,7 +208,7 @@
   public abstract sealed class ComplicationData {
     method public final android.app.PendingIntent? getTapAction();
     method public final androidx.wear.complications.data.ComplicationType getType();
-    method public final boolean isActiveAt(long dateTimeMillis);
+    method public abstract boolean isActiveAt(long dateTimeMillis);
     property public final android.app.PendingIntent? tapAction;
     property public final androidx.wear.complications.data.ComplicationType type;
   }
@@ -248,6 +248,7 @@
 
   public final class EmptyComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -266,11 +267,14 @@
     method public androidx.wear.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.SmallImage? smallImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -300,14 +304,17 @@
 
   public final class MonochromaticImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage getImage();
+    method public androidx.wear.complications.data.MonochromaticImage getMonochromaticImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage image;
+    property public final androidx.wear.complications.data.MonochromaticImage monochromaticImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class MonochromaticImageComplicationData.Builder {
-    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage image);
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData build();
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
@@ -316,14 +323,16 @@
 
   public final class NoDataComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NoDataComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class NoPermissionComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
+    method public boolean isActiveAt(long dateTimeMillis);
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
@@ -332,13 +341,14 @@
   public static final class NoPermissionComplicationData.Builder {
     ctor public NoPermissionComplicationData.Builder();
     method public androidx.wear.complications.data.NoPermissionComplicationData build();
-    method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
     method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
   }
 
   public final class NotConfiguredComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NotConfiguredComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -354,9 +364,12 @@
 
   public final class PhotoImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.PhotoImage getImage();
+    method public androidx.wear.complications.data.PhotoImage getPhotoImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.PhotoImage image;
+    property public final androidx.wear.complications.data.PhotoImage photoImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -370,18 +383,21 @@
 
   public final class RangedValueComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
     method public float getMax();
     method public float getMin();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
     method public float getValue();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
     property public final float max;
     property public final float min;
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     property public final float value;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
@@ -390,7 +406,7 @@
     ctor public RangedValueComplicationData.Builder(float value, float min, float max);
     method public androidx.wear.complications.data.RangedValueComplicationData build();
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
-    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
@@ -399,13 +415,16 @@
 
   public final class ShortTextComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -413,7 +432,7 @@
     ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
     method public androidx.wear.complications.data.ShortTextComplicationData build();
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
-    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
@@ -436,14 +455,17 @@
 
   public final class SmallImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.SmallImage getImage();
+    method public androidx.wear.complications.data.SmallImage getSmallImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.SmallImage image;
+    property public final androidx.wear.complications.data.SmallImage smallImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class SmallImageComplicationData.Builder {
-    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage image);
+    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage);
     method public androidx.wear.complications.data.SmallImageComplicationData build();
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
diff --git a/wear/wear-complications-data/api/public_plus_experimental_current.txt b/wear/wear-complications-data/api/public_plus_experimental_current.txt
index eca5a1b..910509c 100644
--- a/wear/wear-complications-data/api/public_plus_experimental_current.txt
+++ b/wear/wear-complications-data/api/public_plus_experimental_current.txt
@@ -208,7 +208,7 @@
   public abstract sealed class ComplicationData {
     method public final android.app.PendingIntent? getTapAction();
     method public final androidx.wear.complications.data.ComplicationType getType();
-    method public final boolean isActiveAt(long dateTimeMillis);
+    method public abstract boolean isActiveAt(long dateTimeMillis);
     property public final android.app.PendingIntent? tapAction;
     property public final androidx.wear.complications.data.ComplicationType type;
   }
@@ -250,6 +250,7 @@
   public final class EmptyComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -269,11 +270,14 @@
     method public androidx.wear.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.SmallImage? smallImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -304,14 +308,17 @@
   public final class MonochromaticImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage getImage();
+    method public androidx.wear.complications.data.MonochromaticImage getMonochromaticImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage image;
+    property public final androidx.wear.complications.data.MonochromaticImage monochromaticImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class MonochromaticImageComplicationData.Builder {
-    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage image);
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData build();
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
@@ -321,15 +328,17 @@
   public final class NoDataComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NoDataComplicationData();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class NoPermissionComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
+    method public boolean isActiveAt(long dateTimeMillis);
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
@@ -338,7 +347,7 @@
   public static final class NoPermissionComplicationData.Builder {
     ctor public NoPermissionComplicationData.Builder();
     method public androidx.wear.complications.data.NoPermissionComplicationData build();
-    method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
     method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
   }
@@ -346,6 +355,7 @@
   public final class NotConfiguredComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NotConfiguredComplicationData();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -362,9 +372,12 @@
   public final class PhotoImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.PhotoImage getImage();
+    method public androidx.wear.complications.data.PhotoImage getPhotoImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.PhotoImage image;
+    property public final androidx.wear.complications.data.PhotoImage photoImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -379,18 +392,21 @@
   public final class RangedValueComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
     method public float getMax();
     method public float getMin();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
     method public float getValue();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
     property public final float max;
     property public final float min;
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     property public final float value;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
@@ -399,7 +415,7 @@
     ctor public RangedValueComplicationData.Builder(float value, float min, float max);
     method public androidx.wear.complications.data.RangedValueComplicationData build();
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
-    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
@@ -409,13 +425,16 @@
   public final class ShortTextComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -423,7 +442,7 @@
     ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
     method public androidx.wear.complications.data.ShortTextComplicationData build();
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
-    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
@@ -447,14 +466,17 @@
   public final class SmallImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.SmallImage getImage();
+    method public androidx.wear.complications.data.SmallImage getSmallImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.SmallImage image;
+    property public final androidx.wear.complications.data.SmallImage smallImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class SmallImageComplicationData.Builder {
-    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage image);
+    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage);
     method public androidx.wear.complications.data.SmallImageComplicationData build();
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
diff --git a/wear/wear-complications-data/api/restricted_current.txt b/wear/wear-complications-data/api/restricted_current.txt
index 4586e0c..9d327bf 100644
--- a/wear/wear-complications-data/api/restricted_current.txt
+++ b/wear/wear-complications-data/api/restricted_current.txt
@@ -249,7 +249,7 @@
   public abstract sealed class ComplicationData {
     method public final android.app.PendingIntent? getTapAction();
     method public final androidx.wear.complications.data.ComplicationType getType();
-    method public final boolean isActiveAt(long dateTimeMillis);
+    method public abstract boolean isActiveAt(long dateTimeMillis);
     property public final android.app.PendingIntent? tapAction;
     property public final androidx.wear.complications.data.ComplicationType type;
   }
@@ -301,6 +301,7 @@
   public final class EmptyComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -320,11 +321,14 @@
     method public androidx.wear.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.SmallImage? smallImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -355,14 +359,17 @@
   public final class MonochromaticImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage getImage();
+    method public androidx.wear.complications.data.MonochromaticImage getMonochromaticImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage image;
+    property public final androidx.wear.complications.data.MonochromaticImage monochromaticImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class MonochromaticImageComplicationData.Builder {
-    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage image);
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData build();
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
@@ -372,15 +379,17 @@
   public final class NoDataComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NoDataComplicationData();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class NoPermissionComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
+    method public boolean isActiveAt(long dateTimeMillis);
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
@@ -389,7 +398,7 @@
   public static final class NoPermissionComplicationData.Builder {
     ctor public NoPermissionComplicationData.Builder();
     method public androidx.wear.complications.data.NoPermissionComplicationData build();
-    method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
     method public androidx.wear.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
   }
@@ -397,6 +406,7 @@
   public final class NotConfiguredComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NotConfiguredComplicationData();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -413,9 +423,12 @@
   public final class PhotoImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.PhotoImage getImage();
+    method public androidx.wear.complications.data.PhotoImage getPhotoImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.PhotoImage image;
+    property public final androidx.wear.complications.data.PhotoImage photoImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -430,18 +443,21 @@
   public final class RangedValueComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
     method public float getMax();
     method public float getMin();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
     method public float getValue();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
     property public final float max;
     property public final float min;
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     property public final float value;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
@@ -450,7 +466,7 @@
     ctor public RangedValueComplicationData.Builder(float value, float min, float max);
     method public androidx.wear.complications.data.RangedValueComplicationData build();
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
-    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
@@ -460,13 +476,16 @@
   public final class ShortTextComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.MonochromaticImage? getImage();
+    method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.MonochromaticImage? image;
+    property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -474,7 +493,7 @@
     ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
     method public androidx.wear.complications.data.ShortTextComplicationData build();
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
-    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setImage(androidx.wear.complications.data.MonochromaticImage? image);
+    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
@@ -498,14 +517,17 @@
   public final class SmallImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
-    method public androidx.wear.complications.data.SmallImage getImage();
+    method public androidx.wear.complications.data.SmallImage getSmallImage();
+    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
+    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
-    property public final androidx.wear.complications.data.SmallImage image;
+    property public final androidx.wear.complications.data.SmallImage smallImage;
+    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class SmallImageComplicationData.Builder {
-    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage image);
+    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage);
     method public androidx.wear.complications.data.SmallImageComplicationData build();
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt
index a4f95fb..2291f3a 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt
@@ -29,8 +29,7 @@
 /** Base type for all different types of [ComplicationData] types. */
 public sealed class ComplicationData constructor(
     public val type: ComplicationType,
-    public val tapAction: PendingIntent?,
-    private val validTimeRange: TimeRange?
+    public val tapAction: PendingIntent?
 ) {
     /**
      * Converts this value to [WireComplicationData] object used for serialization.
@@ -48,8 +47,7 @@
      *
      * This must be checked for any time for which the complication will be displayed.
      */
-    public fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
+    public abstract fun isActiveAt(dateTimeMillis: Long): Boolean
 }
 
 /** A pair of id and [ComplicationData]. */
@@ -72,7 +70,9 @@
  * has no data to be displayed. Watch faces may choose whether to render this in some way or
  * leave the slot empty.
  */
-public class NoDataComplicationData : ComplicationData(TYPE, null, TimeRange.ALWAYS) {
+public class NoDataComplicationData : ComplicationData(TYPE, null) {
+    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
+
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     override fun asWireComplicationData(): WireComplicationData = asPlainWireComplicationData(type)
@@ -90,7 +90,9 @@
  * i.e. when the user has chosen "Empty" in the provider chooser. Providers cannot send data of
  * this type.
  */
-public class EmptyComplicationData : ComplicationData(TYPE, null, TimeRange.ALWAYS) {
+public class EmptyComplicationData : ComplicationData(TYPE, null) {
+    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
+
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     override fun asWireComplicationData(): WireComplicationData = asPlainWireComplicationData(type)
@@ -109,8 +111,9 @@
  * complication, and the watch face has not set a default provider. Providers cannot send data
  * of this type.
  */
-public class NotConfiguredComplicationData :
-    ComplicationData(TYPE, null, TimeRange.ALWAYS) {
+public class NotConfiguredComplicationData : ComplicationData(TYPE, null) {
+    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
+
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     override fun asWireComplicationData(): WireComplicationData = asPlainWireComplicationData(type)
@@ -134,11 +137,15 @@
 public class ShortTextComplicationData internal constructor(
     public val text: ComplicationText,
     public val title: ComplicationText?,
-    public val image: MonochromaticImage?,
+    public val monochromaticImage: MonochromaticImage?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    validTimeRange: TimeRange?
-) : ComplicationData(TYPE, tapAction, validTimeRange) {
+    public val validTimeRange: TimeRange?
+) : ComplicationData(TYPE, tapAction) {
+
+    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
+        validTimeRange?.contains(dateTimeMillis) ?: true
+
     /**
      * Builder for [ShortTextComplicationData].
      *
@@ -148,7 +155,7 @@
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var title: ComplicationText? = null
-        private var image: MonochromaticImage? = null
+        private var monochromaticImage: MonochromaticImage? = null
         private var contentDescription: ComplicationText? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -167,8 +174,8 @@
         }
 
         /** Sets optional icon associated with the complication data. */
-        public fun setImage(image: MonochromaticImage?): Builder = apply {
-            this.image = image
+        public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
+            this.monochromaticImage = monochromaticImage
         }
 
         /** Sets optional content description associated with the complication data. */
@@ -181,7 +188,7 @@
             ShortTextComplicationData(
                 text,
                 title,
-                image,
+                monochromaticImage,
                 contentDescription,
                 tapAction,
                 validTimeRange
@@ -195,7 +202,7 @@
             setShortText(text.asWireComplicationText())
             setShortTitle(title?.asWireComplicationText())
             setContentDescription(contentDescription?.asWireComplicationText())
-            image?.addToWireComplicationData(this)
+            monochromaticImage?.addToWireComplicationData(this)
             setTapAction(tapAction)
         }.build()
 
@@ -224,8 +231,12 @@
     public val smallImage: SmallImage?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    validTimeRange: TimeRange?
-) : ComplicationData(TYPE, tapAction, validTimeRange) {
+    public val validTimeRange: TimeRange?
+) : ComplicationData(TYPE, tapAction) {
+
+    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
+        validTimeRange?.contains(dateTimeMillis) ?: true
+
     /**
      * Builder for [LongTextComplicationData].
      *
@@ -316,13 +327,17 @@
     public val value: Float,
     public val min: Float,
     public val max: Float,
-    public val image: MonochromaticImage?,
+    public val monochromaticImage: MonochromaticImage?,
     public val title: ComplicationText?,
     public val text: ComplicationText?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    validTimeRange: TimeRange?
-) : ComplicationData(TYPE, tapAction, validTimeRange) {
+    public val validTimeRange: TimeRange?
+) : ComplicationData(TYPE, tapAction) {
+
+    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
+        validTimeRange?.contains(dateTimeMillis) ?: true
+
     /**
      * Builder for [RangedValueComplicationData].
      *
@@ -335,7 +350,7 @@
     ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
-        private var image: MonochromaticImage? = null
+        private var monochromaticImage: MonochromaticImage? = null
         private var title: ComplicationText? = null
         private var text: ComplicationText? = null
         private var contentDescription: ComplicationText? = null
@@ -351,8 +366,8 @@
         }
 
         /** Sets optional icon associated with the complication data. */
-        public fun setImage(image: MonochromaticImage?): Builder = apply {
-            this.image = image
+        public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
+            this.monochromaticImage = monochromaticImage
         }
 
         /** Sets optional title associated with the complication data. */
@@ -373,7 +388,15 @@
         /** Builds the [RangedValueComplicationData]. */
         public fun build(): RangedValueComplicationData =
             RangedValueComplicationData(
-                value, min, max, image, title, text, contentDescription, tapAction, validTimeRange
+                value,
+                min,
+                max,
+                monochromaticImage,
+                title,
+                text,
+                contentDescription,
+                tapAction,
+                validTimeRange
             )
     }
 
@@ -384,7 +407,7 @@
             setRangedValue(value)
             setRangedMinValue(min)
             setRangedMaxValue(max)
-            image?.addToWireComplicationData(this)
+            monochromaticImage?.addToWireComplicationData(this)
             setShortText(text?.asWireComplicationText())
             setShortTitle(title?.asWireComplicationText())
             setTapAction(tapAction)
@@ -410,17 +433,21 @@
  * description will be used instead.
  */
 public class MonochromaticImageComplicationData internal constructor(
-    public val image: MonochromaticImage,
+    public val monochromaticImage: MonochromaticImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    validTimeRange: TimeRange?
-) : ComplicationData(TYPE, tapAction, validTimeRange) {
+    public val validTimeRange: TimeRange?
+) : ComplicationData(TYPE, tapAction) {
+
+    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
+        validTimeRange?.contains(dateTimeMillis) ?: true
+
     /**
      * Builder for [MonochromaticImageComplicationData].
      *
-     * You must at a minimum set the [image] field.
+     * You must at a minimum set the [monochromaticImage] field.
      */
-    public class Builder(private val image: MonochromaticImage) {
+    public class Builder(private val monochromaticImage: MonochromaticImage) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var contentDescription: ComplicationText? = null
@@ -442,13 +469,18 @@
 
         /** Builds the [MonochromaticImageComplicationData]. */
         public fun build(): MonochromaticImageComplicationData =
-            MonochromaticImageComplicationData(image, contentDescription, tapAction, validTimeRange)
+            MonochromaticImageComplicationData(
+                monochromaticImage,
+                contentDescription,
+                tapAction,
+                validTimeRange
+            )
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     override fun asWireComplicationData(): WireComplicationData =
         WireComplicationDataBuilder(TYPE.asWireComplicationType()).apply {
-            image.addToWireComplicationData(this)
+            monochromaticImage.addToWireComplicationData(this)
             setContentDescription(contentDescription?.asWireComplicationText())
             setTapAction(tapAction)
         }.build()
@@ -472,17 +504,21 @@
  * description will be used instead.
  */
 public class SmallImageComplicationData internal constructor(
-    public val image: SmallImage,
+    public val smallImage: SmallImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    validTimeRange: TimeRange?
-) : ComplicationData(TYPE, tapAction, validTimeRange) {
+    public val validTimeRange: TimeRange?
+) : ComplicationData(TYPE, tapAction) {
+
+    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
+        validTimeRange?.contains(dateTimeMillis) ?: true
+
     /**
      * Builder for [SmallImageComplicationData].
      *
-     * You must at a minimum set the [image] field.
+     * You must at a minimum set the [smallImage] field.
      */
-    public class Builder(private val image: SmallImage) {
+    public class Builder(private val smallImage: SmallImage) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var contentDescription: ComplicationText? = null
@@ -504,13 +540,13 @@
 
         /** Builds the [MonochromaticImageComplicationData]. */
         public fun build(): SmallImageComplicationData =
-            SmallImageComplicationData(image, contentDescription, tapAction, validTimeRange)
+            SmallImageComplicationData(smallImage, contentDescription, tapAction, validTimeRange)
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     override fun asWireComplicationData(): WireComplicationData =
         WireComplicationDataBuilder(TYPE.asWireComplicationType()).apply {
-            image.addToWireComplicationData(this)
+            smallImage.addToWireComplicationData(this)
             setContentDescription(contentDescription?.asWireComplicationText())
             setTapAction(tapAction)
         }.build()
@@ -536,11 +572,15 @@
  * description will be used instead.
  */
 public class PhotoImageComplicationData internal constructor(
-    public val image: PhotoImage,
+    public val photoImage: PhotoImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    validTimeRange: TimeRange?
-) : ComplicationData(TYPE, tapAction, validTimeRange) {
+    public val validTimeRange: TimeRange?
+) : ComplicationData(TYPE, tapAction) {
+
+    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
+        validTimeRange?.contains(dateTimeMillis) ?: true
+
     /**
      * Builder for [PhotoImageComplicationData].
      *
@@ -576,7 +616,7 @@
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     override fun asWireComplicationData(): WireComplicationData =
         WireComplicationDataBuilder(TYPE.asWireComplicationType()).apply {
-            image.addToWireComplicationData(this)
+            photoImage.addToWireComplicationData(this)
             setContentDescription(contentDescription?.asWireComplicationText())
         }.build()
 
@@ -601,8 +641,11 @@
 public class NoPermissionComplicationData internal constructor(
     public val text: ComplicationText?,
     public val title: ComplicationText?,
-    public val image: MonochromaticImage?,
-) : ComplicationData(TYPE, null, TimeRange.ALWAYS) {
+    public val monochromaticImage: MonochromaticImage?,
+) : ComplicationData(TYPE, null) {
+
+    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
+
     /**
      * Builder for [NoPermissionComplicationData].
      *
@@ -612,7 +655,7 @@
         private var tapAction: PendingIntent? = null
         private var text: ComplicationText? = null
         private var title: ComplicationText? = null
-        private var image: MonochromaticImage? = null
+        private var monochromaticImage: MonochromaticImage? = null
 
         /** Sets optional text associated with the complication data. */
         public fun setText(text: ComplicationText?): Builder = apply {
@@ -625,13 +668,13 @@
         }
 
         /** Sets optional icon associated with the complication data. */
-        public fun setImage(image: MonochromaticImage?): Builder = apply {
-            this.image = image
+        public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
+            this.monochromaticImage = monochromaticImage
         }
 
         /** Builds the [NoPermissionComplicationData]. */
         public fun build(): NoPermissionComplicationData =
-            NoPermissionComplicationData(text, title, image)
+            NoPermissionComplicationData(text, title, monochromaticImage)
     }
 
     /** @hide */
@@ -640,7 +683,7 @@
         WireComplicationDataBuilder(TYPE.asWireComplicationType()).apply {
             setShortText(text?.asWireComplicationText())
             setShortTitle(title?.asWireComplicationText())
-            image?.addToWireComplicationData(this)
+            monochromaticImage?.addToWireComplicationData(this)
         }.build()
 
     /** @hide */
@@ -666,7 +709,7 @@
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setTitle(shortTitle?.asApiComplicationText())
-                setImage(parseIcon())
+                setMonochromaticImage(parseIcon())
                 setContentDescription(contentDescription?.asApiComplicationText())
             }.build()
 
@@ -687,7 +730,7 @@
             ).apply {
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
-                setImage(parseIcon())
+                setMonochromaticImage(parseIcon())
                 setTitle(shortTitle?.asApiComplicationText())
                 setText(shortText?.asApiComplicationText())
                 setContentDescription(contentDescription?.asApiComplicationText())
@@ -715,7 +758,7 @@
 
         NoPermissionComplicationData.TYPE.asWireComplicationType() ->
             NoPermissionComplicationData.Builder().apply {
-                setImage(parseIcon())
+                setMonochromaticImage(parseIcon())
                 setTitle(shortTitle?.asApiComplicationText())
                 setText(shortText?.asApiComplicationText())
             }.build()
diff --git a/wear/wear-complications-provider/api/current.txt b/wear/wear-complications-provider/api/current.txt
index 94feaa3..0b2e291 100644
--- a/wear/wear-complications-provider/api/current.txt
+++ b/wear/wear-complications-provider/api/current.txt
@@ -9,7 +9,7 @@
     method @UiThread public void onComplicationDeactivated(int);
     method @UiThread public abstract void onComplicationUpdate(int, androidx.wear.complications.data.ComplicationType, androidx.wear.complications.ComplicationProviderService.ComplicationUpdateCallback);
     field public static final String ACTION_COMPLICATION_UPDATE_REQUEST = "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
-    field public static final String CATEGORY_PROVIDER_CONFIG_ACTION = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final String CATEGORY_PROVIDER_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
     field public static final String EXTRA_CONFIG_COMPLICATION_ID = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
     field public static final String EXTRA_CONFIG_COMPLICATION_TYPE = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
     field public static final String EXTRA_CONFIG_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
diff --git a/wear/wear-complications-provider/api/public_plus_experimental_current.txt b/wear/wear-complications-provider/api/public_plus_experimental_current.txt
index 94feaa3..0b2e291 100644
--- a/wear/wear-complications-provider/api/public_plus_experimental_current.txt
+++ b/wear/wear-complications-provider/api/public_plus_experimental_current.txt
@@ -9,7 +9,7 @@
     method @UiThread public void onComplicationDeactivated(int);
     method @UiThread public abstract void onComplicationUpdate(int, androidx.wear.complications.data.ComplicationType, androidx.wear.complications.ComplicationProviderService.ComplicationUpdateCallback);
     field public static final String ACTION_COMPLICATION_UPDATE_REQUEST = "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
-    field public static final String CATEGORY_PROVIDER_CONFIG_ACTION = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final String CATEGORY_PROVIDER_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
     field public static final String EXTRA_CONFIG_COMPLICATION_ID = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
     field public static final String EXTRA_CONFIG_COMPLICATION_TYPE = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
     field public static final String EXTRA_CONFIG_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
diff --git a/wear/wear-complications-provider/api/restricted_current.txt b/wear/wear-complications-provider/api/restricted_current.txt
index 4d26b059..f0223ea 100644
--- a/wear/wear-complications-provider/api/restricted_current.txt
+++ b/wear/wear-complications-provider/api/restricted_current.txt
@@ -9,7 +9,7 @@
     method @UiThread public void onComplicationDeactivated(int);
     method @UiThread public abstract void onComplicationUpdate(int, androidx.wear.complications.data.ComplicationType, androidx.wear.complications.ComplicationProviderService.ComplicationUpdateCallback);
     field public static final String ACTION_COMPLICATION_UPDATE_REQUEST = "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
-    field public static final String CATEGORY_PROVIDER_CONFIG_ACTION = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final String CATEGORY_PROVIDER_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
     field public static final String EXTRA_CONFIG_COMPLICATION_ID = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
     field public static final String EXTRA_CONFIG_COMPLICATION_TYPE = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
     field public static final String EXTRA_CONFIG_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
diff --git a/wear/wear-complications-provider/build.gradle b/wear/wear-complications-provider/build.gradle
index 21a6584..227268b 100644
--- a/wear/wear-complications-provider/build.gradle
+++ b/wear/wear-complications-provider/build.gradle
@@ -30,7 +30,6 @@
     api("androidx.annotation:annotation:1.1.0")
     api(project(":wear:wear-complications-data"))
 
-    implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.preference:preference:1.1.0")
     testImplementation(ANDROIDX_TEST_CORE)
diff --git a/wear/wear-complications-provider/samples/build.gradle b/wear/wear-complications-provider/samples/build.gradle
index 12cf1d1..602de21 100644
--- a/wear/wear-complications-provider/samples/build.gradle
+++ b/wear/wear-complications-provider/samples/build.gradle
@@ -23,7 +23,6 @@
 }
 
 dependencies {
-    implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.core:core:1.1.0")
     api(project(":wear:wear-complications-provider"))
     api(GUAVA_ANDROID)
diff --git a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java
index 594b8cd..9dd678c 100644
--- a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java
+++ b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java
@@ -217,7 +217,7 @@
      *
      * <p>The configuration activity must reside in the same package as the provider, and must
      * register an intent filter for the action specified here, including {@link
-     * #CATEGORY_PROVIDER_CONFIG_ACTION} as well as {@link Intent#CATEGORY_DEFAULT} as categories.
+     * #CATEGORY_PROVIDER_CONFIG} as well as {@link Intent#CATEGORY_DEFAULT} as categories.
      *
      * <p>The complication id being configured will be included in the intent that starts the config
      * activity using the extra key {@link #EXTRA_CONFIG_COMPLICATION_ID}.
@@ -244,7 +244,7 @@
      * @see #METADATA_KEY_PROVIDER_CONFIG_ACTION
      */
     @SuppressLint("IntentName")
-    public static final String CATEGORY_PROVIDER_CONFIG_ACTION =
+    public static final String CATEGORY_PROVIDER_CONFIG =
             "android.support.wearable.complications.category.PROVIDER_CONFIG";
 
     /** Extra used to supply the complication id to a provider configuration activity. */
diff --git a/wear/wear-tiles-renderer/build.gradle b/wear/wear-tiles-renderer/build.gradle
new file mode 100644
index 0000000..622a4e2
--- /dev/null
+++ b/wear/wear-tiles-renderer/build.gradle
@@ -0,0 +1,72 @@
+/*
+ * 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 static androidx.build.dependencies.DependenciesKt.*
+
+import androidx.build.BundleInsideHelper
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+import androidx.build.RunApiTasks
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+BundleInsideHelper.forInsideAar(
+        project,
+        /* from = */ "com.google.protobuf",
+        /* to =   */ "androidx.wear.tiles.protobuf"
+)
+
+dependencies {
+    bundleInside(project(path: ":wear:wear-tiles:wear-tiles-proto", configuration: "export"))
+    api("androidx.annotation:annotation:1.1.0")
+    api(GUAVA_LISTENABLE_FUTURE)
+    implementation(PROTOBUF_LITE)
+    implementation 'androidx.annotation:annotation:1.2.0-alpha01'
+
+    testImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    testImplementation(ANDROIDX_TEST_EXT_TRUTH)
+    testImplementation(ANDROIDX_TEST_CORE)
+    testImplementation(ANDROIDX_TEST_RUNNER)
+    testImplementation(ANDROIDX_TEST_RULES)
+    testImplementation(ROBOLECTRIC)
+    testImplementation(MOCKITO_CORE)
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 26
+        targetSdkVersion 28
+    }
+
+    // Use Robolectric 4.+
+    testOptions.unitTests.includeAndroidResources = true
+}
+
+androidx {
+    name = "Android Wear Tiles Renderer"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.WEAR
+    // Tie the versions together to keep everything simpler.
+    mavenVersion = LibraryVersions.WEAR_TILES
+    runApiTasks = new RunApiTasks.No("API tracking disabled while the package is empty")
+    inceptionYear = "2021"
+    description = "Android Wear Tiles Renderer components. These components can be used to parse " +
+            "and render an already constructued Wear Tile."
+}
diff --git a/wear/wear-tiles-renderer/src/main/AndroidManifest.xml b/wear/wear-tiles-renderer/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7a1958f
--- /dev/null
+++ b/wear/wear-tiles-renderer/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.wear.tiles.renderer">
+</manifest>
diff --git a/wear/wear-tiles-renderer/src/main/java/androidx/wear/tiles/renderer/package-info.java b/wear/wear-tiles-renderer/src/main/java/androidx/wear/tiles/renderer/package-info.java
new file mode 100644
index 0000000..34b8b9a
--- /dev/null
+++ b/wear/wear-tiles-renderer/src/main/java/androidx/wear/tiles/renderer/package-info.java
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.wear.tiles.renderer;
diff --git a/wear/wear-watchface-client/api/current.txt b/wear/wear-watchface-client/api/current.txt
index 84073a2..2ea3b7b 100644
--- a/wear/wear-watchface-client/api/current.txt
+++ b/wear/wear-watchface-client/api/current.txt
@@ -117,15 +117,15 @@
   }
 
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.HeadlessWatchFaceClient> createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
-    method public default static androidx.wear.watchface.client.WatchFaceControlClient createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceSysUiClient> getInteractiveWatchFaceSysUiClientInstance(String instanceId);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceWcsClient> getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.SystemState systemState, java.util.Map<java.lang.String,java.lang.String>? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
+    method public default static suspend Object? createWatchFaceControlClient(android.content.Context p, String context, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> watchFacePackageName);
+    method public androidx.wear.watchface.client.InteractiveWatchFaceSysUiClient? getInteractiveWatchFaceSysUiClientInstance(String instanceId);
+    method public kotlinx.coroutines.Deferred<androidx.wear.watchface.client.InteractiveWatchFaceWcsClient> getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.SystemState systemState, java.util.Map<java.lang.String,java.lang.String>? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
   }
 
   public static final class WatchFaceControlClient.Companion {
-    method public androidx.wear.watchface.client.WatchFaceControlClient createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+    method public suspend Object? createWatchFaceControlClient(android.content.Context context, String watchFacePackageName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p);
   }
 
   public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
diff --git a/wear/wear-watchface-client/api/public_plus_experimental_current.txt b/wear/wear-watchface-client/api/public_plus_experimental_current.txt
index fcd1901..b13877d 100644
--- a/wear/wear-watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-client/api/public_plus_experimental_current.txt
@@ -117,15 +117,15 @@
   }
 
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.HeadlessWatchFaceClient> createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
-    method public default static androidx.wear.watchface.client.WatchFaceControlClient createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceSysUiClient> getInteractiveWatchFaceSysUiClientInstance(String instanceId);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceWcsClient> getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.SystemState systemState, java.util.Map<java.lang.String,java.lang.String>? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
+    method public default static suspend Object? createWatchFaceControlClient(android.content.Context p, String context, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> watchFacePackageName);
+    method public androidx.wear.watchface.client.InteractiveWatchFaceSysUiClient? getInteractiveWatchFaceSysUiClientInstance(String instanceId);
+    method public kotlinx.coroutines.Deferred<androidx.wear.watchface.client.InteractiveWatchFaceWcsClient> getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.SystemState systemState, java.util.Map<java.lang.String,java.lang.String>? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
   }
 
   public static final class WatchFaceControlClient.Companion {
-    method public androidx.wear.watchface.client.WatchFaceControlClient createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+    method public suspend Object? createWatchFaceControlClient(android.content.Context context, String watchFacePackageName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p);
   }
 
   public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
diff --git a/wear/wear-watchface-client/api/restricted_current.txt b/wear/wear-watchface-client/api/restricted_current.txt
index 03eda03..3edc680 100644
--- a/wear/wear-watchface-client/api/restricted_current.txt
+++ b/wear/wear-watchface-client/api/restricted_current.txt
@@ -121,15 +121,15 @@
   }
 
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.HeadlessWatchFaceClient> createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
-    method public default static androidx.wear.watchface.client.WatchFaceControlClient createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceSysUiClient> getInteractiveWatchFaceSysUiClientInstance(String instanceId);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceWcsClient> getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.SystemState systemState, java.util.Map<java.lang.String,java.lang.String>? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
+    method public default static suspend Object? createWatchFaceControlClient(android.content.Context p, String context, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> watchFacePackageName);
+    method public androidx.wear.watchface.client.InteractiveWatchFaceSysUiClient? getInteractiveWatchFaceSysUiClientInstance(String instanceId);
+    method public kotlinx.coroutines.Deferred<androidx.wear.watchface.client.InteractiveWatchFaceWcsClient> getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.SystemState systemState, java.util.Map<java.lang.String,java.lang.String>? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
   }
 
   public static final class WatchFaceControlClient.Companion {
-    method public androidx.wear.watchface.client.WatchFaceControlClient createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+    method public suspend Object? createWatchFaceControlClient(android.content.Context context, String watchFacePackageName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p);
   }
 
   public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
diff --git a/wear/wear-watchface-client/build.gradle b/wear/wear-watchface-client/build.gradle
index b5c1d3f..969e7ff 100644
--- a/wear/wear-watchface-client/build.gradle
+++ b/wear/wear-watchface-client/build.gradle
@@ -34,6 +34,7 @@
     api(project(":wear:wear-watchface-data"))
     api(project(":wear:wear-watchface-style"))
     api(project(":wear:wear-complications-data"))
+    api(KOTLIN_COROUTINES_ANDROID)
 
     androidTestImplementation project(":test-screenshot")
     androidTestImplementation project(":wear:wear-watchface-samples")
@@ -46,7 +47,6 @@
     androidTestImplementation(TRUTH)
 
     implementation("androidx.core:core:1.1.0")
-    implementation("androidx.concurrent:concurrent-futures:1.0.0")
 }
 
 android {
diff --git a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index d62372f..1bfaac4 100644
--- a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -40,7 +40,7 @@
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.client.DeviceConfig
 import androidx.wear.watchface.client.SystemState
-import androidx.wear.watchface.client.WatchFaceControlClientImpl
+import androidx.wear.watchface.client.WatchFaceControlClient
 import androidx.wear.watchface.control.WatchFaceControlService
 import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.samples.BLUE_STYLE
@@ -55,6 +55,8 @@
 import androidx.wear.watchface.samples.WATCH_HAND_LENGTH_STYLE_SETTING
 import androidx.wear.watchface.style.Layer
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeout
 import org.junit.After
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNull
@@ -75,12 +77,14 @@
 @MediumTest
 class WatchFaceControlClientTest {
     private val context = ApplicationProvider.getApplicationContext<Context>()
-    private val service = WatchFaceControlClientImpl(
-        context,
-        Intent(context, WatchFaceControlTestService::class.java).apply {
-            action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
-        }
-    )
+    private val service = runBlocking {
+        WatchFaceControlClient.createWatchFaceControlClientImpl(
+            context,
+            Intent(context, WatchFaceControlTestService::class.java).apply {
+                action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
+            }
+        )
+    }
 
     @Mock
     private lateinit var surfaceHolder: SurfaceHolder
@@ -93,6 +97,9 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
         wallpaperService = TestExampleCanvasAnalogWatchFaceService(context, surfaceHolder)
+
+        Mockito.`when`(surfaceHolder.surfaceFrame)
+            .thenReturn(Rect(0, 0, 400, 400))
     }
 
     @After
@@ -154,7 +161,7 @@
             ),
             400,
             400
-        ).get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        )!!
         val bitmap = headlessInstance.takeWatchFaceScreenshot(
             RenderParameters(
                 DrawMode.INTERACTIVE,
@@ -188,7 +195,7 @@
             ),
             400,
             400
-        ).get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        )!!
         val bitmap = headlessInstance.takeWatchFaceScreenshot(
             RenderParameters(
                 DrawMode.INTERACTIVE,
@@ -218,7 +225,7 @@
             deviceConfig,
             400,
             400
-        ).get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        )!!
 
         assertThat(headlessInstance.complicationState.size).isEqualTo(2)
 
@@ -272,7 +279,7 @@
             deviceConfig,
             400,
             400
-        ).get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        )!!
 
         assertThat(headlessInstance.userStyleSchema.userStyleSettings.size).isEqualTo(4)
         assertThat(headlessInstance.userStyleSchema.userStyleSettings[0].id).isEqualTo(
@@ -293,8 +300,8 @@
 
     @Test
     fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -302,14 +309,15 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
         val interactiveInstance =
-            interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+            runBlocking {
+                withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                    deferredInteractiveInstance.await()
+                }
+            }
 
         val bitmap = interactiveInstance.takeWatchFaceScreenshot(
             RenderParameters(
@@ -333,8 +341,8 @@
 
     @Test
     fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient_initialStyle() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -347,14 +355,15 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
         val interactiveInstance =
-            interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+            runBlocking {
+                withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                    deferredInteractiveInstance.await()
+                }
+            }
 
         val bitmap = interactiveInstance.takeWatchFaceScreenshot(
             RenderParameters(
@@ -378,8 +387,8 @@
 
     @Test
     fun wallpaperServiceBackedInteractiveWatchFaceWcsClient_ComplicationDetails() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -387,14 +396,15 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
         val interactiveInstance =
-            interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+            runBlocking {
+                withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                    deferredInteractiveInstance.await()
+                }
+            }
 
         interactiveInstance.updateComplicationData(
             mapOf(
@@ -458,22 +468,26 @@
 
     @Test
     fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient_existingOpenInstance() {
-        service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
-            "testId",
-            deviceConfig,
-            systemState,
-            null,
-            complications
-        )
-
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
 
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
+        runBlocking {
+            withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                deferredInteractiveInstance.await()
+            }
+        }
+
         val existingInstance =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -481,13 +495,13 @@
                 complications
             )
 
-        assertTrue(existingInstance.isDone)
+        assertTrue(existingInstance.isCompleted)
     }
 
     @Test
     fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient_existingClosedInstance() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -495,23 +509,24 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
         // Wait for the instance to be created.
         val interactiveInstance =
-            interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+            runBlocking {
+                withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                    deferredInteractiveInstance.await()
+                }
+            }
 
         // Closing this interface means the subsequent
         // getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient won't immediately return
         // a resolved future.
         interactiveInstance.close()
 
-        val existingInstance =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredExistingInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -519,17 +534,21 @@
                 complications
             )
 
-        assertFalse(existingInstance.isDone)
+        assertFalse(deferredExistingInstance.isCompleted)
 
         // We don't want to leave a pending request or it'll mess up subsequent tests.
         handler.post { engine = wallpaperService.onCreateEngine() }
-        existingInstance.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        runBlocking {
+            withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                deferredExistingInstance.await()
+            }
+        }
     }
 
     @Test
     fun getInteractiveWatchFaceInstanceSysUi() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -537,17 +556,18 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
         // Wait for the instance to be created.
-        interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        runBlocking {
+            withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                deferredInteractiveInstance.await()
+            }
+        }
 
-        val sysUiInterface = service.getInteractiveWatchFaceSysUiClientInstance("testId")
-            .get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        val sysUiInterface =
+            service.getInteractiveWatchFaceSysUiClientInstance("testId")!!
 
         val contentDescriptionLabels = sysUiInterface.contentDescriptionLabels
         assertThat(contentDescriptionLabels.size).isEqualTo(3)
@@ -569,8 +589,8 @@
 
     @Test
     fun setUserStyle() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -583,15 +603,15 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
         // Wait for the instance to be created.
-        val interactiveInstance =
-            interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        val interactiveInstance = runBlocking {
+            withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                deferredInteractiveInstance.await()
+            }
+        }
 
         // Note this map doesn't include all the categories, which is fine the others will be set
         // to their defaults.
@@ -625,8 +645,8 @@
 
     @Test
     fun getComplicationIdAt() {
-        val interactiveInstanceFuture =
-            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+        val deferredInteractiveInstance =
+            service.getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
                 "testId",
                 deviceConfig,
                 systemState,
@@ -634,14 +654,14 @@
                 complications
             )
 
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
-
         // Create the engine which triggers creation of InteractiveWatchFaceWcsClient.
         createEngine()
 
-        val interactiveInstance =
-            interactiveInstanceFuture.get(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)!!
+        val interactiveInstance = runBlocking {
+            withTimeout(CONNECT_TIMEOUT_MILLIS) {
+                deferredInteractiveInstance.await()
+            }
+        }
 
         assertNull(interactiveInstance.getComplicationIdAt(0, 0))
         assertThat(interactiveInstance.getComplicationIdAt(85, 165)).isEqualTo(
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index ef61893..79aab34 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -16,12 +16,12 @@
 
 package androidx.wear.watchface.client
 
+import android.annotation.SuppressLint
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
 import android.content.ServiceConnection
 import android.os.IBinder
-import androidx.concurrent.futures.ResolvableFuture
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.watchface.control.IInteractiveWatchFaceWCS
 import androidx.wear.watchface.control.IPendingInteractiveWatchFaceWCS
@@ -32,7 +32,8 @@
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.data.UserStyleWireFormat
-import com.google.common.util.concurrent.ListenableFuture
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
 
 /**
  * Connects to a watch face's WatchFaceControlService which allows the user to control the watch
@@ -43,25 +44,51 @@
     public companion object {
         /**
          * Constructs a [WatchFaceControlClient] which attempts to connect to a watch face in the
-         * android package [watchFacePackageName]. If this fails the [ListenableFuture]s returned by
-         * WatchFaceControlClient methods will fail with [ServiceNotBoundException].
+         * android package [watchFacePackageName].
+         * @throws [ServiceNotBoundException] if the watch face control service can not be bound.
          */
+        @SuppressLint("NewApi") // For ACTION_WATCHFACE_CONTROL_SERVICE
         @JvmStatic
-        public fun createWatchFaceControlClient(
+        public suspend fun createWatchFaceControlClient(
             /** Calling application's [Context]. */
             context: Context,
             /** The name of the package containing the watch face control service to bind to. */
             watchFacePackageName: String
-        ): WatchFaceControlClient = WatchFaceControlClientImpl(
+        ): WatchFaceControlClient = createWatchFaceControlClientImpl(
             context,
             Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE).apply {
-                this.setPackage(watchFacePackageName)
+                setPackage(watchFacePackageName)
             }
         )
+
+        internal suspend fun createWatchFaceControlClientImpl(
+            context: Context,
+            intent: Intent
+        ): WatchFaceControlClient {
+            val deferredService = CompletableDeferred<IWatchFaceControlService>()
+            val serviceConnection = object : ServiceConnection {
+                override fun onServiceConnected(name: ComponentName, binder: IBinder) {
+                    deferredService.complete(IWatchFaceControlService.Stub.asInterface(binder))
+                }
+
+                override fun onServiceDisconnected(name: ComponentName?) {
+                    // Nothing to do here, if the service is dead then a RemoteException will be
+                    // thrown by methods attempting to use it.
+                }
+            }
+            if (!context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)) {
+                throw ServiceNotBoundException()
+            }
+            return WatchFaceControlClientImpl(
+                context,
+                deferredService.await(),
+                serviceConnection
+            )
+        }
     }
 
     /**
-     * Exception thrown by [WatchFaceControlClient] methods when the remote service is not bound.
+     * Exception thrown by [createWatchFaceControlClient] if the remote service can't be bound.
      */
     public class ServiceNotBoundException : Exception()
 
@@ -75,13 +102,12 @@
      * When finished call [InteractiveWatchFaceSysUiClient.close] to release resources.
      *
      * @param instanceId The name of the interactive watch face instance to retrieve
-     * @return A [ListenableFuture] for the [InteractiveWatchFaceSysUiClient] or `null` if
-     *    [instanceId] is unrecognized, or [ServiceNotBoundException] if the
-     *    WatchFaceControlService is not bound.
+     * @return The [InteractiveWatchFaceSysUiClient] or `null` if [instanceId] is unrecognized,
+     *    or [ServiceNotBoundException] if the WatchFaceControlService is not bound.
      */
     public fun getInteractiveWatchFaceSysUiClientInstance(
         instanceId: String
-    ): ListenableFuture<InteractiveWatchFaceSysUiClient?>
+    ): InteractiveWatchFaceSysUiClient?
 
     /**
      * Creates a [HeadlessWatchFaceClient] with the specified [DeviceConfig]. Screenshots made with
@@ -96,16 +122,15 @@
      * @param deviceConfig The hardware [DeviceConfig]
      * @param surfaceWidth The width of screen shots taken by the [HeadlessWatchFaceClient]
      * @param surfaceHeight The height of screen shots taken by the [HeadlessWatchFaceClient]
-     * @return A [ListenableFuture] for the [HeadlessWatchFaceClient] or `null` if [watchFaceName]
-     *    is unrecognized, or [ServiceNotBoundException] if the WatchFaceControlService is not
-     *    bound.
+     * @return The [HeadlessWatchFaceClient] or `null` if [watchFaceName] is unrecognized, or
+     *    [ServiceNotBoundException] if the WatchFaceControlService is not bound.
      */
     public fun createHeadlessWatchFaceClient(
         watchFaceName: ComponentName,
         deviceConfig: DeviceConfig,
         surfaceWidth: Int,
         surfaceHeight: Int
-    ): ListenableFuture<HeadlessWatchFaceClient?>
+    ): HeadlessWatchFaceClient?
 
     /**
      * Requests either an existing [InteractiveWatchFaceWcsClient] with the specified [id] or
@@ -120,169 +145,115 @@
      * @param userStyle The initial style map (see [UserStyle]), or null if the default should be
      *     used.
      * @param idToComplicationData The initial complication data, or null if unavailable.
-     * @return a [ListenableFuture] for a [InteractiveWatchFaceWcsClient], or
-     *    [ServiceNotBoundException] if the WatchFaceControlService is not bound, or a
-     *    or a [ServiceStartFailureException] if the service dies during startup.
+     * @return A [Deferred] [InteractiveWatchFaceWcsClient], or a [ServiceStartFailureException] if
+     *    the watchface dies during startup.
      */
-    public fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+    public fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
         id: String,
         deviceConfig: DeviceConfig,
         systemState: SystemState,
         userStyle: Map<String, String>?,
         idToComplicationData: Map<Int, ComplicationData>?
-    ): ListenableFuture<InteractiveWatchFaceWcsClient>
+    ): Deferred<InteractiveWatchFaceWcsClient>
 }
 
 internal class WatchFaceControlClientImpl internal constructor(
     private val context: Context,
-    serviceIntent: Intent
+    private val service: IWatchFaceControlService,
+    private val serviceConnection: ServiceConnection
 ) : WatchFaceControlClient {
 
-    internal var serviceFuture = ResolvableFuture.create<IWatchFaceControlService?>()
-
-    private val serviceConnection = object : ServiceConnection {
-        override fun onServiceConnected(name: ComponentName, binder: IBinder) {
-            serviceFuture.set(IWatchFaceControlService.Stub.asInterface(binder))
-        }
-
-        override fun onServiceDisconnected(name: ComponentName) {
-            serviceFuture.set(null)
-        }
-    }
-
-    init {
-        if (!context.bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE)) {
-            serviceFuture.set(null)
-        }
-    }
-
     override fun getInteractiveWatchFaceSysUiClientInstance(
         instanceId: String
-    ): ListenableFuture<InteractiveWatchFaceSysUiClient?> {
-        val resultFuture = ResolvableFuture.create<InteractiveWatchFaceSysUiClient>()
-        serviceFuture.addListener(
-            {
-                val service = serviceFuture.get()
-                if (service == null) {
-                    resultFuture.setException(WatchFaceControlClient.ServiceNotBoundException())
-                } else {
-                    resultFuture.set(
-                        InteractiveWatchFaceSysUiClientImpl(
-                            service.getInteractiveWatchFaceInstanceSysUI(instanceId)
-                        )
-                    )
-                }
-            },
-            { runnable -> runnable.run() }
-        )
-        return resultFuture
-    }
+    ) = InteractiveWatchFaceSysUiClientImpl(
+        service.getInteractiveWatchFaceInstanceSysUI(instanceId)
+    )
 
     override fun createHeadlessWatchFaceClient(
         watchFaceName: ComponentName,
         deviceConfig: DeviceConfig,
         surfaceWidth: Int,
         surfaceHeight: Int
-    ): ListenableFuture<HeadlessWatchFaceClient?> {
-        val resultFuture = ResolvableFuture.create<HeadlessWatchFaceClient?>()
-        serviceFuture.addListener(
-            {
-                val service = serviceFuture.get()
-                if (service == null) {
-                    resultFuture.setException(WatchFaceControlClient.ServiceNotBoundException())
-                } else {
-                    resultFuture.set(
-                        HeadlessWatchFaceClientImpl(
-                            service.createHeadlessWatchFaceInstance(
-                                HeadlessWatchFaceInstanceParams(
-                                    watchFaceName,
-                                    androidx.wear.watchface.data.DeviceConfig(
-                                        deviceConfig.hasLowBitAmbient,
-                                        deviceConfig.hasBurnInProtection,
-                                        deviceConfig.analogPreviewReferenceTimeMillis,
-                                        deviceConfig.digitalPreviewReferenceTimeMillis
-                                    ),
-                                    surfaceWidth,
-                                    surfaceHeight
-                                )
-                            )
-                        )
-                    )
-                }
-            },
-            { runnable -> runnable.run() }
+    ) = HeadlessWatchFaceClientImpl(
+        service.createHeadlessWatchFaceInstance(
+            HeadlessWatchFaceInstanceParams(
+                watchFaceName,
+                androidx.wear.watchface.data.DeviceConfig(
+                    deviceConfig.hasLowBitAmbient,
+                    deviceConfig.hasBurnInProtection,
+                    deviceConfig.analogPreviewReferenceTimeMillis,
+                    deviceConfig.digitalPreviewReferenceTimeMillis
+                ),
+                surfaceWidth,
+                surfaceHeight
+            )
         )
-        return resultFuture
-    }
+    )
 
-    override fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient(
+    override fun getOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClientAsync(
         id: String,
         deviceConfig: DeviceConfig,
         systemState: SystemState,
         userStyle: Map<String, String>?,
         idToComplicationData: Map<Int, ComplicationData>?
-    ): ListenableFuture<InteractiveWatchFaceWcsClient> {
-        val resultFuture = ResolvableFuture.create<InteractiveWatchFaceWcsClient>()
-        serviceFuture.addListener(
-            {
-                val service = serviceFuture.get()
-                if (service == null) {
-                    resultFuture.setException(WatchFaceControlClient.ServiceNotBoundException())
-                } else {
-                    val deathObserver = IBinder.DeathRecipient {
-                        resultFuture.setException(
-                            WatchFaceControlClient.ServiceStartFailureException()
-                        )
-                    }
-                    service.asBinder().linkToDeath(deathObserver, 0)
-                    val existingInstance = service.getOrCreateInteractiveWatchFaceWCS(
-                        WallpaperInteractiveWatchFaceInstanceParams(
-                            id,
-                            androidx.wear.watchface.data.DeviceConfig(
-                                deviceConfig.hasLowBitAmbient,
-                                deviceConfig.hasBurnInProtection,
-                                deviceConfig.analogPreviewReferenceTimeMillis,
-                                deviceConfig.digitalPreviewReferenceTimeMillis
-                            ),
-                            androidx.wear.watchface.data.SystemState(
-                                systemState.inAmbientMode,
-                                systemState.interruptionFilter
-                            ),
-                            UserStyleWireFormat(userStyle ?: emptyMap()),
-                            idToComplicationData?.map {
-                                IdAndComplicationDataWireFormat(
-                                    it.key,
-                                    it.value.asWireComplicationData()
-                                )
-                            }
-                        ),
-                        object : IPendingInteractiveWatchFaceWCS.Stub() {
-                            override fun getApiVersion() =
-                                IPendingInteractiveWatchFaceWCS.API_VERSION
+    ): Deferred<InteractiveWatchFaceWcsClient> {
+        val deferredClient = CompletableDeferred<InteractiveWatchFaceWcsClient>()
 
-                            override fun onInteractiveWatchFaceWcsCreated(
-                                iInteractiveWatchFaceWcs: IInteractiveWatchFaceWCS
-                            ) {
-                                service.asBinder().unlinkToDeath(deathObserver, 0)
-                                resultFuture.set(
-                                    InteractiveWatchFaceWcsClientImpl(iInteractiveWatchFaceWcs)
-                                )
-                            }
-                        }
+        // [IWatchFaceControlService.getOrCreateInteractiveWatchFaceWCS] has an asynchronous
+        // callback and it's possible the watch face might crash during start up so we register
+        // a death observer.
+        val deathObserver = IBinder.DeathRecipient {
+            deferredClient.completeExceptionally(
+                WatchFaceControlClient.ServiceStartFailureException()
+            )
+        }
+        val serviceBinder = service.asBinder()
+        serviceBinder.linkToDeath(deathObserver, 0)
+
+        service.getOrCreateInteractiveWatchFaceWCS(
+            WallpaperInteractiveWatchFaceInstanceParams(
+                id,
+                androidx.wear.watchface.data.DeviceConfig(
+                    deviceConfig.hasLowBitAmbient,
+                    deviceConfig.hasBurnInProtection,
+                    deviceConfig.analogPreviewReferenceTimeMillis,
+                    deviceConfig.digitalPreviewReferenceTimeMillis
+                ),
+                androidx.wear.watchface.data.SystemState(
+                    systemState.inAmbientMode,
+                    systemState.interruptionFilter
+                ),
+                UserStyleWireFormat(userStyle ?: emptyMap()),
+                idToComplicationData?.map {
+                    IdAndComplicationDataWireFormat(
+                        it.key,
+                        it.value.asWireComplicationData()
                     )
-                    existingInstance?.let {
-                        service.asBinder().unlinkToDeath(deathObserver, 0)
-                        resultFuture.set(InteractiveWatchFaceWcsClientImpl(it))
-                    }
                 }
-            },
-            { runnable -> runnable.run() }
-        )
-        return resultFuture
+            ),
+            object : IPendingInteractiveWatchFaceWCS.Stub() {
+                override fun getApiVersion() = IPendingInteractiveWatchFaceWCS.API_VERSION
+
+                override fun onInteractiveWatchFaceWcsCreated(
+                    iInteractiveWatchFaceWcs: IInteractiveWatchFaceWCS
+                ) {
+                    serviceBinder.unlinkToDeath(deathObserver, 0)
+                    deferredClient.complete(
+                        InteractiveWatchFaceWcsClientImpl(iInteractiveWatchFaceWcs)
+                    )
+                }
+            }
+        )?.let {
+            // There was an existing watchface.onInteractiveWatchFaceWcsCreated
+            serviceBinder.unlinkToDeath(deathObserver, 0)
+            deferredClient.complete(InteractiveWatchFaceWcsClientImpl(it))
+        }
+
+        // Wait for [watchFaceCreatedCallback] or [deathObserver] to fire.
+        return deferredClient
     }
 
     override fun close() {
         context.unbindService(serviceConnection)
-        serviceFuture.set(null)
     }
 }
diff --git a/wear/wear-watchface-complications-rendering/build.gradle b/wear/wear-watchface-complications-rendering/build.gradle
index 2735d4b..3cbc76b 100644
--- a/wear/wear-watchface-complications-rendering/build.gradle
+++ b/wear/wear-watchface-complications-rendering/build.gradle
@@ -32,7 +32,6 @@
     api("androidx.annotation:annotation:1.1.0")
     api(project(":wear:wear-complications-data"))
 
-    implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.preference:preference:1.1.0")
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/wear/wear-watchface-data/api/restricted_current.txt b/wear/wear-watchface-data/api/restricted_current.txt
index 8868001..9d69d55 100644
--- a/wear/wear-watchface-data/api/restricted_current.txt
+++ b/wear/wear-watchface-data/api/restricted_current.txt
@@ -297,6 +297,14 @@
     field @androidx.versionedparcelable.ParcelField(3) public android.graphics.drawable.Icon? mIcon;
   }
 
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class CustomValueUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public CustomValueUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.UserStyleSettingWireFormat.OptionWireFormat!>, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public static class CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat.OptionWireFormat {
+    ctor public CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat(String);
+  }
+
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DoubleRangeUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
     ctor public DoubleRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.UserStyleSettingWireFormat.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
   }
diff --git a/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java
new file mode 100644
index 0000000..6a6108a
--- /dev/null
+++ b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.style.data;
+
+import android.graphics.drawable.Icon;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.versionedparcelable.VersionedParcelize;
+
+import java.util.List;
+
+/**
+ * Wire format for {@link androidx.wear.watchface.style.CustomValueStyleSetting}.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@VersionedParcelize
+public class CustomValueUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
+
+    CustomValueUserStyleSettingWireFormat() {
+    }
+
+    public CustomValueUserStyleSettingWireFormat(
+            @NonNull String id,
+            @NonNull CharSequence displayName,
+            @NonNull CharSequence description,
+            @Nullable Icon icon,
+            @NonNull List<OptionWireFormat> options,
+            @NonNull List<Integer> affectsLayers) {
+        super(id, displayName, description, icon, options, 0, affectsLayers);
+    }
+
+    /**
+     * Wire format for {@link
+     * androidx.wear.watchface.style.CustomValueStyleSetting.CustomValueOption}.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @VersionedParcelize
+    public static class CustomValueOptionWireFormat extends OptionWireFormat {
+        CustomValueOptionWireFormat() {
+        }
+
+        public CustomValueOptionWireFormat(@NonNull String id) {
+            super(id);
+        }
+    }
+}
diff --git a/wear/wear-watchface-editor/api/current.txt b/wear/wear-watchface-editor/api/current.txt
index a7b8acb..d7be214 100644
--- a/wear/wear-watchface-editor/api/current.txt
+++ b/wear/wear-watchface-editor/api/current.txt
@@ -31,7 +31,7 @@
 
   public interface EditorSession {
     method @RequiresApi(27) @UiThread public default static androidx.wear.watchface.editor.EditorSession? createHeadlessEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
-    method @UiThread public default static androidx.wear.watchface.editor.EditorSession? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
+    method @UiThread public default static kotlinx.coroutines.Deferred<androidx.wear.watchface.editor.EditorSession> createOnWatchEditingSessionAsync(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
     method public Integer? getBackgroundComplicationId();
     method @UiThread public Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public suspend Object? getComplicationPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
@@ -42,6 +42,7 @@
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @UiThread public suspend Object? launchComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public void onDestroy();
     method public void setUserStyle(androidx.wear.watchface.style.UserStyle p);
     method @UiThread public android.graphics.Bitmap takeWatchFaceScreenshot(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     property public abstract Integer? backgroundComplicationId;
@@ -56,7 +57,7 @@
 
   public static final class EditorSession.Companion {
     method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.EditorSession? createHeadlessEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
-    method @UiThread public androidx.wear.watchface.editor.EditorSession? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
+    method @UiThread public kotlinx.coroutines.Deferred<androidx.wear.watchface.editor.EditorSession> createOnWatchEditingSessionAsync(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
   }
 
   public final class EditorSessionKt {
diff --git a/wear/wear-watchface-editor/api/public_plus_experimental_current.txt b/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
index a7b8acb..d7be214 100644
--- a/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
@@ -31,7 +31,7 @@
 
   public interface EditorSession {
     method @RequiresApi(27) @UiThread public default static androidx.wear.watchface.editor.EditorSession? createHeadlessEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
-    method @UiThread public default static androidx.wear.watchface.editor.EditorSession? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
+    method @UiThread public default static kotlinx.coroutines.Deferred<androidx.wear.watchface.editor.EditorSession> createOnWatchEditingSessionAsync(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
     method public Integer? getBackgroundComplicationId();
     method @UiThread public Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public suspend Object? getComplicationPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
@@ -42,6 +42,7 @@
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @UiThread public suspend Object? launchComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public void onDestroy();
     method public void setUserStyle(androidx.wear.watchface.style.UserStyle p);
     method @UiThread public android.graphics.Bitmap takeWatchFaceScreenshot(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     property public abstract Integer? backgroundComplicationId;
@@ -56,7 +57,7 @@
 
   public static final class EditorSession.Companion {
     method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.EditorSession? createHeadlessEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
-    method @UiThread public androidx.wear.watchface.editor.EditorSession? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
+    method @UiThread public kotlinx.coroutines.Deferred<androidx.wear.watchface.editor.EditorSession> createOnWatchEditingSessionAsync(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
   }
 
   public final class EditorSessionKt {
diff --git a/wear/wear-watchface-editor/api/restricted_current.txt b/wear/wear-watchface-editor/api/restricted_current.txt
index a7b8acb..d7be214 100644
--- a/wear/wear-watchface-editor/api/restricted_current.txt
+++ b/wear/wear-watchface-editor/api/restricted_current.txt
@@ -31,7 +31,7 @@
 
   public interface EditorSession {
     method @RequiresApi(27) @UiThread public default static androidx.wear.watchface.editor.EditorSession? createHeadlessEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
-    method @UiThread public default static androidx.wear.watchface.editor.EditorSession? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
+    method @UiThread public default static kotlinx.coroutines.Deferred<androidx.wear.watchface.editor.EditorSession> createOnWatchEditingSessionAsync(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
     method public Integer? getBackgroundComplicationId();
     method @UiThread public Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public suspend Object? getComplicationPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
@@ -42,6 +42,7 @@
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @UiThread public suspend Object? launchComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public void onDestroy();
     method public void setUserStyle(androidx.wear.watchface.style.UserStyle p);
     method @UiThread public android.graphics.Bitmap takeWatchFaceScreenshot(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     property public abstract Integer? backgroundComplicationId;
@@ -56,7 +57,7 @@
 
   public static final class EditorSession.Companion {
     method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.EditorSession? createHeadlessEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
-    method @UiThread public androidx.wear.watchface.editor.EditorSession? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
+    method @UiThread public kotlinx.coroutines.Deferred<androidx.wear.watchface.editor.EditorSession> createOnWatchEditingSessionAsync(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
   }
 
   public final class EditorSessionKt {
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
index e1958f3..5577d43 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
@@ -81,45 +81,53 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        val editorSession = EditorSession.createOnWatchEditingSession(
-            this,
+        handler = Handler(Looper.getMainLooper())
+        coroutineScope = CoroutineScope(handler.asCoroutineDispatcher())
+        val deferredEditorSession = EditorSession.createOnWatchEditingSessionAsync(
+            this@WatchFaceConfigActivity,
             intent!!
-        )!!
-        init(
-            editorSession,
-            object : FragmentController {
-                @SuppressLint("SyntheticAccessor")
-                override fun showConfigFragment() {
-                    showFragment(ConfigFragment())
-                }
-
-                @SuppressLint("SyntheticAccessor")
-                override fun showComplicationConfigSelectionFragment() {
-                    showFragment(ComplicationConfigFragment())
-                }
-
-                @SuppressLint("SyntheticAccessor")
-                override fun showStyleConfigFragment(
-                    settingId: String,
-                    styleSchema: UserStyleSchema,
-                    userStyle: UserStyle
-                ) {
-                    showFragment(
-                        StyleConfigFragment.newInstance(settingId, styleSchema, userStyle)
-                    )
-                }
-
-                /**
-                 * Displays a config screen which allows the user to select the data source for the
-                 * complication.
-                 */
-                @SuppressWarnings("deprecation")
-                override suspend fun showComplicationConfig(
-                    complicationId: Int
-                ) = editorSession.launchComplicationProviderChooser(complicationId)
-            },
-            Handler(Looper.getMainLooper())
         )
+        coroutineScope.launch {
+            init(
+                deferredEditorSession.await()!!,
+                object : FragmentController {
+                    @SuppressLint("SyntheticAccessor")
+                    override fun showConfigFragment() {
+                        showFragment(ConfigFragment())
+                    }
+
+                    @SuppressLint("SyntheticAccessor")
+                    override fun showComplicationConfigSelectionFragment() {
+                        showFragment(ComplicationConfigFragment())
+                    }
+
+                    @SuppressLint("SyntheticAccessor")
+                    override fun showStyleConfigFragment(
+                        settingId: String,
+                        styleSchema: UserStyleSchema,
+                        userStyle: UserStyle
+                    ) {
+                        showFragment(
+                            StyleConfigFragment.newInstance(settingId, styleSchema, userStyle)
+                        )
+                    }
+
+                    /**
+                     * Displays a config screen which allows the user to select the data source for the
+                     * complication.
+                     */
+                    @SuppressWarnings("deprecation")
+                    override suspend fun showComplicationConfig(
+                        complicationId: Int
+                    ) = editorSession.launchComplicationProviderChooser(complicationId)
+                }
+            )
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        editorSession.onDestroy()
     }
 
     private fun focusCurrentFragment() {
@@ -150,13 +158,10 @@
     @VisibleForTesting
     internal fun init(
         editorSession: EditorSession,
-        fragmentController: FragmentController,
-        handler: Handler
+        fragmentController: FragmentController
     ) {
         this.editorSession = editorSession
         this.fragmentController = fragmentController
-        this.handler = handler
-        coroutineScope = CoroutineScope(handler.asCoroutineDispatcher())
 
         supportFragmentManager
             .addOnBackStackChangedListener {
diff --git a/wear/wear-watchface-editor/src/androidTest/java/androidx.wear.watchface.editor.EditingSessionTest.kt b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
similarity index 91%
rename from wear/wear-watchface-editor/src/androidTest/java/androidx.wear.watchface.editor.EditingSessionTest.kt
rename to wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
index 58c6d7f..78d828f 100644
--- a/wear/wear-watchface-editor/src/androidTest/java/androidx.wear.watchface.editor.EditingSessionTest.kt
+++ b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
@@ -23,6 +23,8 @@
 import android.graphics.RectF
 import android.graphics.drawable.Icon
 import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
 import android.os.Parcel
 import android.support.wearable.complications.ComplicationData
 import android.support.wearable.complications.ComplicationProviderInfo
@@ -53,7 +55,10 @@
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import org.junit.Assert.assertTrue
 import org.junit.Test
@@ -81,43 +86,48 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        editorSession = EditorSession.createOnWatchEditingSessionImpl(
-            this,
-            intent!!,
-            object : ProviderInfoRetrieverProvider {
-                override fun getProviderInfoRetriever() = ProviderInfoRetriever(
-                    FakeProviderInfoServiceV1(
-                        ComponentName("test.package", "test.class"),
-                        mapOf(
-                            LEFT_COMPLICATION_ID to ComplicationProviderInfo(
-                                "ProviderApp1",
-                                "Provider1",
-                                providerIcon1,
-                                ComplicationType.SHORT_TEXT.asWireComplicationType(),
-                                provider1
+        val deferredEditorSession =
+            EditorSession.createOnWatchEditingSessionAsyncImpl(
+                this@OnWatchFaceEditingTestActivity,
+                intent!!,
+                object : ProviderInfoRetrieverProvider {
+                    override fun getProviderInfoRetriever() = ProviderInfoRetriever(
+                        FakeProviderInfoServiceV1(
+                            ComponentName("test.package", "test.class"),
+                            mapOf(
+                                LEFT_COMPLICATION_ID to ComplicationProviderInfo(
+                                    "ProviderApp1",
+                                    "Provider1",
+                                    providerIcon1,
+                                    ComplicationType.SHORT_TEXT.asWireComplicationType(),
+                                    provider1
+                                ),
+                                RIGHT_COMPLICATION_ID to ComplicationProviderInfo(
+                                    "ProviderApp2",
+                                    "Provider2",
+                                    providerIcon2,
+                                    ComplicationType.LONG_TEXT.asWireComplicationType(),
+                                    provider2
+                                )
                             ),
-                            RIGHT_COMPLICATION_ID to ComplicationProviderInfo(
-                                "ProviderApp2",
-                                "Provider2",
-                                providerIcon2,
-                                ComplicationType.LONG_TEXT.asWireComplicationType(),
-                                provider2
+                            mapOf(
+                                provider1 to
+                                    ShortTextComplicationData.Builder(
+                                        ComplicationText.plain("Left")
+                                    ).build().asWireComplicationData(),
+                                provider2 to
+                                    LongTextComplicationData.Builder(
+                                        ComplicationText.plain("Right")
+                                    ).build().asWireComplicationData(),
                             )
-                        ),
-                        mapOf(
-                            provider1 to
-                                ShortTextComplicationData.Builder(ComplicationText.plain("Left"))
-                                    .build()
-                                    .asWireComplicationData(),
-                            provider2 to
-                                LongTextComplicationData.Builder(ComplicationText.plain("Right"))
-                                    .build()
-                                    .asWireComplicationData(),
                         )
                     )
-                )
-            }
-        )!!
+                }
+            )
+
+        CoroutineScope(Handler(Looper.getMainLooper()).asCoroutineDispatcher()).launch {
+            editorSession = deferredEditorSession.await()!!
+        }
     }
 }
 
diff --git a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index 6c85f75..a7ad627 100644
--- a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -49,6 +49,7 @@
 import androidx.wear.watchface.style.UserStyleSchema
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
@@ -123,18 +124,25 @@
     @UiThread
     public suspend fun launchComplicationProviderChooser(complicationId: Int): Boolean
 
+    /** Should be called when the activity is going away so we can release resources. */
+    public fun onDestroy()
+
     public companion object {
-        /** Constructs an [EditorSession] for an on watch face editor. */
+        /**
+         * Constructs an [EditorSession] for an on watch face editor. This registers an activity
+         * result handler and so it must be called during an Activity or Fragment initialization
+         * path.
+         */
         @SuppressWarnings("ExecutorRegistration")
         @JvmStatic
         @UiThread
-        public fun createOnWatchEditingSession(
+        public fun createOnWatchEditingSessionAsync(
             /** The [ComponentActivity] associated with the EditorSession. */
             activity: ComponentActivity,
 
             /** [Intent] sent by SysUI to launch the editing session. */
             editIntent: Intent
-        ): EditorSession? = createOnWatchEditingSessionImpl(
+        ): Deferred<EditorSession?> = createOnWatchEditingSessionAsyncImpl(
             activity,
             editIntent,
             object : ProviderInfoRetrieverProvider {
@@ -142,23 +150,39 @@
             }
         )
 
-        internal fun createOnWatchEditingSessionImpl(
+        // Used by tests.
+        internal fun createOnWatchEditingSessionAsyncImpl(
             activity: ComponentActivity,
             editIntent: Intent,
             providerInfoRetrieverProvider: ProviderInfoRetrieverProvider
-        ): EditorSession? =
-            EditorRequest.createFromIntent(editIntent)?.let { editorRequest ->
-                WatchFace.getEditorDelegate(editorRequest.watchFaceComponentName)?.let {
-                    OnWatchFaceEditorSessionImpl(
-                        activity,
-                        editorRequest.watchFaceComponentName,
-                        editorRequest.watchFaceInstanceId,
-                        editorRequest.initialUserStyle,
-                        it,
-                        providerInfoRetrieverProvider
+        ): Deferred<EditorSession?> {
+            val coroutineScope =
+                CoroutineScope(Handler(Looper.getMainLooper()).asCoroutineDispatcher())
+            return EditorRequest.createFromIntent(editIntent)?.let { editorRequest ->
+                // We need to respect the lifecycle and register the ActivityResultListener now.
+                val session = OnWatchFaceEditorSessionImpl(
+                    activity,
+                    editorRequest.watchFaceComponentName,
+                    editorRequest.watchFaceInstanceId,
+                    editorRequest.initialUserStyle,
+                    providerInfoRetrieverProvider,
+                    coroutineScope
+                )
+
+                // But full initialization has to be deferred because
+                // [WatchFace.getOrCreateEditorDelegate] is async.
+                coroutineScope.async {
+                    session.setEditorDelegate(
+                        WatchFace.getOrCreateEditorDelegate(
+                            editorRequest.watchFaceComponentName
+                        ).await()!!
                     )
+
+                    // Resolve the Deferred<EditorSession?> only after init has been completed.
+                    session
                 }
-            }
+            } ?: CompletableDeferred(null)
+        }
 
         /** Constructs an [EditorSession] for a remote watch face editor. */
         @JvmStatic
@@ -182,7 +206,8 @@
                     it.initialUserStyle!!,
                     object : ProviderInfoRetrieverProvider {
                         override fun getProviderInfoRetriever() = ProviderInfoRetriever(activity)
-                    }
+                    },
+                    CoroutineScope(Handler(Looper.getMainLooper()).asCoroutineDispatcher())
                 )
             }
     }
@@ -196,12 +221,10 @@
 internal abstract class BaseEditorSession(
     protected val activity: ComponentActivity,
     protected val providerInfoRetrieverProvider: ProviderInfoRetrieverProvider,
-    mainThreadHandler: Handler = Handler(Looper.getMainLooper())
+    internal val coroutineScope: CoroutineScope
 ) : EditorSession {
-    internal val coroutineScope = CoroutineScope(mainThreadHandler.asCoroutineDispatcher())
-
-    // This future is resolved when [fetchComplicationPreviewData] has called [getPreviewData] for
-    // each complication and each of those future has been resolved.
+    // This is completed when [fetchComplicationPreviewData] has called [getPreviewData] for
+    // each complication and each of those have been completed.
     private val deferredComplicationPreviewDataMap =
         CompletableDeferred<MutableMap<Int, ComplicationData>>()
 
@@ -219,7 +242,7 @@
         activity.registerForActivityResult(ComplicationProviderChooserContract()) {
             if (it != null) {
                 coroutineScope.launch {
-                    // Update preview data and then resolve [pendingFuture].
+                    // Update preview data.
                     val providerInfoRetriever =
                         providerInfoRetrieverProvider.getProviderInfoRetriever()
                     val previewData = getPreviewData(providerInfoRetriever, it.providerInfo)
@@ -265,9 +288,9 @@
         }?.key
 
     /**
-     * Returns a future that resolves with the provider's preview [ComplicationData] if possible or
-     * fallback preview data based on provider icon and name if not. If the slot is configured to be
-     * empty then the future will resolve to `null`.
+     * Returns the provider's preview [ComplicationData] if possible or fallback preview data based
+     * on provider icon and name if not. If the slot is configured to be empty then it will return
+     * `null`.
      *
      * Note providerInfoRetriever.requestPreviewComplicationData which requires R will never be
      * called pre R because providerInfo.providerComponentName is only non null from R onwards.
@@ -302,7 +325,9 @@
         else ->
             ShortTextComplicationData.Builder(
                 ComplicationText.plain(providerInfo.providerName!!)
-            ).setImage(MonochromaticImage.Builder(providerInfo.providerIcon!!).build()).build()
+            ).setMonochromaticImage(
+                MonochromaticImage.Builder(providerInfo.providerIcon!!).build()
+            ).build()
     }
 
     protected fun fetchComplicationPreviewData() {
@@ -318,6 +343,7 @@
                     { it.watchFaceComplicationId },
                     { async { getPreviewData(providerInfoRetriever, it.info) } }
                     // Coerce to a Map<Int, ComplicationData> omitting null values.
+                    // If mapNotNullValues existed we would use it here.
                 )?.filterValues {
                     it.await() != null
                 }?.mapValues {
@@ -333,13 +359,17 @@
     activity: ComponentActivity,
     override val watchFaceComponentName: ComponentName,
     override val instanceId: String?,
-    initialEditorUserStyle: Map<String, String>?,
-    private val editorDelegate: WatchFace.EditorDelegate,
-    providerInfoRetrieverProvider: ProviderInfoRetrieverProvider
-) : BaseEditorSession(activity, providerInfoRetrieverProvider) {
-    override val userStyleSchema = editorDelegate.userStyleRepository.schema
+    private val initialEditorUserStyle: Map<String, String>?,
+    providerInfoRetrieverProvider: ProviderInfoRetrieverProvider,
+    coroutineScope: CoroutineScope
+) : BaseEditorSession(activity, providerInfoRetrieverProvider, coroutineScope) {
+    private lateinit var editorDelegate: WatchFace.EditorDelegate
 
-    override val previewReferenceTimeMillis = editorDelegate.previewReferenceTimeMillis
+    override val userStyleSchema by lazy {
+        editorDelegate.userStyleRepository.schema
+    }
+
+    override val previewReferenceTimeMillis by lazy { editorDelegate.previewReferenceTimeMillis }
 
     override val complicationState
         get() = editorDelegate.complicationsManager.complications.mapValues {
@@ -355,11 +385,19 @@
             )
         }
 
+    private var _userStyle: UserStyle? = null
+
     // We make a deep copy of the style because assigning to it can otherwise have unexpected
     // side effects (it would apply to the active watch face).
-    override var userStyle = UserStyle(editorDelegate.userStyleRepository.userStyle)
+    override var userStyle: UserStyle
+        get() {
+            if (_userStyle == null) {
+                _userStyle = UserStyle(editorDelegate.userStyleRepository.userStyle)
+            }
+            return _userStyle!!
+        }
         set(value) {
-            field = value
+            _userStyle = value
             editorDelegate.userStyleRepository.userStyle = UserStyle(value)
         }
 
@@ -373,7 +411,13 @@
         idToComplicationData
     )
 
-    init {
+    override fun onDestroy() {
+        editorDelegate.onDestroy()
+    }
+
+    fun setEditorDelegate(editorDelegate: WatchFace.EditorDelegate) {
+        this.editorDelegate = editorDelegate
+
         // Apply any initial style from the intent.  Note we don't restore the previous style at
         // the end since we assume we're editing the current active watchface.
         if (initialEditorUserStyle != null) {
@@ -392,8 +436,9 @@
     override val watchFaceComponentName: ComponentName,
     override val instanceId: String?,
     initialUserStyle: Map<String, String>,
-    providerInfoRetrieverProvider: ProviderInfoRetrieverProvider
-) : BaseEditorSession(activity, providerInfoRetrieverProvider) {
+    providerInfoRetrieverProvider: ProviderInfoRetrieverProvider,
+    coroutineScope: CoroutineScope
+) : BaseEditorSession(activity, providerInfoRetrieverProvider, coroutineScope) {
     override val userStyleSchema = headlessWatchFaceClient.userStyleSchema
 
     override var userStyle = UserStyle(initialUserStyle, userStyleSchema)
@@ -414,6 +459,10 @@
         idToComplicationData
     )
 
+    override fun onDestroy() {
+        headlessWatchFaceClient.close()
+    }
+
     init {
         fetchComplicationPreviewData()
     }
diff --git a/wear/wear-watchface-style/api/current.txt b/wear/wear-watchface-style/api/current.txt
index 60a4a20b..8ff45ee 100644
--- a/wear/wear-watchface-style/api/current.txt
+++ b/wear/wear-watchface-style/api/current.txt
@@ -55,6 +55,8 @@
     property public final android.graphics.drawable.Icon? icon;
     property public final String id;
     property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> options;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Companion Companion;
+    field public static final int maxIdLength;
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
@@ -68,6 +70,9 @@
     property public final boolean value;
   }
 
+  public static final class UserStyleSetting.Companion {
+  }
+
   public static final class UserStyleSetting.ComplicationsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.ComplicationsUserStyleSetting(String id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
   }
@@ -99,6 +104,16 @@
     property public final android.graphics.drawable.Icon? icon;
   }
 
+  public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting(String defaultValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(String customValue);
+    method public String getCustomValue();
+    property public final String customValue;
+  }
+
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(String id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, double defaultValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
     method public double getDefaultValue();
@@ -143,11 +158,13 @@
     method public final String getId();
     method public final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption? toBooleanOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption? toComplicationsOption();
+    method public final androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption? toCustomValueOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption? toDoubleRangeOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption? toListOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption? toLongRangeOption();
     property public final String id;
     field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
+    field public static final int maxIdLength;
   }
 
   public static final class UserStyleSetting.Option.Companion {
diff --git a/wear/wear-watchface-style/api/public_plus_experimental_current.txt b/wear/wear-watchface-style/api/public_plus_experimental_current.txt
index 692a042..1624a18 100644
--- a/wear/wear-watchface-style/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-style/api/public_plus_experimental_current.txt
@@ -55,6 +55,8 @@
     property public final android.graphics.drawable.Icon? icon;
     property public final String id;
     property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> options;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Companion Companion;
+    field public static final int maxIdLength;
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
@@ -70,6 +72,9 @@
     property public final boolean value;
   }
 
+  public static final class UserStyleSetting.Companion {
+  }
+
   public static final class UserStyleSetting.ComplicationsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.ComplicationsUserStyleSetting(String id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat toWireFormat();
@@ -103,6 +108,18 @@
     property public final android.graphics.drawable.Icon? icon;
   }
 
+  public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting(String defaultValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat toWireFormat();
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(String customValue);
+    method public String getCustomValue();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat toWireFormat();
+    property public final String customValue;
+  }
+
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(String id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, double defaultValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
     method public double getDefaultValue();
@@ -153,11 +170,13 @@
     method public final String getId();
     method public final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption? toBooleanOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption? toComplicationsOption();
+    method public final androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption? toCustomValueOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption? toDoubleRangeOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption? toListOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption? toLongRangeOption();
     property public final String id;
     field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
+    field public static final int maxIdLength;
   }
 
   public static final class UserStyleSetting.Option.Companion {
diff --git a/wear/wear-watchface-style/api/restricted_current.txt b/wear/wear-watchface-style/api/restricted_current.txt
index ac6ccf4..0926e16 100644
--- a/wear/wear-watchface-style/api/restricted_current.txt
+++ b/wear/wear-watchface-style/api/restricted_current.txt
@@ -61,6 +61,8 @@
     property public final android.graphics.drawable.Icon? icon;
     property public final String id;
     property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> options;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Companion Companion;
+    field public static final int maxIdLength;
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
@@ -76,6 +78,9 @@
     property public final boolean value;
   }
 
+  public static final class UserStyleSetting.Companion {
+  }
+
   public static final class UserStyleSetting.ComplicationsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.ComplicationsUserStyleSetting(String id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat toWireFormat();
@@ -109,6 +114,18 @@
     property public final android.graphics.drawable.Icon? icon;
   }
 
+  public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting(String defaultValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat toWireFormat();
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(String customValue);
+    method public String getCustomValue();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat toWireFormat();
+    property public final String customValue;
+  }
+
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(String id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, double defaultValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
     method public double getDefaultValue();
@@ -159,12 +176,14 @@
     method public final String getId();
     method public final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption? toBooleanOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption? toComplicationsOption();
+    method public final androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption? toCustomValueOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption? toDoubleRangeOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption? toListOption();
     method public final androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption? toLongRangeOption();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract androidx.wear.watchface.style.data.UserStyleSettingWireFormat.OptionWireFormat toWireFormat();
     property public final String id;
     field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
+    field public static final int maxIdLength;
   }
 
   public static final class UserStyleSetting.Option.Companion {
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleRepository.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleRepository.kt
index cd96209..02213ec 100644
--- a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleRepository.kt
+++ b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleRepository.kt
@@ -82,6 +82,23 @@
      */
     public val userStyleSettings: List<UserStyleSetting>
 ) {
+    init {
+        var customValueUserStyleSettingCount = 0
+        for (setting in userStyleSettings) {
+            if (setting is UserStyleSetting.CustomValueUserStyleSetting) {
+                customValueUserStyleSettingCount++
+            }
+        }
+
+        // There's a hard limit to how big Schema + UserStyle can be and since this data is sent
+        // over bluetooth to the companion there will be performance issues well before we hit
+        // that the limit. As a result we want the total size of custom data to be kept small and
+        // we are initially restricting there to be at most one CustomValueUserStyleSetting.
+        require(
+            customValueUserStyleSettingCount <= 1
+        ) { "At most only one CustomValueUserStyleSetting is allowed" }
+    }
+
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public constructor(wireFormat: UserStyleSchemaWireFormat) : this(
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
index 9b7c0a7..cc241f6 100644
--- a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
+++ b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
@@ -21,8 +21,10 @@
 import androidx.wear.complications.ComplicationBounds
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption
+import androidx.wear.watchface.style.UserStyleSetting.Option.Companion.maxIdLength
 import androidx.wear.watchface.style.data.BooleanUserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat
+import androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.DoubleRangeUserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.ListUserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.LongRangeUserStyleSettingWireFormat
@@ -36,9 +38,16 @@
  *
  * A UserStyleSetting represents one of these dimensions. See also [UserStyleSchema] which defines
  * the list of UserStyleSettings provided by the watch face.
+ *
+ * Styling data gets shared with the companion phone to support editors (typically over bluetooth),
+ * as a result the size of serialized UserStyleSettings could become an issue if large.
  */
 public sealed class UserStyleSetting(
-    /** Identifier for the element, must be unique. */
+    /**
+     * Identifier for the element, must be unique. Styling data gets shared with the companion
+     * (typically via bluetooth) so size is a consideration and short ids are encouraged. There is a
+     * maximum length see [maxIdLength].
+     */
     public val id: String,
 
     /** Localized human readable name for the element, used in the userStyle selection UI. */
@@ -67,7 +76,11 @@
      */
     public val affectsLayers: Collection<Layer>
 ) {
-    internal companion object {
+    public companion object {
+        /** Maximum length of the [id] field. */
+        @JvmField
+        public val maxIdLength: Int = 40
+
         internal fun createFromWireFormat(
             wireFormat: UserStyleSettingWireFormat
         ): UserStyleSetting = when (wireFormat) {
@@ -76,6 +89,8 @@
             is ComplicationsUserStyleSettingWireFormat ->
                 ComplicationsUserStyleSetting(wireFormat)
 
+            is CustomValueUserStyleSettingWireFormat -> CustomValueUserStyleSetting(wireFormat)
+
             is DoubleRangeUserStyleSettingWireFormat -> DoubleRangeUserStyleSetting(wireFormat)
 
             is ListUserStyleSettingWireFormat -> ListUserStyleSetting(wireFormat)
@@ -92,6 +107,10 @@
         require(defaultOptionIndex >= 0 && defaultOptionIndex < options.size) {
             "defaultOptionIndex must be in the range [0 .. options.size)"
         }
+
+        require(id.length <= maxIdLength) {
+            "UserStyleSetting id length must not exceed $maxIdLength"
+        }
     }
 
     internal fun getSettingOptionForId(id: String?) =
@@ -124,15 +143,29 @@
     public fun getDefaultOption(): Option = options[defaultOptionIndex]
 
     /**
-     * Represents a choice within a style setting.
+     * Represents a choice within a style setting which can either be an option from the list or a
+     * an arbitrary value depending on the nature of the style setting.
      *
      * @property id Machine readable identifier for the style setting.
      */
     public abstract class Option(
-        /** Identifier for the option, must be unique within the UserStyleSetting. */
+        /**
+         * Identifier for the option (or the option itself for
+         * [CustomValueUserStyleSetting.CustomValueOption]), must be unique within the
+         * UserStyleSetting. Short ids are encouraged. There is a maximum length see [maxIdLength].
+         */
         public val id: String
     ) {
+        init {
+            require(id.length <= maxIdLength) {
+                "UserStyleSetting.Option id length must not exceed $maxIdLength"
+            }
+        }
+
         public companion object {
+            /** Maximum length of the [id] field. */
+            @JvmField
+            public val maxIdLength: Int = 1024
 
             /** @hide */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@@ -146,6 +179,9 @@
                     is ComplicationsUserStyleSettingWireFormat.ComplicationsOptionWireFormat ->
                         ComplicationsUserStyleSetting.ComplicationsOption(wireFormat)
 
+                    is CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat ->
+                        CustomValueUserStyleSetting.CustomValueOption(wireFormat)
+
                     is DoubleRangeUserStyleSettingWireFormat.DoubleRangeOptionWireFormat ->
                         DoubleRangeUserStyleSetting.DoubleRangeOption(wireFormat)
 
@@ -181,6 +217,13 @@
                 null
             }
 
+        public fun toCustomValueOption(): CustomValueUserStyleSetting.CustomValueOption? =
+            if (this is CustomValueUserStyleSetting.CustomValueOption) {
+                this
+            } else {
+                null
+            }
+
         public fun toDoubleRangeOption(): DoubleRangeUserStyleSetting.DoubleRangeOption? =
             if (this is DoubleRangeUserStyleSetting.DoubleRangeOption) {
                 this
@@ -855,4 +898,69 @@
             }
         }
     }
+
+    /**
+     * An application specific style setting. This style is ignored by the system editor. This is
+     * expected to be used in conjunction with an on watch face editor.
+     */
+    public class CustomValueUserStyleSetting : UserStyleSetting {
+        internal companion object {
+            internal const val CUSTOM_VALUE_USER_STYLE_SETTING_ID = "CustomValue"
+        }
+
+        public constructor (
+            /** The default value. */
+            defaultValue: String,
+
+            /**
+             * Used by the style configuration UI. Describes which rendering layers this style
+             * affects.
+             */
+            affectsLayers: Collection<Layer>
+        ) : super(
+            CUSTOM_VALUE_USER_STYLE_SETTING_ID,
+            "",
+            "",
+            null,
+            listOf(CustomValueOption(defaultValue)),
+            0,
+            affectsLayers
+        )
+
+        internal constructor(wireFormat: CustomValueUserStyleSettingWireFormat) : super(wireFormat)
+
+        /** @hide */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+        override fun toWireFormat(): CustomValueUserStyleSettingWireFormat =
+            CustomValueUserStyleSettingWireFormat(
+                id,
+                displayName,
+                description,
+                icon,
+                getWireFormatOptionsList(),
+                affectsLayers.map { it.ordinal }
+            )
+
+        /** An application specific custom value.  */
+        public class CustomValueOption : Option {
+            /* The value for this option. */
+            public val customValue: String
+                get() = id
+
+            public constructor(customValue: String) : super(customValue)
+
+            internal constructor(
+                wireFormat: CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat
+            ) : super(wireFormat.mId)
+
+            /** @hide */
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+            override fun toWireFormat():
+                CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat =
+                    CustomValueUserStyleSettingWireFormat.CustomValueOptionWireFormat(id)
+        }
+
+        override fun getOptionForId(optionId: String): Option =
+            options.find { it.id == optionId } ?: CustomValueOption(optionId)
+    }
 }
diff --git a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
index 514ad2b..6a1a54b 100644
--- a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
+++ b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
@@ -20,6 +20,7 @@
 import android.os.Parcel
 import androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting
+import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting
@@ -142,12 +143,17 @@
             true,
             listOf(Layer.BASE_LAYER)
         )
+        val styleSetting4 = CustomValueUserStyleSetting(
+            "default",
+            listOf(Layer.BASE_LAYER)
+        )
 
         val srcSchema = UserStyleSchema(
             listOf(
                 styleSetting1,
                 styleSetting2,
-                styleSetting3
+                styleSetting3,
+                styleSetting4
             )
         )
 
@@ -203,6 +209,11 @@
         assertThat(schema.userStyleSettings[2].icon).isEqualTo(null)
         assertThat(schema.userStyleSettings[2].affectsLayers.size).isEqualTo(1)
         assertThat(schema.userStyleSettings[2].affectsLayers.first()).isEqualTo(Layer.BASE_LAYER)
+
+        assert(schema.userStyleSettings[3] is CustomValueUserStyleSetting)
+        assertThat(schema.userStyleSettings[3].getDefaultOption().id).isEqualTo("default")
+        assertThat(schema.userStyleSettings[3].affectsLayers.size).isEqualTo(1)
+        assertThat(schema.userStyleSettings[3].affectsLayers.first()).isEqualTo(Layer.BASE_LAYER)
     }
 
     @Test
diff --git a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleRepositoryTest.kt b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleRepositoryTest.kt
index 82f1ac0..de04029 100644
--- a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleRepositoryTest.kt
+++ b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleRepositoryTest.kt
@@ -16,9 +16,11 @@
 
 package androidx.wear.watchface.style
 
+import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.fail
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito
@@ -220,4 +222,75 @@
         assertThat(userStyle.selectedOptions[colorStyleSetting]!!.id).isEqualTo("red_style")
         assertThat(userStyle.selectedOptions[watchHandStyleSetting]!!.id).isEqualTo("gothic_style")
     }
+
+    @Test
+    fun userStyle_mapConstructor_customValueUserStyleSetting() {
+        val customStyleSetting = CustomValueUserStyleSetting(
+            "default",
+            listOf(Layer.BASE_LAYER)
+        )
+
+        val userStyleRepository = UserStyleRepository(
+            UserStyleSchema(
+                listOf(customStyleSetting)
+            )
+        )
+
+        val userStyle = UserStyle(
+            mapOf(
+                CustomValueUserStyleSetting.CUSTOM_VALUE_USER_STYLE_SETTING_ID to "TEST 123"
+            ),
+            userStyleRepository.schema
+        )
+
+        val customValue = userStyle.selectedOptions[customStyleSetting]!! as
+            UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption
+        assertThat(customValue.customValue).isEqualTo("TEST 123")
+    }
+
+    @Test
+    fun userStyle_multiple_CustomValueUserStyleSettings_notAllowed() {
+        val customStyleSetting1 = CustomValueUserStyleSetting(
+            "default",
+            listOf(Layer.BASE_LAYER)
+        )
+        val customStyleSetting2 = CustomValueUserStyleSetting(
+            "default",
+            listOf(Layer.BASE_LAYER)
+        )
+
+        try {
+            UserStyleSchema(
+                listOf(customStyleSetting1, customStyleSetting2)
+            )
+            fail(
+                "Constructing a UserStyleSchema with more than one CustomValueUserStyleSetting " +
+                    "should fail"
+            )
+        } catch (e: Exception) {
+            // expected
+        }
+    }
+
+    @Test
+    fun setAndGetCustomStyleSetting() {
+        val customStyleSetting = CustomValueUserStyleSetting(
+            "default",
+            listOf(Layer.BASE_LAYER)
+        )
+
+        val userStyleRepository = UserStyleRepository(
+            UserStyleSchema(
+                listOf(customStyleSetting)
+            )
+        )
+
+        userStyleRepository.userStyle = UserStyle(
+            mapOf(customStyleSetting to CustomValueUserStyleSetting.CustomValueOption("test"))
+        )
+
+        assertThat(
+            userStyleRepository.userStyle[customStyleSetting]?.toCustomValueOption()!!.customValue
+        ).isEqualTo("test")
+    }
 }
diff --git a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
index 9bf1cbd..8c46d61 100644
--- a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
+++ b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
@@ -18,6 +18,7 @@
 
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
 import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.fail
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -73,4 +74,58 @@
         assertThat(rangedUserStyleSetting.getOptionForId("1").id)
             .isEqualTo("1.0")
     }
+
+    @Test
+    fun maximumUserStyleSettingIdLength() {
+        // OK.
+        DoubleRangeUserStyleSetting(
+            "x".repeat(UserStyleSetting.maxIdLength),
+            "",
+            "",
+            null,
+            0.0,
+            1.0,
+            1.0,
+            emptyList()
+        )
+
+        try {
+            // Not OK.
+            DoubleRangeUserStyleSetting(
+                "x".repeat(UserStyleSetting.maxIdLength + 1),
+                "",
+                "",
+                null,
+                0.0,
+                1.0,
+                1.0,
+                emptyList()
+            )
+            fail("Should have thrown an exception")
+        } catch (e: Exception) {
+            // Expected
+        }
+    }
+
+    @Test
+    fun maximumOptionIdLength() {
+        // OK.
+        UserStyleSetting.ListUserStyleSetting.ListOption(
+            "x".repeat(UserStyleSetting.Option.maxIdLength),
+            "",
+            null
+        )
+
+        try {
+            // Not OK.
+            UserStyleSetting.ListUserStyleSetting.ListOption(
+                "x".repeat(UserStyleSetting.Option.maxIdLength + 1),
+                "",
+                null
+            )
+            fail("Should have thrown an exception")
+        } catch (e: Exception) {
+            // Expected
+        }
+    }
 }
\ No newline at end of file
diff --git a/wear/wear-watchface/api/api_lint.ignore b/wear/wear-watchface/api/api_lint.ignore
index aacd936..b3ca439 100644
--- a/wear/wear-watchface/api/api_lint.ignore
+++ b/wear/wear-watchface/api/api_lint.ignore
@@ -1,13 +1,7 @@
 // Baseline format: 1.0
-MissingGetterMatchingBuilder: androidx.wear.watchface.Complication.Builder#setAsBackgroundComplication():
-    androidx.wear.watchface.Complication does not declare a `getAsBackgroundComplication()` method matching method androidx.wear.watchface.Complication.Builder.setAsBackgroundComplication()
-MissingGetterMatchingBuilder: androidx.wear.watchface.WatchFace.Builder#setPreviewReferenceTimeMillis(long):
-    androidx.wear.watchface.WatchFace does not declare a `getPreviewReferenceTimeMillis()` method matching method androidx.wear.watchface.WatchFace.Builder.setPreviewReferenceTimeMillis(long)
-MissingGetterMatchingBuilder: androidx.wear.watchface.WatchFace.Builder#setWear2AccentColor(int):
-    androidx.wear.watchface.WatchFace does not declare a `getWear2AccentColor()` method matching method androidx.wear.watchface.WatchFace.Builder.setWear2AccentColor(int)
-MissingGetterMatchingBuilder: androidx.wear.watchface.WatchFace.Builder#setWear2AcceptsTapEvents(boolean):
-    androidx.wear.watchface.WatchFace does not declare a `isWear2AcceptsTapEvents()` method matching method androidx.wear.watchface.WatchFace.Builder.setWear2AcceptsTapEvents(boolean)
-MissingGetterMatchingBuilder: androidx.wear.watchface.WatchFace.Builder#setWear2StatusBarGravity(int):
-    androidx.wear.watchface.WatchFace does not declare a `getWear2StatusBarGravity()` method matching method androidx.wear.watchface.WatchFace.Builder.setWear2StatusBarGravity(int)
-MissingGetterMatchingBuilder: androidx.wear.watchface.WatchFace.Builder#setWear2ViewProtectionMode(int):
-    androidx.wear.watchface.WatchFace does not declare a `getWear2ViewProtectionMode()` method matching method androidx.wear.watchface.WatchFace.Builder.setWear2ViewProtectionMode(int)
+GetterSetterNames: androidx.wear.watchface.CanvasComplication#setIsHighlighted(boolean):
+    Symmetric method for `isHighlighted` must be named `setHighlighted`; was `setIsHighlighted`
+GetterSetterNames: androidx.wear.watchface.CanvasComplicationDrawable#setIsHighlighted(boolean):
+    Symmetric method for `isHighlighted` must be named `setHighlighted`; was `setIsHighlighted`
+GetterSetterNames: androidx.wear.watchface.ObservableWatchData#setValue(T):
+    Symmetric method for `hasValue` must be named `setHasValue`; was `setValue`
diff --git a/wear/wear-watchface/api/restricted_current.txt b/wear/wear-watchface/api/restricted_current.txt
index 2c22f3b..84e5111 100644
--- a/wear/wear-watchface/api/restricted_current.txt
+++ b/wear/wear-watchface/api/restricted_current.txt
@@ -235,12 +235,12 @@
   public final class WatchFace {
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.UserStyleRepository userStyleRepository, androidx.wear.watchface.Renderer renderer, androidx.wear.watchface.ComplicationsManager complicationsManager);
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.UserStyleRepository userStyleRepository, androidx.wear.watchface.Renderer renderer);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.wear.watchface.WatchFace.EditorDelegate? getEditorDelegate(android.content.ComponentName componentName);
     method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread public static kotlinx.coroutines.CompletableDeferred<androidx.wear.watchface.WatchFace.EditorDelegate> getOrCreateEditorDelegate(android.content.ComponentName componentName);
     method public Long? getOverridePreviewReferenceTimeMillis();
     method public androidx.wear.watchface.style.UserStyleRepository getUserStyleRepository();
     method public static boolean isLegacyWatchFaceOverlayStyleSupported();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void registerEditorDelegate(android.content.ComponentName componentName, androidx.wear.watchface.WatchFace.EditorDelegate editorDelegate);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread public static void registerEditorDelegate(android.content.ComponentName componentName, androidx.wear.watchface.WatchFace.EditorDelegate editorDelegate);
     method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
     method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceTimeMillis(@IntRange(from=0) long previewReferenceTimeMillis);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.wear.watchface.WatchFace setSystemTimeProvider(androidx.wear.watchface.WatchFace.SystemTimeProvider systemTimeProvider);
@@ -252,9 +252,9 @@
   }
 
   public static final class WatchFace.Companion {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.wear.watchface.WatchFace.EditorDelegate? getEditorDelegate(android.content.ComponentName componentName);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread public kotlinx.coroutines.CompletableDeferred<androidx.wear.watchface.WatchFace.EditorDelegate> getOrCreateEditorDelegate(android.content.ComponentName componentName);
     method public boolean isLegacyWatchFaceOverlayStyleSupported();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void registerEditorDelegate(android.content.ComponentName componentName, androidx.wear.watchface.WatchFace.EditorDelegate editorDelegate);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread public void registerEditorDelegate(android.content.ComponentName componentName, androidx.wear.watchface.WatchFace.EditorDelegate editorDelegate);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface WatchFace.EditorDelegate {
@@ -262,6 +262,7 @@
     method public long getPreviewReferenceTimeMillis();
     method public android.graphics.Rect getScreenBounds();
     method public androidx.wear.watchface.style.UserStyleRepository getUserStyleRepository();
+    method public void onDestroy();
     method public android.graphics.Bitmap takeScreenshot(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     property public abstract androidx.wear.watchface.ComplicationsManager complicationsManager;
     property public abstract long previewReferenceTimeMillis;
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index aa88d92..de81d84 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -49,6 +49,7 @@
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleRepository
 import androidx.wear.watchface.style.data.UserStyleWireFormat
+import kotlinx.coroutines.CompletableDeferred
 import java.io.FileNotFoundException
 import java.io.InputStreamReader
 import java.security.InvalidParameterException
@@ -136,13 +137,16 @@
     public companion object {
         /** Returns whether [LegacyWatchFaceOverlayStyle] is supported on this device. */
         @JvmStatic
-        public fun isLegacyWatchFaceOverlayStyleSupported(): Boolean =
-            android.os.Build.VERSION.SDK_INT <= 27
+        public fun isLegacyWatchFaceOverlayStyleSupported(): Boolean = Build.VERSION.SDK_INT <= 27
 
         private val componentNameToEditorDelegate = HashMap<ComponentName, EditorDelegate>()
 
+        private var pendingComponentName: ComponentName? = null
+        private var pendingEditorDelegateCB: CompletableDeferred<EditorDelegate?>? = null
+
         /** @hide */
         @JvmStatic
+        @UiThread
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public fun registerEditorDelegate(
             componentName: ComponentName,
@@ -160,9 +164,36 @@
          * @hide
          */
         @JvmStatic
+        @UiThread
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public fun getEditorDelegate(componentName: ComponentName): EditorDelegate? =
-            componentNameToEditorDelegate[componentName]
+        public fun getOrCreateEditorDelegate(
+            componentName: ComponentName
+        ): CompletableDeferred<EditorDelegate?> {
+            componentNameToEditorDelegate[componentName]?.let {
+                return CompletableDeferred(it)
+            }
+
+            // There's no pre-existing watch face. We expect Home/SysUI to switch the watchface soon
+            // so record a pending request...
+            pendingComponentName = componentName
+            pendingEditorDelegateCB = CompletableDeferred()
+            return pendingEditorDelegateCB!!
+        }
+
+        @UiThread
+        internal fun maybeCreatePendingEditorDelegate(watchface: WatchFaceImpl) {
+            if (pendingComponentName != null) {
+                pendingEditorDelegateCB?.complete(
+                    if (watchface.componentName == pendingComponentName) {
+                        watchface.createWFEditorDelegate()
+                    } else {
+                        null
+                    }
+                )
+                pendingComponentName = null
+                pendingEditorDelegateCB = null
+            }
+        }
     }
 
     /**
@@ -189,6 +220,9 @@
             calendarTimeMillis: Long,
             idToComplicationData: Map<Int, ComplicationData>?
         ): Bitmap
+
+        /** Signals that the activity is going away and resources should be released. */
+        public fun onDestroy()
     }
 
     /**
@@ -395,7 +429,7 @@
     private val pendingPostDoubleTap: CancellableUniqueTask =
         CancellableUniqueTask(watchFaceHostApi.getHandler())
 
-    private val componentName =
+    internal val componentName =
         ComponentName(
             watchFaceHostApi.getContext().packageName,
             watchFaceHostApi.getContext().javaClass.name
@@ -511,6 +545,8 @@
                 watchFaceHostApi.getContext().registerReceiver(null, iFilter)
             }
         )
+
+        WatchFace.maybeCreatePendingEditorDelegate(this)
     }
 
     private var inOnSetStyle = false
@@ -586,57 +622,7 @@
         )
 
         if (!watchState.isHeadless) {
-            WatchFace.registerEditorDelegate(
-                componentName,
-                object : WatchFace.EditorDelegate {
-                    override val userStyleRepository: UserStyleRepository
-                        get() = [email protected]
-
-                    override val complicationsManager: ComplicationsManager
-                        get() = [email protected]
-
-                    override val screenBounds
-                        get() = renderer.screenBounds
-
-                    override val previewReferenceTimeMillis
-                        get() = [email protected]
-
-                    override fun takeScreenshot(
-                        renderParameters: RenderParameters,
-                        calendarTimeMillis: Long,
-                        idToComplicationData: Map<Int, ComplicationData>?
-                    ): Bitmap {
-                        val oldComplicationData =
-                            complicationsManager.complications.values.map {
-                                it.renderer.idAndData ?: IdAndComplicationData(
-                                    it.id,
-                                    NoDataComplicationData()
-                                )
-                            }
-
-                        idToComplicationData?.let {
-                            for ((id, complicationData) in it) {
-                                complicationsManager[id]!!.renderer.setIdComplicationDataSync(
-                                    IdAndComplicationData(id, complicationData)
-                                )
-                            }
-                        }
-                        val screenShot = renderer.takeScreenshot(
-                            Calendar.getInstance(TimeZone.getTimeZone("UTC")).apply {
-                                timeInMillis = calendarTimeMillis
-                            },
-                            renderParameters
-                        )
-                        if (idToComplicationData != null) {
-                            for (idAndData in oldComplicationData) {
-                                complicationsManager[idAndData.complicationId]!!.renderer
-                                    .setIdComplicationDataSync(idAndData)
-                            }
-                        }
-                        return screenShot
-                    }
-                }
-            )
+            WatchFace.registerEditorDelegate(componentName, WFEditorDelegate())
         }
 
         watchState.isAmbient.addObserver(ambientObserver)
@@ -649,6 +635,63 @@
         initFinished = true
     }
 
+    internal fun createWFEditorDelegate() = WFEditorDelegate() as WatchFace.EditorDelegate
+
+    internal inner class WFEditorDelegate : WatchFace.EditorDelegate {
+        override val userStyleRepository: UserStyleRepository
+            get() = [email protected]
+
+        override val complicationsManager: ComplicationsManager
+            get() = [email protected]
+
+        override val screenBounds
+            get() = renderer.screenBounds
+
+        override val previewReferenceTimeMillis
+            get() = [email protected]
+
+        override fun takeScreenshot(
+            renderParameters: RenderParameters,
+            calendarTimeMillis: Long,
+            idToComplicationData: Map<Int, ComplicationData>?
+        ): Bitmap {
+            val oldComplicationData =
+                complicationsManager.complications.values.map {
+                    it.renderer.idAndData ?: IdAndComplicationData(
+                        it.id,
+                        NoDataComplicationData()
+                    )
+                }
+
+            idToComplicationData?.let {
+                for ((id, complicationData) in it) {
+                    complicationsManager[id]!!.renderer.setIdComplicationDataSync(
+                        IdAndComplicationData(id, complicationData)
+                    )
+                }
+            }
+            val screenShot = renderer.takeScreenshot(
+                Calendar.getInstance(TimeZone.getTimeZone("UTC")).apply {
+                    timeInMillis = calendarTimeMillis
+                },
+                renderParameters
+            )
+            if (idToComplicationData != null) {
+                for (idAndData in oldComplicationData) {
+                    complicationsManager[idAndData.complicationId]!!.renderer
+                        .setIdComplicationDataSync(idAndData)
+                }
+            }
+            return screenShot
+        }
+
+        override fun onDestroy() {
+            if (watchState.isHeadless) {
+                [email protected]()
+            }
+        }
+    }
+
     internal fun setIsBatteryLowAndNotChargingFromBatteryStatus(batteryStatus: Intent?) {
         val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
         val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
diff --git a/wear/wear/api/api_lint.ignore b/wear/wear/api/api_lint.ignore
index e513a66..f43557d 100644
--- a/wear/wear/api/api_lint.ignore
+++ b/wear/wear/api/api_lint.ignore
@@ -21,8 +21,16 @@
     ConfirmationActivity should not extend `Activity`. Activity subclasses are impossible to compose. Expose a composable API instead.
 
 
-HiddenSuperclass: androidx.wear.widget.SwipeDismissController:
-    Public class androidx.wear.widget.SwipeDismissController stripped of unavailable superclass androidx.wear.widget.DismissController
+GetterSetterNames: androidx.wear.widget.WearArcLayout#getClockwise():
+    Symmetric method for `setClockwise` must be named `isClockwise`; was `getClockwise`
+GetterSetterNames: androidx.wear.widget.WearArcLayout.LayoutParams#getRotate():
+    Symmetric method for `setRotate` must be named `isRotate`; was `getRotate`
+GetterSetterNames: androidx.wear.widget.WearCurvedTextView#getClockwise():
+    Symmetric method for `setClockwise` must be named `isClockwise`; was `getClockwise`
+GetterSetterNames: androidx.wear.widget.drawer.WearableDrawerView#setIsAutoPeekEnabled(boolean):
+    Symmetric method for `isAutoPeekEnabled` must be named `setAutoPeekEnabled`; was `setIsAutoPeekEnabled`
+GetterSetterNames: androidx.wear.widget.drawer.WearableDrawerView#setIsLocked(boolean):
+    Symmetric method for `isLocked` must be named `setLocked`; was `setIsLocked`
 
 
 MissingNullability: androidx.wear.activity.ConfirmationActivity#onCreate(android.os.Bundle) parameter #0:
diff --git a/webkit/webkit/api/api_lint.ignore b/webkit/webkit/api/api_lint.ignore
index b0b21ec..cc8d166 100644
--- a/webkit/webkit/api/api_lint.ignore
+++ b/webkit/webkit/api/api_lint.ignore
@@ -13,6 +13,14 @@
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.webkit.ProxyConfig.Builder.removeImplicitRules()
 
 
+GetterSetterNames: androidx.webkit.ServiceWorkerWebSettingsCompat#getAllowContentAccess():
+    Symmetric method for `setAllowContentAccess` must be named `isAllowContentAccess`; was `getAllowContentAccess`
+GetterSetterNames: androidx.webkit.ServiceWorkerWebSettingsCompat#getAllowFileAccess():
+    Symmetric method for `setAllowFileAccess` must be named `isAllowFileAccess`; was `getAllowFileAccess`
+GetterSetterNames: androidx.webkit.ServiceWorkerWebSettingsCompat#getBlockNetworkLoads():
+    Symmetric method for `setBlockNetworkLoads` must be named `isBlockNetworkLoads`; was `getBlockNetworkLoads`
+
+
 IntentName: androidx.webkit.WebViewFeature#DISABLED_ACTION_MODE_MENU_ITEMS:
     Intent action constant name must be ACTION_FOO: DISABLED_ACTION_MODE_MENU_ITEMS
 
@@ -22,11 +30,11 @@
 MissingGetterMatchingBuilder: androidx.webkit.ProxyConfig.Builder#addDirect(String):
     androidx.webkit.ProxyConfig does not declare a `getDirects()` method matching method androidx.webkit.ProxyConfig.Builder.addDirect(String)
 MissingGetterMatchingBuilder: androidx.webkit.TracingConfig.Builder#addCategories(int...):
-    androidx.webkit.TracingConfig does not declare a `getCategoriess()` method matching method androidx.webkit.TracingConfig.Builder.addCategories(int...)
+    androidx.webkit.TracingConfig does not declare a getter method matching method androidx.webkit.TracingConfig.Builder.addCategories(int...) (expected one of: [getCategories(), getCategorieses()])
 MissingGetterMatchingBuilder: androidx.webkit.TracingConfig.Builder#addCategories(java.lang.String...):
-    androidx.webkit.TracingConfig does not declare a `getCategoriess()` method matching method androidx.webkit.TracingConfig.Builder.addCategories(java.lang.String...)
+    androidx.webkit.TracingConfig does not declare a getter method matching method androidx.webkit.TracingConfig.Builder.addCategories(java.lang.String...) (expected one of: [getCategories(), getCategorieses()])
 MissingGetterMatchingBuilder: androidx.webkit.TracingConfig.Builder#addCategories(java.util.Collection<java.lang.String>):
-    androidx.webkit.TracingConfig does not declare a `getCategoriess()` method matching method androidx.webkit.TracingConfig.Builder.addCategories(java.util.Collection<java.lang.String>)
+    androidx.webkit.TracingConfig does not declare a getter method matching method androidx.webkit.TracingConfig.Builder.addCategories(java.util.Collection<java.lang.String>) (expected one of: [getCategories(), getCategorieses()])
 MissingGetterMatchingBuilder: androidx.webkit.WebViewAssetLoader.Builder#addPathHandler(String, androidx.webkit.WebViewAssetLoader.PathHandler):
     androidx.webkit.WebViewAssetLoader does not declare a `getPathHandlers()` method matching method androidx.webkit.WebViewAssetLoader.Builder.addPathHandler(String,androidx.webkit.WebViewAssetLoader.PathHandler)
 MissingGetterMatchingBuilder: androidx.webkit.WebViewAssetLoader.Builder#setDomain(String):
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
index 29e7657..18cd30d 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
@@ -62,18 +62,16 @@
  *          .addPathHandler("/assets/", new AssetsPathHandler(this))
  *          .build();
  *
- * webView.setWebViewClient(new WebViewClient() {
+ * webView.setWebViewClient(new WebViewClientCompat() {
  *     {@literal @}Override
  *     {@literal @}RequiresApi(21)
- *     public WebResourceResponse shouldInterceptRequest(WebView view,
- *                                      WebResourceRequest request) {
+ *     public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
  *         return assetLoader.shouldInterceptRequest(request.getUrl());
  *     }
  *
  *     {@literal @}Override
  *     {@literal @}SuppressWarnings("deprecation") // for API < 21
- *     public WebResourceResponse shouldInterceptRequest(WebView view,
- *                                      WebResourceRequest request) {
+ *     public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
  *         return assetLoader.shouldInterceptRequest(Uri.parse(request));
  *     }
  * });
diff --git a/window/window/build.gradle b/window/window/build.gradle
index 4b98a67..e780b24 100644
--- a/window/window/build.gradle
+++ b/window/window/build.gradle
@@ -41,6 +41,15 @@
     buildTypes.all {
         consumerProguardFiles 'proguard-rules.pro'
     }
+    sourceSets {
+        String testUtilDir = 'src/testUtil/java'
+        test {
+            java.srcDir testUtilDir
+        }
+        androidTest {
+            java.srcDir testUtilDir
+        }
+    }
 }
 
 dependencies {
diff --git a/window/window/src/androidTest/java/androidx/window/TestBoundsUtil.java b/window/window/src/androidTest/java/androidx/window/TestBoundsUtil.java
deleted file mode 100644
index ff353db..0000000
--- a/window/window/src/androidTest/java/androidx/window/TestBoundsUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window;
-
-import android.graphics.Rect;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A utility class to provide bounds for a display feature
- */
-class TestBoundsUtil {
-
-    public static Rect validFoldBound(Rect windowBounds) {
-        int verticalMid = windowBounds.top + windowBounds.height() / 2;
-        return new Rect(0, verticalMid, windowBounds.width(), verticalMid);
-    }
-
-    public static Rect invalidZeroBound() {
-        return new Rect();
-    }
-
-    public static Rect invalidBoundShortWidth(Rect windowBounds) {
-        return new Rect(0, 0, windowBounds.width() / 2, 2);
-    }
-
-    public static Rect invalidBoundShortHeight(Rect windowBounds) {
-        return new Rect(0, 0, 2, windowBounds.height() / 2);
-    }
-
-    private static List<Rect> coreInvalidBounds(Rect windowBounds) {
-        List<Rect> badBounds = new ArrayList<>();
-
-        badBounds.add(invalidZeroBound());
-        badBounds.add(invalidBoundShortWidth(windowBounds));
-        badBounds.add(invalidBoundShortHeight(windowBounds));
-
-        return badBounds;
-    }
-
-    public static List<Rect> invalidFoldBounds(Rect windowBounds) {
-        List<Rect> badBounds = coreInvalidBounds(windowBounds);
-        Rect nonEmptySmallRect = new Rect(0, 1, 1, 1);
-        badBounds.add(nonEmptySmallRect);
-        return badBounds;
-    }
-
-    public static List<Rect> invalidHingeBounds(Rect windowBounds) {
-        return coreInvalidBounds(windowBounds);
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/ActivityUtil.java b/window/window/src/main/java/androidx/window/ActivityUtil.java
index 48839f20..b6e2cbd 100644
--- a/window/window/src/main/java/androidx/window/ActivityUtil.java
+++ b/window/window/src/main/java/androidx/window/ActivityUtil.java
@@ -21,6 +21,9 @@
 
 import androidx.annotation.Nullable;
 
+/**
+ * A class to contain utility methods related to an {@link Activity}.
+ */
 final class ActivityUtil {
 
     private ActivityUtil() {}
diff --git a/window/window/src/test/java/androidx/window/TestBoundsUtil.java b/window/window/src/test/java/androidx/window/TestBoundsUtil.java
deleted file mode 100644
index 4988e40..0000000
--- a/window/window/src/test/java/androidx/window/TestBoundsUtil.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window;
-
-import android.graphics.Rect;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A utility class to provide bounds for a display feature
- */
-class TestBoundsUtil {
-
-    public static Rect validFoldBound(Rect windowBounds) {
-        return new Rect(windowBounds.left, windowBounds.top, windowBounds.right, 0);
-    }
-
-    public static Rect invalidZeroBound() {
-        return new Rect();
-    }
-
-    public static Rect invalidBoundShortWidth(Rect windowBounds) {
-        return new Rect(windowBounds.left, windowBounds.top, windowBounds.right / 2, 2);
-    }
-
-    public static Rect invalidBoundShortHeight(Rect windowBounds) {
-        return new Rect(windowBounds.left, windowBounds.top, 2, windowBounds.bottom / 2);
-    }
-
-    private static List<Rect> coreInvalidBounds(Rect windowBounds) {
-        List<Rect> badBounds = new ArrayList<>();
-
-        badBounds.add(invalidZeroBound());
-        badBounds.add(invalidBoundShortWidth(windowBounds));
-        badBounds.add(invalidBoundShortHeight(windowBounds));
-
-        return badBounds;
-    }
-
-    public static List<Rect> invalidFoldBounds(Rect windowBounds) {
-        List<Rect> badBounds = coreInvalidBounds(windowBounds);
-        Rect nonEmptySmallRect = new Rect(0, 1, 1, 1);
-        badBounds.add(nonEmptySmallRect);
-        return badBounds;
-    }
-
-    public static List<Rect> invalidHingeBounds(Rect windowBounds) {
-        return coreInvalidBounds(windowBounds);
-    }
-}
diff --git a/window/window/src/test/java/androidx/window/TestWindow.java b/window/window/src/test/java/androidx/window/TestWindow.java
deleted file mode 100644
index 8e3591f..0000000
--- a/window/window/src/test/java/androidx/window/TestWindow.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window;
-
-import static org.mockito.Mockito.mock;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.InputQueue;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.SurfaceHolder;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-public class TestWindow extends Window {
-
-    private View mDecorView;
-
-    public TestWindow(Context context) {
-        this(context, mock(View.class));
-    }
-
-    public TestWindow(Context context, View decorView) {
-        super(context);
-        mDecorView = decorView;
-    }
-
-    @Override
-    public void takeSurface(SurfaceHolder.Callback2 callback) {
-
-    }
-
-    @Override
-    public void takeInputQueue(InputQueue.Callback callback) {
-
-    }
-
-    @Override
-    public boolean isFloating() {
-        return false;
-    }
-
-    @Override
-    public void setContentView(int layoutResID) {
-
-    }
-
-    @Override
-    public void setContentView(View view) {
-
-    }
-
-    @Override
-    public void setContentView(View view, ViewGroup.LayoutParams params) {
-
-    }
-
-    @Override
-    public void addContentView(View view, ViewGroup.LayoutParams params) {
-
-    }
-
-    @Nullable
-    @Override
-    public View getCurrentFocus() {
-        return null;
-    }
-
-    @NonNull
-    @Override
-    public LayoutInflater getLayoutInflater() {
-        return null;
-    }
-
-    @Override
-    public void setTitle(CharSequence title) {
-
-    }
-
-    @Override
-    public void setTitleColor(int textColor) {
-
-    }
-
-    @Override
-    public void openPanel(int featureId, KeyEvent event) {
-
-    }
-
-    @Override
-    public void closePanel(int featureId) {
-
-    }
-
-    @Override
-    public void togglePanel(int featureId, KeyEvent event) {
-
-    }
-
-    @Override
-    public void invalidatePanelMenu(int featureId) {
-
-    }
-
-    @Override
-    public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) {
-        return false;
-    }
-
-    @Override
-    public boolean performPanelIdentifierAction(int featureId, int id, int flags) {
-        return false;
-    }
-
-    @Override
-    public void closeAllPanels() {
-
-    }
-
-    @Override
-    public boolean performContextMenuIdentifierAction(int id, int flags) {
-        return false;
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-
-    }
-
-    @Override
-    public void setBackgroundDrawable(Drawable drawable) {
-
-    }
-
-    @Override
-    public void setFeatureDrawableResource(int featureId, int resId) {
-
-    }
-
-    @Override
-    public void setFeatureDrawableUri(int featureId, Uri uri) {
-
-    }
-
-    @Override
-    public void setFeatureDrawable(int featureId, Drawable drawable) {
-
-    }
-
-    @Override
-    public void setFeatureDrawableAlpha(int featureId, int alpha) {
-
-    }
-
-    @Override
-    public void setFeatureInt(int featureId, int value) {
-
-    }
-
-    @Override
-    public void takeKeyEvents(boolean get) {
-
-    }
-
-    @Override
-    public boolean superDispatchKeyEvent(KeyEvent event) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchKeyShortcutEvent(KeyEvent event) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchTouchEvent(MotionEvent event) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchTrackballEvent(MotionEvent event) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchGenericMotionEvent(MotionEvent event) {
-        return false;
-    }
-
-    @NonNull
-    @Override
-    public View getDecorView() {
-        return mDecorView;
-    }
-
-    @Override
-    public View peekDecorView() {
-        return null;
-    }
-
-    @Override
-    public Bundle saveHierarchyState() {
-        return null;
-    }
-
-    @Override
-    public void restoreHierarchyState(Bundle savedInstanceState) {
-
-    }
-
-    @Override
-    protected void onActive() {
-
-    }
-
-    @Override
-    public void setChildDrawable(int featureId, Drawable drawable) {
-
-    }
-
-    @Override
-    public void setChildInt(int featureId, int value) {
-
-    }
-
-    @Override
-    public boolean isShortcutKey(int keyCode, KeyEvent event) {
-        return false;
-    }
-
-    @Override
-    public void setVolumeControlStream(int streamType) {
-
-    }
-
-    @Override
-    public int getVolumeControlStream() {
-        return 0;
-    }
-
-    @Override
-    public int getStatusBarColor() {
-        return 0;
-    }
-
-    @Override
-    public void setStatusBarColor(int color) {
-
-    }
-
-    @Override
-    public int getNavigationBarColor() {
-        return 0;
-    }
-
-    @Override
-    public void setNavigationBarColor(int color) {
-
-    }
-
-    @Override
-    public void setDecorCaptionShade(int decorCaptionShade) {
-
-    }
-
-    @Override
-    public void setResizingCaptionDrawable(Drawable drawable) {
-
-    }
-}
diff --git a/window/window/src/testUtil/java/androidx/window/TestBoundsUtil.java b/window/window/src/testUtil/java/androidx/window/TestBoundsUtil.java
new file mode 100644
index 0000000..3f5ab44
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/TestBoundsUtil.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window;
+
+import android.graphics.Rect;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A class containing static methods for creating different window bound types. Test methods are
+ * shared between the unit tests and the instrumentation tests.
+ */
+final class TestBoundsUtil {
+
+    private TestBoundsUtil() { }
+
+    /**
+     * @param windowBounds the bounds for a window contain a valid fold.
+     * @return {@link Rect} that is a valid fold bound within the given window.
+     */
+    public static Rect validFoldBound(Rect windowBounds) {
+        int verticalMid = windowBounds.height() / 2;
+        return new Rect(0, verticalMid, windowBounds.width(), verticalMid);
+    }
+
+    /**
+     * @return {@link Rect} containing the invalid zero bounds.
+     */
+    static Rect invalidZeroBound() {
+        return new Rect();
+    }
+
+    /**
+     * @param windowBounds the bounds for a window contain an invalid fold.
+     * @return {@link Rect} for bounds where the width is shorter than the window width.
+     */
+    static Rect invalidBoundShortWidth(Rect windowBounds) {
+        return new Rect(0, 0, windowBounds.width() / 2, 0);
+    }
+
+    /**
+     * @param windowBounds the bounds for a window contain an invalid fold.
+     * @return {@link Rect} for bounds where the height is shorter than the window height.
+     */
+    static Rect invalidBoundShortHeight(Rect windowBounds) {
+        return new Rect(0, 0, 0, windowBounds.height() / 2);
+    }
+
+    /**
+     * @param windowBounds the bounds for a window contain an invalid fold.
+     * @return a {@link List} of {@link Rect} of invalid bounds for fold features
+     */
+    static List<Rect> invalidFoldBounds(Rect windowBounds) {
+        List<Rect> badBounds = invalidHingeBounds(windowBounds);
+        Rect nonEmptySmallRect = new Rect(0, 0, 1, 1);
+        badBounds.add(nonEmptySmallRect);
+        return badBounds;
+    }
+
+    /**
+     * @param windowBounds the bounds for a window contain an invalid fold.
+     * @return a {@link List} of {@link Rect} of invalid bounds for hinge features
+     */
+    static List<Rect> invalidHingeBounds(Rect windowBounds) {
+        List<Rect> badBounds = new ArrayList<>();
+
+        badBounds.add(invalidZeroBound());
+        badBounds.add(invalidBoundShortWidth(windowBounds));
+        badBounds.add(invalidBoundShortHeight(windowBounds));
+
+        return badBounds;
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/TestWindow.java b/window/window/src/testUtil/java/androidx/window/TestWindow.java
similarity index 100%
rename from window/window/src/androidTest/java/androidx/window/TestWindow.java
rename to window/window/src/testUtil/java/androidx/window/TestWindow.java
diff --git a/work/workmanager/api/api_lint.ignore b/work/workmanager/api/api_lint.ignore
index 17159fd..9622774 100644
--- a/work/workmanager/api/api_lint.ignore
+++ b/work/workmanager/api/api_lint.ignore
@@ -69,14 +69,6 @@
     androidx.work.Constraints does not declare a `getTriggerContentUpdateDelay()` method matching method androidx.work.Constraints.Builder.setTriggerContentUpdateDelay(java.time.Duration)
 MissingGetterMatchingBuilder: androidx.work.Constraints.Builder#setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit):
     androidx.work.Constraints does not declare a `getTriggerContentUpdateDelay()` method matching method androidx.work.Constraints.Builder.setTriggerContentUpdateDelay(long,java.util.concurrent.TimeUnit)
-MissingGetterMatchingBuilder: androidx.work.WorkQuery.Builder#addIds(java.util.List<java.util.UUID>):
-    androidx.work.WorkQuery does not declare a `getIdss()` method matching method androidx.work.WorkQuery.Builder.addIds(java.util.List<java.util.UUID>)
-MissingGetterMatchingBuilder: androidx.work.WorkQuery.Builder#addStates(java.util.List<androidx.work.WorkInfo.State>):
-    androidx.work.WorkQuery does not declare a `getStatess()` method matching method androidx.work.WorkQuery.Builder.addStates(java.util.List<androidx.work.WorkInfo.State>)
-MissingGetterMatchingBuilder: androidx.work.WorkQuery.Builder#addTags(java.util.List<java.lang.String>):
-    androidx.work.WorkQuery does not declare a `getTagss()` method matching method androidx.work.WorkQuery.Builder.addTags(java.util.List<java.lang.String>)
-MissingGetterMatchingBuilder: androidx.work.WorkQuery.Builder#addUniqueWorkNames(java.util.List<java.lang.String>):
-    androidx.work.WorkQuery does not declare a `getUniqueWorkNamess()` method matching method androidx.work.WorkQuery.Builder.addUniqueWorkNames(java.util.List<java.lang.String>)
 MissingGetterMatchingBuilder: androidx.work.WorkRequest.Builder#addTag(String):
     W does not declare a `getTags()` method matching method androidx.work.WorkRequest.Builder.addTag(String)
 MissingGetterMatchingBuilder: androidx.work.WorkRequest.Builder#setBackoffCriteria(androidx.work.BackoffPolicy, java.time.Duration):