Merge "Import translations. DO NOT MERGE ANYWHERE" into androidx-platform-dev
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatVectorDrawableIntegrationTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatVectorDrawableIntegrationTest.java
index 14b6fb1..3ba67256 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatVectorDrawableIntegrationTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatVectorDrawableIntegrationTest.java
@@ -30,6 +30,7 @@
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.rule.ActivityTestRule;
 
 import org.junit.Before;
@@ -65,6 +66,7 @@
 
     @Test
     @UiThreadTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testVectorDrawableAutoMirrored() {
         Activity activity = mActivityTestRule.getActivity();
         ImageView view1 = (ImageView) activity.findViewById(R.id.view_vector_1);
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/KeyboardShortcutsTestCaseWithToolbar.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/KeyboardShortcutsTestCaseWithToolbar.java
index 8c926a0..0b38fe6 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/KeyboardShortcutsTestCaseWithToolbar.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/KeyboardShortcutsTestCaseWithToolbar.java
@@ -31,6 +31,7 @@
 import androidx.appcompat.widget.Toolbar;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 
@@ -46,6 +47,7 @@
 
     @Test
     @MediumTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testAccessActionBar() throws Throwable {
         // Since O, we rely on keyboard navigation clusters for jumping to actionbar
         if (Build.VERSION.SDK_INT <= 25) {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesSyncToFrameworkTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesSyncToFrameworkTestCase.kt
index 77bb9eb..5d09a06 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesSyncToFrameworkTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesSyncToFrameworkTestCase.kt
@@ -79,6 +79,7 @@
 
     @RequiresApi(33)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testAutoSync_preTToPostT_syncsSuccessfully() {
         val firstActivity = rule.activity
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateTestCase.kt
index 3e48121..a3addf3 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateTestCase.kt
@@ -117,7 +117,7 @@
         assertNull(activity.lastConfigurationChangeAndClear)
     }
 
-    @SdkSuppress(minSdkVersion = 17)
+    @SdkSuppress(minSdkVersion = 17, maxSdkVersion = 33)
     @Test
     @FlakyTest(bugId = 255765202)
     fun testLayoutDirectionAfterRecreating() {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
index d7e5020e..124d39f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
@@ -188,8 +188,6 @@
     private static LocaleListCompat sStoredAppLocales = null;
     private static Boolean sIsAutoStoreLocalesOptedIn = null;
     private static boolean sIsFrameworkSyncChecked = false;
-    private static Object sLocaleManager = null;
-    private static Context sAppContext = null;
 
     /**
      * All AppCompatDelegate instances associated with a "live" Activity, e.g. lifecycle state is
@@ -832,30 +830,16 @@
      */
     @RequiresApi(33)
     static Object getLocaleManagerForApplication() {
-        if (sLocaleManager != null) {
-            return sLocaleManager;
-        }
-        // Traversing through the active delegates to retrieve context for any one non null
-        // delegate.
-        // This context is used to create a localeManager which is saved as a static variable to
-        // reduce multiple object creation for different activities.
-        if (sAppContext == null) {
-            for (WeakReference<AppCompatDelegate> activeDelegate : sActivityDelegates) {
-                final AppCompatDelegate delegate = activeDelegate.get();
-                if (delegate != null) {
-                    Context context = delegate.getContextForDelegate();
-                    if (context != null) {
-                        sAppContext = context;
-                        break;
-                    }
+        for (WeakReference<AppCompatDelegate> activeDelegate : sActivityDelegates) {
+            final AppCompatDelegate delegate = activeDelegate.get();
+            if (delegate != null) {
+                Context context = delegate.getContextForDelegate();
+                if (context != null) {
+                    return context.getSystemService(Context.LOCALE_SERVICE);
                 }
             }
         }
-
-        if (sAppContext != null) {
-            sLocaleManager = sAppContext.getSystemService(Context.LOCALE_SERVICE);
-        }
-        return sLocaleManager;
+        return null;
     }
 
     /**
@@ -949,15 +933,6 @@
         }
     }
 
-
-    /**
-     * Sets the value for {@link AppCompatDelegate#sAppContext} which is the context for the
-     * current application.
-     */
-    static void setAppContext(Context context) {
-        sAppContext = context;
-    }
-
     /**
      * Sets whether vector drawables on older platforms (< API 21) can be used within
      * {@link android.graphics.drawable.DrawableContainer} resources.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesStorageHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesStorageHelper.java
index de405ed..2a0cb70 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesStorageHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesStorageHelper.java
@@ -23,11 +23,11 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.os.Build;
 import android.util.Log;
 import android.util.Xml;
 
 import androidx.annotation.NonNull;
-import androidx.core.os.LocaleListCompat;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -170,36 +170,41 @@
      * this method will throw an error.</p>
      */
     static void syncLocalesToFramework(Context context) {
-        ComponentName app_locales_component = new ComponentName(
-                context, APP_LOCALES_META_DATA_HOLDER_SERVICE_NAME);
+        if (Build.VERSION.SDK_INT >= 33) {
+            ComponentName app_locales_component = new ComponentName(
+                    context, APP_LOCALES_META_DATA_HOLDER_SERVICE_NAME);
 
-        if (context.getPackageManager().getComponentEnabledSetting(app_locales_component)
-                != COMPONENT_ENABLED_STATE_ENABLED) {
-            AppCompatDelegate.setAppContext(context);
-            // ComponentEnabledSetting for the app component app_locales_component is used as a
-            // marker to represent that the locales has been synced from AndroidX to framework
-            // If this marker is found in ENABLED state then we do not need to sync again.
-            if (getApplicationLocales().isEmpty()) {
-                // We check if some locales are applied by the framework or not (this is done to
-                // ensure that we don't overwrite newer locales set by the framework). If no
-                // app-locales are found then we need to sync the app-specific locales from androidX
-                // to framework.
+            if (context.getPackageManager().getComponentEnabledSetting(app_locales_component)
+                    != COMPONENT_ENABLED_STATE_ENABLED) {
+                // ComponentEnabledSetting for the app component app_locales_component is used as a
+                // marker to represent that the locales has been synced from AndroidX to framework
+                // If this marker is found in ENABLED state then we do not need to sync again.
+                if (getApplicationLocales().isEmpty()) {
+                    // We check if some locales are applied by the framework or not (this is done to
+                    // ensure that we don't overwrite newer locales set by the framework). If no
+                    // app-locales are found then we need to sync the app-specific locales from
+                    // androidX to framework.
 
-                String appLocales = readLocales(context);
-                // if locales are present in storage, call the setApplicationLocales() API. As the
-                // API version is >= 33, this call will be directed to the framework API and the
-                // locales will be persisted there.
-                AppCompatDelegate.setApplicationLocales(
-                        LocaleListCompat.forLanguageTags(appLocales));
+                    String appLocales = readLocales(context);
+                    // if locales are present in storage, call the setApplicationLocales() API. As
+                    // the API version is >= 33, this call will be directed to the framework API and
+                    // the locales will be persisted there.
+                    Object localeManager = context.getSystemService(Context.LOCALE_SERVICE);
+                    if (localeManager != null) {
+                        AppCompatDelegate.Api33Impl.localeManagerSetApplicationLocales(
+                                localeManager,
+                                AppCompatDelegate.Api24Impl.localeListForLanguageTags(appLocales));
+                    }
+                }
+                // setting ComponentEnabledSetting for app component using
+                // AppLocalesMetadataHolderService (used only for locales, thus minimizing
+                // the chances of conflicts). Setting it as ENABLED marks the success of app-locales
+                // sync from AndroidX to framework.
+                // Flag DONT_KILL_APP indicates that you don't want to kill the app containing the
+                // component.
+                context.getPackageManager().setComponentEnabledSetting(app_locales_component,
+                        COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ DONT_KILL_APP);
             }
-            // setting ComponentEnabledSetting for app component using
-            // AppLocalesMetadataHolderService (used only for locales, thus minimizing
-            // the chances of conflicts). Setting it as ENABLED marks the success of app-locales
-            // sync from AndroidX to framework.
-            // Flag DONT_KILL_APP indicates that you don't want to kill the app containing the
-            // component.
-            context.getPackageManager().setComponentEnabledSetting(app_locales_component,
-                    COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ DONT_KILL_APP);
         }
     }
 
diff --git a/appcompat/appcompat/src/main/res/values-b+sr+Latn/strings.xml b/appcompat/appcompat/src/main/res/values-b+sr+Latn/strings.xml
index b7cefc0..21337c6 100644
--- a/appcompat/appcompat/src/main/res/values-b+sr+Latn/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-b+sr+Latn/strings.xml
@@ -16,24 +16,24 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_action_mode_done" msgid="4692188335987374352">"Готово"</string>
-    <string name="abc_action_bar_home_description" msgid="5976598919945601918">"Идите на почетну"</string>
-    <string name="abc_action_bar_up_description" msgid="8388173803310557296">"Идите нагоре"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"Још опција"</string>
-    <string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"Скупи"</string>
-    <string name="abc_searchview_description_search" msgid="3417662926640357176">"Претражите"</string>
-    <string name="abc_search_hint" msgid="7208076849092622260">"Претражите…"</string>
-    <string name="abc_searchview_description_query" msgid="693312494995508443">"Претражите упит"</string>
-    <string name="abc_searchview_description_clear" msgid="3741173234950517107">"Обришите упит"</string>
-    <string name="abc_searchview_description_submit" msgid="1486535517437947103">"Пошаљите упит"</string>
-    <string name="abc_searchview_description_voice" msgid="2293578557972875415">"Гласовна претрага"</string>
-    <string name="abc_activitychooserview_choose_application" msgid="2165779757652331008">"Изаберите апликацију"</string>
-    <string name="abc_activity_chooser_view_see_all" msgid="1189761859438369441">"Прикажи све"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="9055268688411532828">"Делите помоћу апликације <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
-    <string name="abc_shareactionprovider_share_with" msgid="8875138169939072951">"Делите помоћу"</string>
-    <string name="abc_capital_on" msgid="884982626291842264">"УКЉУЧЕНО"</string>
-    <string name="abc_capital_off" msgid="4215997306490295099">"ИСКЉУЧЕНО"</string>
-    <string name="search_menu_title" msgid="6264217191555673260">"Претражите"</string>
+    <string name="abc_action_mode_done" msgid="4692188335987374352">"Gotovo"</string>
+    <string name="abc_action_bar_home_description" msgid="5976598919945601918">"Idite na početnu"</string>
+    <string name="abc_action_bar_up_description" msgid="8388173803310557296">"Idite nagore"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"Još opcija"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"Skupi"</string>
+    <string name="abc_searchview_description_search" msgid="3417662926640357176">"Pretražite"</string>
+    <string name="abc_search_hint" msgid="7208076849092622260">"Pretražite…"</string>
+    <string name="abc_searchview_description_query" msgid="693312494995508443">"Pretražite upit"</string>
+    <string name="abc_searchview_description_clear" msgid="3741173234950517107">"Obrišite upit"</string>
+    <string name="abc_searchview_description_submit" msgid="1486535517437947103">"Pošaljite upit"</string>
+    <string name="abc_searchview_description_voice" msgid="2293578557972875415">"Glasovna pretraga"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2165779757652331008">"Izaberite aplikaciju"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="1189761859438369441">"Prikaži sve"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="9055268688411532828">"Delite pomoću aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="8875138169939072951">"Delite pomoću"</string>
+    <string name="abc_capital_on" msgid="884982626291842264">"UKLJUČENO"</string>
+    <string name="abc_capital_off" msgid="4215997306490295099">"ISKLJUČENO"</string>
+    <string name="search_menu_title" msgid="6264217191555673260">"Pretražite"</string>
     <string name="abc_prepend_shortcut_label" msgid="5520303668377388990">"Menu+"</string>
     <string name="abc_menu_meta_shortcut_label" msgid="4192209724446364286">"Meta+"</string>
     <string name="abc_menu_ctrl_shortcut_label" msgid="2223301931652355242">"Ctrl+"</string>
@@ -41,7 +41,7 @@
     <string name="abc_menu_shift_shortcut_label" msgid="4741552369836443843">"Shift+"</string>
     <string name="abc_menu_sym_shortcut_label" msgid="6180552449598693998">"Sym+"</string>
     <string name="abc_menu_function_shortcut_label" msgid="375214403600139847">"Function+"</string>
-    <string name="abc_menu_space_shortcut_label" msgid="5473865519181928982">"тастер за размак"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="5473865519181928982">"taster za razmak"</string>
     <string name="abc_menu_enter_shortcut_label" msgid="7986526966204849475">"enter"</string>
     <string name="abc_menu_delete_shortcut_label" msgid="838001238306846836">"delete"</string>
 </resources>
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt
index b920c61..68a09f3 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/DeviceInfo.kt
@@ -30,6 +30,7 @@
         Build.FINGERPRINT.startsWith("unknown") ||
         Build.FINGERPRINT.contains("emulator") ||
         Build.MODEL.contains("google_sdk") ||
+        Build.MODEL.contains("sdk_gphone64") ||
         Build.MODEL.contains("Emulator") ||
         Build.MODEL.contains("Android SDK built for x86") ||
         Build.MANUFACTURER.contains("Genymotion") ||
@@ -82,7 +83,12 @@
 
         val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
         initialBatteryPercent = context.registerReceiver(null, filter)?.run {
-            val level = getIntExtra(BatteryManager.EXTRA_LEVEL, 100)
+            val level = if (getBooleanExtra(BatteryManager.EXTRA_PRESENT, true)) {
+                getIntExtra(BatteryManager.EXTRA_LEVEL, 100)
+            } else {
+                // If the device has no battery consider it full for this check.
+                100
+            }
             val scale = getIntExtra(BatteryManager.EXTRA_SCALE, 100)
             level * 100 / scale
         } ?: 100
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Errors.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Errors.kt
index 34b96fa..9919011 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Errors.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Errors.kt
@@ -209,7 +209,12 @@
 
         val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
         val batteryPercent = context.registerReceiver(null, filter)?.run {
-            val level = getIntExtra(BatteryManager.EXTRA_LEVEL, 100)
+            val level = if (getBooleanExtra(BatteryManager.EXTRA_PRESENT, true)) {
+                getIntExtra(BatteryManager.EXTRA_LEVEL, 100)
+            } else {
+                // If the device has no battery consider it full for this check.
+                100
+            }
             val scale = getIntExtra(BatteryManager.EXTRA_SCALE, 100)
             level * 100 / scale
         } ?: 100
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureSweepTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureSweepTest.kt
index 088d93a..bcb337f 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureSweepTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureSweepTest.kt
@@ -62,12 +62,13 @@
     }
 
     @FlakyTest(bugId = 258216025)
-    @SdkSuppress(minSdkVersion = LOWEST_BUNDLED_VERSION_SUPPORTED)
+    @SdkSuppress(minSdkVersion = LOWEST_BUNDLED_VERSION_SUPPORTED, maxSdkVersion = 33)
     @Test
     fun captureAndValidateTrace_bundled() = captureAndValidateTrace(unbundled = false)
 
     @FlakyTest(bugId = 258216025)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun captureAndValidateTrace_unbundled() = captureAndValidateTrace(unbundled = true)
 
     private fun captureAndValidateTrace(unbundled: Boolean) {
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkTraceTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkTraceTest.kt
index 7083a9c..f0b3030 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkTraceTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkTraceTest.kt
@@ -64,6 +64,7 @@
 
     @FlakyTest(bugId = 260715950)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun test_endToEnd() {
         assumeTrue(PerfettoHelper.isAbiSupported())
         StringSource.appTagTraceStrings.forEach { trace(it) { } }
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 3b8204b..de4ee97 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
@@ -17,31 +17,31 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="fingerprint_dialog_touch_sensor" msgid="1072308044213194243">"Додирн. сензор за отисак прста"</string>
-    <string name="fingerprint_not_recognized" msgid="3873359464293253009">"Није препознат"</string>
-    <string name="fingerprint_error_hw_not_available" msgid="8216738333501875566">"Хардвер за отиске прстију није доступан."</string>
-    <string name="fingerprint_error_no_fingerprints" msgid="7520712796891883488">"Није регистрован ниједан отисак прста."</string>
-    <string name="fingerprint_error_hw_not_present" msgid="6306988885793029438">"Овај уређај нема сензор за отисак прста"</string>
-    <string name="fingerprint_error_user_canceled" msgid="7627716295344353987">"Корисник је отказао радњу са отиском прста."</string>
-    <string name="fingerprint_error_lockout" msgid="7291787166416782245">"Превише покушаја. Пробајте поново касније."</string>
-    <string name="default_error_msg" msgid="4776854077120974966">"Непозната грешка"</string>
-    <string name="generic_error_user_canceled" msgid="7309881387583143581">"Корисник је отказао потврду идентитета."</string>
-    <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>
-    <string name="use_fingerprint_label" msgid="6961788485681412417">"Користите отисак прста"</string>
-    <string name="use_face_label" msgid="6533512708069459542">"Користите лице"</string>
-    <string name="use_biometric_label" msgid="6524145989441579428">"Користите биометрију"</string>
-    <string name="use_screen_lock_label" msgid="5459869335976243512">"Користи закључавање екрана"</string>
-    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Користите отисак прста или закључавање екрана"</string>
-    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Користите закључавање лицем или закључавање екрана"</string>
-    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Користите биометрију или закључавање екрана"</string>
-    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Наставите помоћу отиска прста"</string>
-    <string name="face_prompt_message" msgid="2282389249605674226">"Потврдите идентитет лицем да бисте наставили"</string>
-    <string name="biometric_prompt_message" msgid="1160635338192065472">"Користите биометријски податак да бисте наставили"</string>
-    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Употребите закључавање екрана да бисте наставили"</string>
-    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Користите отисак прста или закључавање екрана да бисте наставили"</string>
-    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Користите лице или закључавање екрана да бисте наставили"</string>
-    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Користите биометријски податак или закључавање екрана да бисте наставили"</string>
+    <string name="fingerprint_dialog_touch_sensor" msgid="1072308044213194243">"Dodirn. senzor za otisak prsta"</string>
+    <string name="fingerprint_not_recognized" msgid="3873359464293253009">"Nije prepoznat"</string>
+    <string name="fingerprint_error_hw_not_available" msgid="8216738333501875566">"Hardver za otiske prstiju nije dostupan."</string>
+    <string name="fingerprint_error_no_fingerprints" msgid="7520712796891883488">"Nije registrovan nijedan otisak prsta."</string>
+    <string name="fingerprint_error_hw_not_present" msgid="6306988885793029438">"Ovaj uređaj nema senzor za otisak prsta"</string>
+    <string name="fingerprint_error_user_canceled" msgid="7627716295344353987">"Korisnik je otkazao radnju sa otiskom prsta."</string>
+    <string name="fingerprint_error_lockout" msgid="7291787166416782245">"Previše pokušaja. Probajte ponovo kasnije."</string>
+    <string name="default_error_msg" msgid="4776854077120974966">"Nepoznata greška"</string>
+    <string name="generic_error_user_canceled" msgid="7309881387583143581">"Korisnik je otkazao potvrdu identiteta."</string>
+    <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>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Koristite otisak prsta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Koristite lice"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Koristite biometriju"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Koristi zaključavanje ekrana"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Koristite otisak prsta ili zaključavanje ekrana"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Koristite zaključavanje licem ili zaključavanje ekrana"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Koristite biometriju ili zaključavanje ekrana"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Nastavite pomoću otiska prsta"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Potvrdite identitet licem da biste nastavili"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Koristite biometrijski podatak da biste nastavili"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Upotrebite zaključavanje ekrana da biste nastavili"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Koristite otisak prsta ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Koristite biometrijski podatak ili zaključavanje ekrana da biste nastavili"</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 7ee0178..878b295 100644
--- a/biometric/biometric/src/main/res/values-te/strings.xml
+++ b/biometric/biometric/src/main/res/values-te/strings.xml
@@ -26,7 +26,7 @@
     <string name="fingerprint_error_lockout" msgid="7291787166416782245">"చాలా ఎక్కువ ప్రయత్నాలు చేశారు. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి."</string>
     <string name="default_error_msg" msgid="4776854077120974966">"తెలియని ఎర్రర్"</string>
     <string name="generic_error_user_canceled" msgid="7309881387583143581">"వినియోగదారు ద్వారా ప్రామాణీకరణ రద్దు చేయబడింది"</string>
-    <string name="confirm_device_credential_password" msgid="5912733858573823945">"పాస్‌వర్డ్‌ను ఉపయోగించు"</string>
+    <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>
diff --git a/browser/browser/src/main/res/values-b+sr+Latn/strings.xml b/browser/browser/src/main/res/values-b+sr+Latn/strings.xml
index a4d760d..b695dfd 100644
--- a/browser/browser/src/main/res/values-b+sr+Latn/strings.xml
+++ b/browser/browser/src/main/res/values-b+sr+Latn/strings.xml
@@ -16,8 +16,8 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="fallback_menu_item_open_in_browser" msgid="3413186855122069269">"Отвори у прегледачу"</string>
-    <string name="fallback_menu_item_copy_link" msgid="4566929209979330987">"Копирај линк"</string>
-    <string name="fallback_menu_item_share_link" msgid="7145444925855055364">"Дели линк"</string>
-    <string name="copy_toast_msg" msgid="3260749812566568062">"Линк је копиран у привремену меморију"</string>
+    <string name="fallback_menu_item_open_in_browser" msgid="3413186855122069269">"Otvori u pregledaču"</string>
+    <string name="fallback_menu_item_copy_link" msgid="4566929209979330987">"Kopiraj link"</string>
+    <string name="fallback_menu_item_share_link" msgid="7145444925855055364">"Deli link"</string>
+    <string name="copy_toast_msg" msgid="3260749812566568062">"Link je kopiran u privremenu memoriju"</string>
 </resources>
diff --git a/buildSrc/README.md b/buildSrc/README.md
index 4d251a3..c4c40a8 100644
--- a/buildSrc/README.md
+++ b/buildSrc/README.md
@@ -10,6 +10,21 @@
   *  https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution
   *  https://github.com/gradle/gradle/issues/17813
 
-The buildSrc directory is split into multiple projects based on what needs to be available on the classpath when parsing build.gradle files outside of buildSrc. Any classes that Gradle puts on the classpath for parsing build.gradle files can theoretically overwrite the implementation of tasks in those projects. So, if a class is on that classpath and it changes then Gradle is not confident that the task is necessarily up-to-date and Gradle will rerun it. So, we move as many classes as possible off of this classpath by applying them from within a separate .gradle script instead.
+The buildSrc directory is split into multiple projects based on what needs to be available on the classpath when parsing build.gradle files outside of buildSrc.
+Any classes that Gradle puts on the classpath for parsing build.gradle files can theoretically overwrite the implementation of tasks in those projects.
+So, if a class is on that classpath and it changes, then Gradle is not confident that the task is necessarily up-to-date and Gradle will rerun it.
+So, we move as many classes as possible off of this classpath by applying them from within a separate .gradle script instead.
+
+To verify that classes in private/ don't unnecessarily affect the up-to-datedness status of tasks from outside plugins, try something like this:
+
+```
+  # run a kotlin compilation task
+  ./gradlew :core:core:compileDebugKotlin
+  # make some unrelated changes in buildSrc:
+  sed -i 's/ignoreCase = true/ignoreCase = false/g' buildSrc/private/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
+  # rerun same kotlin compilation task
+  ./gradlew :core:core:compileDebugKotlin | cat
+  # see that the tasks were up-to-date
+```
 
 See also b/140265324 for more information.
diff --git a/buildSrc/plugins/build.gradle b/buildSrc/plugins/build.gradle
index 21d6482..f5ca9cf 100644
--- a/buildSrc/plugins/build.gradle
+++ b/buildSrc/plugins/build.gradle
@@ -5,3 +5,9 @@
 }
 
 apply from: "../shared.gradle"
+
+// The artifacts built by this project require at runtime the artifacts from `:buildSrc:private`.
+// However, we don't want `:buildSrc:private` artifacts to be on their runtime classpath, because
+// that means that any changes to those artifacts can invalidate task up-to-datedness
+// (see ../README.md)
+tasks["jar"].dependsOn(":private:build")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
index ad824a2..0d57dae 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
@@ -26,11 +26,9 @@
 import org.gradle.api.DefaultTask
 import org.gradle.api.file.ConfigurableFileCollection
 import org.gradle.api.file.FileCollection
-import org.gradle.api.file.RegularFile
 import org.gradle.api.file.RegularFileProperty
 import org.gradle.api.model.ObjectFactory
 import org.gradle.api.provider.ListProperty
-import org.gradle.api.provider.Provider
 import org.gradle.api.provider.SetProperty
 import org.gradle.api.tasks.CacheableTask
 import org.gradle.api.tasks.Classpath
@@ -125,13 +123,6 @@
                     "file://${docsProjectDir.toPath()}/package-lists/$name/package-list"
             )
         }
-        val sourceLinks = listOf(
-            DokkaInputModels.SrcLink(
-                // This is part of dokka source links but isn't needed by dackka
-                File("/"),
-                baseSourceLink
-            )
-        )
         val gson = GsonBuilder().create()
         val multiplatformSourceSets = projectStructureMetadataFile
             .takeIf { it.exists() }
@@ -160,7 +151,8 @@
                         noJdkLink = !analysisPlatform.androidOrJvm(),
                         noAndroidSdkLink = analysisPlatform != DokkaAnalysisPlatform.ANDROID,
                         noStdlibLink = false,
-                        sourceLinks = sourceLinks
+                        // Dackka source link configuration doesn't use the Dokka version
+                        sourceLinks = emptyList()
                     )
                 }
         } ?: emptyList()
@@ -178,7 +170,8 @@
                 noJdkLink = false,
                 noAndroidSdkLink = false,
                 noStdlibLink = false,
-                sourceLinks = sourceLinks
+                // Dackka source link configuration doesn't use the Dokka version
+                sourceLinks = emptyList()
             )
         ) + multiplatformSourceSets
     }
@@ -234,10 +227,6 @@
             classpath = dackkaClasspath,
             argsFile = computeArguments(),
             workerExecutor = workerExecutor,
-            excludedPackages = excludedPackages,
-            excludedPackagesForJava = excludedPackagesForJava,
-            excludedPackagesForKotlin = excludedPackagesForKotlin,
-            libraryMetadataFile = libraryMetadataFile,
         )
     }
 
@@ -257,29 +246,17 @@
 interface DackkaParams : WorkParameters {
     val args: ListProperty<String>
     val classpath: SetProperty<File>
-    val excludedPackages: ListProperty<String>
-    val excludedPackagesForJava: ListProperty<String>
-    val excludedPackagesForKotlin: ListProperty<String>
-    var libraryMetadataFile: Provider<RegularFile>
 }
 
 fun runDackkaWithArgs(
     classpath: FileCollection,
     argsFile: File,
     workerExecutor: WorkerExecutor,
-    excludedPackages: Set<String>,
-    excludedPackagesForJava: Set<String>,
-    excludedPackagesForKotlin: Set<String>,
-    libraryMetadataFile: Provider<RegularFile>,
 ) {
     val workQueue = workerExecutor.noIsolation()
     workQueue.submit(DackkaWorkAction::class.java) { parameters ->
         parameters.args.set(listOf(argsFile.path, "-loggingLevel", "WARN"))
         parameters.classpath.set(classpath)
-        parameters.excludedPackages.set(excludedPackages)
-        parameters.excludedPackagesForJava.set(excludedPackagesForJava)
-        parameters.excludedPackagesForKotlin.set(excludedPackagesForKotlin)
-        parameters.libraryMetadataFile = libraryMetadataFile
     }
 }
 
@@ -291,28 +268,6 @@
             it.mainClass.set("org.jetbrains.dokka.MainKt")
             it.args = parameters.args.get()
             it.classpath(parameters.classpath.get())
-
-            // b/183989795 tracks moving these away from an environment variables
-            it.environment("DEVSITE_TENANT", "androidx")
-            it.environment("LIBRARY_METADATA_FILE", parameters.libraryMetadataFile.get().toString())
-
-            if (parameters.excludedPackages.get().isNotEmpty())
-                it.environment(
-                    "DACKKA_EXCLUDED_PACKAGES",
-                    parameters.excludedPackages.get().joinToString(",")
-                )
-
-            if (parameters.excludedPackagesForJava.get().isNotEmpty())
-                it.environment(
-                    "DACKKA_EXCLUDED_PACKAGES_JAVA",
-                    parameters.excludedPackagesForJava.get().joinToString(",")
-                )
-
-            if (parameters.excludedPackagesForKotlin.get().isNotEmpty())
-                it.environment(
-                    "DACKKA_EXCLUDED_PACKAGES_KOTLIN",
-                    parameters.excludedPackagesForKotlin.get().joinToString(",")
-                )
         }
     }
 }
diff --git a/busytown/androidx-multiplatform.sh b/busytown/androidx-multiplatform.sh
deleted file mode 120000
index 71f42d2..0000000
--- a/busytown/androidx-multiplatform.sh
+++ /dev/null
@@ -1 +0,0 @@
-androidx_multiplatform.sh
\ No newline at end of file
diff --git a/busytown/androidx-native-mac-host-tests.sh b/busytown/androidx-native-mac-host-tests.sh
new file mode 120000
index 0000000..a943011
--- /dev/null
+++ b/busytown/androidx-native-mac-host-tests.sh
@@ -0,0 +1 @@
+./androidx_multiplatform_host_tests_mac.sh
\ No newline at end of file
diff --git a/busytown/androidx-native-mac.sh b/busytown/androidx-native-mac.sh
new file mode 120000
index 0000000..67f3860
--- /dev/null
+++ b/busytown/androidx-native-mac.sh
@@ -0,0 +1 @@
+./androidx_multiplatform_mac.sh
\ No newline at end of file
diff --git a/busytown/androidx_multiplatform.sh b/busytown/androidx_compose_multiplatform.sh
similarity index 100%
rename from busytown/androidx_multiplatform.sh
rename to busytown/androidx_compose_multiplatform.sh
diff --git a/busytown/androidx_multiplatform.sh b/busytown/androidx_multiplatform.sh
new file mode 120000
index 0000000..e2a6ac8
--- /dev/null
+++ b/busytown/androidx_multiplatform.sh
@@ -0,0 +1 @@
+./androidx_compose_multiplatform.sh
\ No newline at end of file
diff --git a/busytown/androidx-native-mac-host-tests.sh b/busytown/androidx_multiplatform_host_tests_mac.sh
similarity index 72%
rename from busytown/androidx-native-mac-host-tests.sh
rename to busytown/androidx_multiplatform_host_tests_mac.sh
index 9c38c66..8da2ed5 100755
--- a/busytown/androidx-native-mac-host-tests.sh
+++ b/busytown/androidx_multiplatform_host_tests_mac.sh
@@ -1,6 +1,11 @@
 #!/bin/bash
 set -e
 
+# Runs host tests for all projects that support KMP except for Compose-specific projects which are
+# already covered by androidx_compose_multiplatform.sh
+
+# Must be run on Mac
+
 export ANDROIDX_PROJECTS=KMP
 
 # disable GCP cache, these machines don't have credentials.
diff --git a/busytown/androidx_sandbox.sh b/busytown/androidx_multiplatform_linux.sh
similarity index 71%
rename from busytown/androidx_sandbox.sh
rename to busytown/androidx_multiplatform_linux.sh
index 386eb9a..3f9d518 100755
--- a/busytown/androidx_sandbox.sh
+++ b/busytown/androidx_multiplatform_linux.sh
@@ -2,6 +2,11 @@
 set -e
 cd "$(dirname $0)"
 
+# Builds all projects that support KMP except for Compose-specific projects which are already
+# covered by androidx_compose_multiplatform.sh
+
+# Must be run on Linux
+
 # build just KMP projects. This will also enable native targets.
 export ANDROIDX_PROJECTS=KMP
 
diff --git a/busytown/androidx-native-mac.sh b/busytown/androidx_multiplatform_mac.sh
similarity index 79%
rename from busytown/androidx-native-mac.sh
rename to busytown/androidx_multiplatform_mac.sh
index 84d9387..d7f9541 100755
--- a/busytown/androidx-native-mac.sh
+++ b/busytown/androidx_multiplatform_mac.sh
@@ -2,6 +2,11 @@
 set -e
 cd "$(dirname $0)"
 
+# Builds all projects that support KMP except for Compose-specific projects which are already
+# covered by androidx_compose_multiplatform.sh
+
+# Must be run on Mac
+
 export ANDROIDX_PROJECTS=KMP
 
 # disable GCP cache, these machines don't have credentials.
diff --git a/busytown/androidx_sandbox.sh b/busytown/androidx_sandbox.sh
new file mode 120000
index 0000000..dca76ba
--- /dev/null
+++ b/busytown/androidx_sandbox.sh
@@ -0,0 +1 @@
+./androidx_multiplatform_linux.sh
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt
index 33114d8..a8a75db 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt
@@ -43,6 +43,7 @@
 import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.Config
+import androidx.lifecycle.MutableLiveData
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
@@ -99,7 +100,7 @@
         }
     }
 
-    override var runningUseCases = useCases.toSet()
+    override val runningUseCasesLiveData = MutableLiveData(useCases.toSet())
 
     override fun <T> setParameterAsync(
         key: CaptureRequest.Key<T>,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
index 2b0ba9b..8f85b20 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
@@ -31,6 +31,7 @@
 import androidx.camera.core.FocusMeteringAction
 import androidx.camera.core.FocusMeteringResult
 import androidx.camera.core.MeteringPoint
+import androidx.camera.core.Preview
 import androidx.camera.core.impl.CameraControlInternal
 import com.google.common.util.concurrent.ListenableFuture
 import dagger.Binds
@@ -55,14 +56,33 @@
         get() = _useCaseCamera
         set(value) {
             _useCaseCamera = value
+
+            // reset to null since preview ratio may not be applicable for current runningUseCases
+            previewAspectRatio = null
+            _useCaseCamera?.runningUseCasesLiveData?.observeForever { useCases ->
+                useCases.forEach { useCase ->
+                    if (useCase is Preview) {
+                        useCase.attachedSurfaceResolution?.apply {
+                            previewAspectRatio = Rational(width, height)
+                        }
+                    }
+                }
+            }
         }
 
     override fun reset() {
         cancelFocusAndMeteringAsync()
     }
 
-    private val sensorRect =
+    private var previewAspectRatio: Rational? = null
+    private val sensorRect by lazy {
+        // TODO("b/262225455"): use the actual crop sensor region like in camera-camera2
         cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
+    }
+
+    private val defaultAspectRatio: Rational
+        get() = previewAspectRatio ?: Rational(sensorRect.width(), sensorRect.height())
+
     private val maxAfRegionCount =
         cameraProperties.metadata.getOrDefault(CameraCharacteristics.CONTROL_MAX_REGIONS_AF, 0)
     private val maxAeRegionCount =
@@ -76,10 +96,6 @@
         val signal = CompletableDeferred<FocusMeteringResult>()
 
         useCaseCamera?.let { useCaseCamera ->
-            // TODO(sushilnath@): use preview aspect ratio instead of sensor active array aspect
-            //  ratio.
-            val defaultAspectRatio = Rational(sensorRect.width(), sensorRect.height())
-
             threads.sequentialScope.launch {
                 signal.complete(
                     useCaseCamera.requestControl.startFocusAndMeteringAsync(
@@ -117,9 +133,6 @@
     fun isFocusMeteringSupported(
         action: FocusMeteringAction
     ): Boolean {
-        // TODO(sushilnath@): use preview aspect ratio instead of sensor active array aspect ratio.
-        val defaultAspectRatio = Rational(sensorRect.width(), sensorRect.height())
-
         val rectanglesAe = meteringRegionsFromMeteringPoints(
             action.meteringPointsAe,
             maxAeRegionCount,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
index dc0cf07..86749f7 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
@@ -30,6 +30,7 @@
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.Config
 import androidx.camera.core.impl.SessionConfig
+import androidx.lifecycle.MutableLiveData
 import dagger.Binds
 import dagger.Module
 import javax.inject.Inject
@@ -46,7 +47,7 @@
 
 interface UseCaseCamera {
     // UseCases
-    var runningUseCases: Set<UseCase>
+    val runningUseCasesLiveData: MutableLiveData<Set<UseCase>>
 
     // RequestControl of the UseCaseCamera
     val requestControl: UseCaseCameraRequestControl
@@ -81,9 +82,8 @@
     private val debugId = useCaseCameraIds.incrementAndGet()
     private val closed = atomic(false)
 
-    override var runningUseCases = setOf<UseCase>()
-        set(value) {
-            field = value
+    override val runningUseCasesLiveData = MutableLiveData<Set<UseCase>>(emptySet()).apply {
+        observeForever { value ->
             // Note: This may be called with the same set of values that was previously set. This
             // is used as a signal to indicate the properties of the UseCase may have changed.
             SessionConfigAdapter(value).getValidSessionConfigOrNull()?.let {
@@ -97,6 +97,7 @@
                 )
             }
         }
+    }
 
     init {
         debug { "Configured $this for $useCases" }
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
index 842f457..e49ea46 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
@@ -218,7 +218,7 @@
         when {
             shouldAddRepeatingUseCase(runningUseCases) -> addRepeatingUseCase()
             shouldRemoveRepeatingUseCase(runningUseCases) -> removeRepeatingUseCase()
-            else -> camera?.runningUseCases = runningUseCases
+            else -> camera?.runningUseCasesLiveData?.value = runningUseCases
         }
     }
 
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt
index b12e900..e970d28c 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt
@@ -26,6 +26,7 @@
 import android.hardware.camera2.params.MeteringRectangle
 import android.os.Build
 import android.util.Rational
+import android.util.Size
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.Result3A
 import androidx.camera.camera2.pipe.integration.impl.CameraProperties
@@ -41,8 +42,14 @@
 import androidx.camera.core.FocusMeteringAction
 import androidx.camera.core.FocusMeteringResult
 import androidx.camera.core.MeteringPointFactory
+import androidx.camera.core.Preview
 import androidx.camera.core.SurfaceOrientedMeteringPointFactory
 import androidx.camera.core.UseCase
+import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.testing.SurfaceTextureProvider
+import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.fakes.FakeUseCase
+import androidx.lifecycle.MutableLiveData
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import com.google.common.util.concurrent.FutureCallback
@@ -80,6 +87,8 @@
 
 private val AREA_WIDTH = (MeteringPointFactory.getDefaultPointSize() * SENSOR_WIDTH).toInt()
 private val AREA_HEIGHT = (MeteringPointFactory.getDefaultPointSize() * SENSOR_HEIGHT).toInt()
+private val AREA_WIDTH_2 = (MeteringPointFactory.getDefaultPointSize() * SENSOR_WIDTH2).toInt()
+private val AREA_HEIGHT_2 = (MeteringPointFactory.getDefaultPointSize() * SENSOR_HEIGHT2).toInt()
 
 private val M_RECT_1 = Rect(0, 0, AREA_WIDTH / 2, AREA_HEIGHT / 2)
 private val M_RECT_2 = Rect(0, SENSOR_HEIGHT - AREA_HEIGHT / 2, AREA_WIDTH / 2, SENSOR_HEIGHT)
@@ -370,6 +379,92 @@
     }
 
     @Test
+    fun previewFovAdjusted_16by9_to_4by3() {
+        // use 16:9 preview aspect ratio with sensor region of 4:3 (camera 0)
+        focusMeteringControl = initFocusMeteringControl(
+            CAMERA_ID_0,
+            setOf(createPreview(Size(1920, 1080)))
+        )
+
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(point1).build()
+        )
+
+        val adjustedRect = Rect(0, 60 - AREA_HEIGHT / 2, AREA_WIDTH / 2, 60 + AREA_HEIGHT / 2)
+        with(fakeRequestControl.focusMeteringCalls.last()) {
+            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
+            assertWithMessage("Wrong AF region").that(afRegions[0].rect).isEqualTo(adjustedRect)
+        }
+    }
+
+    @Test
+    fun previewFovAdjusted_4by3_to_16by9() {
+        // use 4:3 preview aspect ratio with sensor region of 16:9 (camera 1)
+        focusMeteringControl = initFocusMeteringControl(
+            CAMERA_ID_1,
+            setOf(createPreview(Size(640, 480)))
+        )
+
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(point1).build()
+        )
+
+        val adjustedRect = Rect(
+            240 - AREA_WIDTH_2 / 2, 0,
+            240 + AREA_WIDTH_2 / 2, AREA_HEIGHT_2 / 2
+        )
+        with(fakeRequestControl.focusMeteringCalls.last()) {
+            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
+            assertWithMessage("Wrong AF region").that(afRegions[0].rect).isEqualTo(adjustedRect)
+        }
+    }
+
+    @Test
+    fun customFovAdjusted() {
+        // 16:9 to 4:3
+        val useCase = FakeUseCase()
+        useCase.updateSuggestedResolution(Size(1920, 1080))
+
+        val factory = SurfaceOrientedMeteringPointFactory(1.0f, 1.0f, useCase)
+        val point = factory.createPoint(0f, 0f)
+
+        focusMeteringControl = initFocusMeteringControl(
+            CAMERA_ID_0,
+            setOf(createPreview(Size(640, 480)))
+        )
+
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(point).build()
+        )
+
+        val adjustedRect = Rect(0, 60 - AREA_HEIGHT / 2, AREA_WIDTH / 2, 60 + AREA_HEIGHT / 2)
+        with(fakeRequestControl.focusMeteringCalls.last()) {
+            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
+            assertWithMessage("Wrong AF region").that(afRegions[0].rect).isEqualTo(adjustedRect)
+        }
+    }
+
+    @Test
+    fun previewRatioNotUsed_whenPreviewUseCaseIsRemoved() {
+        // add 16:9 aspect ratio Preview with sensor region of 4:3 (camera 0), then remove Preview
+        focusMeteringControl = initFocusMeteringControl(
+            CAMERA_ID_0,
+            setOf(createPreview(Size(1920, 1080)))
+        )
+        fakeUseCaseCamera.runningUseCasesLiveData.value = emptySet()
+
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(point1).build()
+        )
+
+        val adjustedRect = Rect(0, 60 - AREA_HEIGHT / 2, AREA_WIDTH / 2, 60 + AREA_HEIGHT / 2)
+        with(fakeRequestControl.focusMeteringCalls.last()) {
+            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
+            assertWithMessage("Wrong AF region").that(afRegions[0].rect).isEqualTo(adjustedRect)
+        }
+    }
+
+    @Test
     fun meteringPointsWithSize_convertedCorrectly() {
         val point1 = pointFactory.createPoint(0.5f, 0.5f, 1.0f)
         val point2 = pointFactory.createPoint(0.5f, 0.5f, 0.5f)
@@ -436,8 +531,8 @@
     }
 
     @Test
-    @Ignore("When AfState is null, it means AF is not supported")
-    fun startFocusMetering_AfStateIsNull_completesWithFocusFalse() {
+    @Ignore("b/263323720: When AfState is null, it means AF is not supported")
+    fun startFocusMetering_AfStateIsNull_completesWithFocusTrue() {
         fakeRequestControl.focusMeteringResult3A = Result3A(
             status = Result3A.Status.OK,
             frameMetadata = FakeFrameMetadata(
@@ -457,7 +552,7 @@
     }
 
     @Test
-    @Ignore("When AF is not supported, focus should be reported as successful")
+    @Ignore("b/263323720: When AF is not supported, focus should be reported as successful")
     fun startFocusMeteringAfRequested_CameraNotSupportAfAuto_CompletesWithTrue() {
         // Use camera which does not support AF_AUTO
         focusMeteringControl = initFocusMeteringControl(CAMERA_ID_2)
@@ -681,28 +776,22 @@
     }
 
     // TODO: Port the following tests once their corresponding logics have been implemented.
-    //  - triggerAfWithTemplate, triggerAePrecaptureWithTemplate, cancelAfAeTriggerWithTemplate
+    //  - [b/255679866] triggerAfWithTemplate, triggerAePrecaptureWithTemplate,
+    //          cancelAfAeTriggerWithTemplate
     //  - startFocusAndMetering_AfRegionCorrectedByQuirk
-    //  - cropRegionIsSet_resultBasedOnCropRegion
-    //  - previewFovAdjusted_16by9_to_4by3, previewFovAdjusted_4by3_to_16by9, customFovAdjusted
-    //  - withAFPoints_AFIsTriggered, withoutAFPoints_AFIsNotTriggered (ref: TapToFocusDeviceTest)
-    //  - autoCancelDuration_completeWithIsFocusSuccessfulFalse
-    //  - shorterAutoCancelDuration_cancelIsCalled_completeActionFutureIsNotCalled
-    //  - longerAutoCancelDuration_cancelIsCalled_afterCompleteWithIsFocusSuccessfulFalse
-    //  - autoCancelDurationDisabled_completeAfterAutoFocusTimeoutDuration
-    //  The following ones should probably be tested with actual camera (shadow or device) since
-    //  these tests guess what camera would return for provided parameters,
-    //  I think it will be better to test these in actual devices (b/263322280). Additionally, we
-    //  should also add some tests here to check if toFocusMeteringResult is working properly.
-    //  - startFocusMeteringAEAWB_sessionUpdated_completesWithFocusFalse
-    //  - startFocusMeteringAE_sessionUpdated_completesWithFocusFalse
-    //  - startFocusMeteringAFOnly_sessionUpdated_completesWithFocusTrue
+    //  - [b/262225455] cropRegionIsSet_resultBasedOnCropRegion
+    //  - [b/205662153] autoCancelDuration_completeWithIsFocusSuccessfulFalse,
+    //      shorterAutoCancelDuration_cancelIsCalled_completeActionFutureIsNotCalled,
+    //      longerAutoCancelDuration_cancelIsCalled_afterCompleteWithIsFocusSuccessfulFalse,
+    //      autoCancelDurationDisabled_completeAfterAutoFocusTimeoutDuration
     //  The following ones will depend on how exactly they will be implemented.
-    //  - cancelFocusAndMetering_* (probably many of these tests will no longer be applicable in
-    //      this level since Controller3A handles things a bit differently)
-    //  - addFocusMeteringOptions_hasCorrectAfMode,startFocusMetering_isAfAutoModeIsTrue,
-    //      startFocusMetering_AfNotInvolved_isAfAutoModeIsSet,
-    //      startAndThenCancel_isAfAutoModeIsFalse (an alternative way can be checking the AF mode
+    //  - [b/205662153] cancelFocusAndMetering_* (probably many of these tests will no longer be
+    //      applicable in this level since Controller3A handles things a bit differently)
+    //  - [b/264018162] addFocusMeteringOptions_hasCorrectAfMode,
+    //                  startFocusMetering_isAfAutoModeIsTrue,
+    //                  startFocusMetering_AfNotInvolved_isAfAutoModeIsSet,
+    //                  startAndThenCancel_isAfAutoModeIsFalse
+    //      (an alternative way can be checking the AF mode
     //      at the frame with AF_TRIGGER_START request in capture callback, but this requires
     //      invoking actual camera operations, ref: TapToFocusDeviceTest)
 
@@ -768,37 +857,41 @@
         focusMeteringResultCallback.await()
     }
 
-    private fun initFocusMeteringControl(cameraId: String) =
-        FocusMeteringControl(
+    private val fakeUseCaseCamera = object : UseCaseCamera {
+        override val runningUseCasesLiveData: MutableLiveData<Set<UseCase>> =
+            MutableLiveData(emptySet())
+
+        override val requestControl: UseCaseCameraRequestControl
+            get() = fakeRequestControl
+
+        override fun <T> setParameterAsync(
+            key: CaptureRequest.Key<T>,
+            value: T,
+            priority: androidx.camera.core.impl.Config.OptionPriority
+        ): Deferred<Unit> {
+            TODO("Not yet implemented")
+        }
+
+        override fun setParametersAsync(
+            values: Map<CaptureRequest.Key<*>, Any>,
+            priority: androidx.camera.core.impl.Config.OptionPriority
+        ): Deferred<Unit> {
+            TODO("Not yet implemented")
+        }
+
+        override fun close(): Job {
+            TODO("Not yet implemented")
+        }
+    }
+
+    private fun initFocusMeteringControl(
+        cameraId: String,
+        useCases: Set<UseCase> = emptySet(),
+    ) = FocusMeteringControl(
             cameraPropertiesMap[cameraId]!!, fakeUseCaseThreads
         ).apply {
-            useCaseCamera = object : UseCaseCamera {
-                override var runningUseCases: Set<UseCase>
-                    get() = TODO("Not yet implemented")
-                    set(@Suppress("UNUSED_PARAMETER") value) {}
-
-                override val requestControl: UseCaseCameraRequestControl
-                    get() = fakeRequestControl
-
-                override fun <T> setParameterAsync(
-                    key: CaptureRequest.Key<T>,
-                    value: T,
-                    priority: androidx.camera.core.impl.Config.OptionPriority
-                ): Deferred<Unit> {
-                    TODO("Not yet implemented")
-                }
-
-                override fun setParametersAsync(
-                    values: Map<CaptureRequest.Key<*>, Any>,
-                    priority: androidx.camera.core.impl.Config.OptionPriority
-                ): Deferred<Unit> {
-                    TODO("Not yet implemented")
-                }
-
-                override fun close(): Job {
-                    TODO("Not yet implemented")
-                }
-            }
+            fakeUseCaseCamera.runningUseCasesLiveData.value = useCases
+            useCaseCamera = fakeUseCaseCamera
         }
 
     private fun initCameraProperties(
@@ -903,4 +996,18 @@
             characteristics3
         )
     }
+
+    private fun createPreview(suggestedResolution: Size) =
+        Preview.Builder()
+            .setCaptureOptionUnpacker { _, _ -> }
+            .setSessionOptionUnpacker() { _, _ -> }
+            .build().apply {
+                setSurfaceProvider(
+                    CameraXExecutors.mainThreadExecutor(),
+                    SurfaceTextureProvider.createSurfaceTextureProvider()
+                )
+            }.also {
+                it.bindToCamera(FakeCamera("0"), null, null)
+                it.updateSuggestedResolution(suggestedResolution)
+            }
 }
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt
index 00097a2..ce83291 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt
@@ -110,7 +110,7 @@
             threads = useCaseThreads,
             requestControl = requestControl
         ).also {
-            it.runningUseCases = setOf(fakeUseCase)
+            it.runningUseCasesLiveData.value = setOf(fakeUseCase)
         }
         assumeTrue(
             fakeCameraGraph.fakeCameraGraphSession.repeatingRequestSemaphore.tryAcquire(
@@ -124,7 +124,7 @@
                 addSurface(surface)
             }
         )
-        useCaseCamera.runningUseCases = setOf(fakeUseCase)
+        useCaseCamera.runningUseCasesLiveData.value = setOf(fakeUseCase)
 
         // Assert. The stopRepeating() should be called.
         assertThat(
@@ -143,4 +143,4 @@
         updateSessionConfig(sessionConfigBuilder.build())
         notifyActive()
     }
-}
\ No newline at end of file
+}
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt
index 0eec27c..8641662 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt
@@ -81,7 +81,7 @@
         useCaseManager.attach(listOf(useCase))
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCases
+        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
         assertThat(enabledUseCases).isEmpty()
     }
 
@@ -96,7 +96,7 @@
         useCaseManager.activate(useCase)
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCases
+        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
         assertThat(enabledUseCases).containsExactly(useCase)
     }
 
@@ -113,7 +113,7 @@
         useCaseManager.activate(imageCapture)
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCases
+        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
         assertThat(enabledUseCases).containsExactly(preview, imageCapture)
     }
 
@@ -128,7 +128,9 @@
         useCaseManager.activate(imageCapture)
 
         // Assert
-        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCases?.map { it::class.java }
+        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCasesLiveData?.value?.map {
+            it::class.java
+        }
         assertThat(enabledUseCaseClasses).containsExactly(
             ImageCapture::class.java,
             MeteringRepeating::class.java
@@ -149,7 +151,7 @@
         useCaseManager.activate(preview)
 
         // Assert
-        val activeUseCases = useCaseManager.camera?.runningUseCases
+        val activeUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
         assertThat(activeUseCases).containsExactly(preview, imageCapture)
     }
 
@@ -167,7 +169,9 @@
         useCaseManager.deactivate(preview)
 
         // Assert
-        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCases?.map { it::class.java }
+        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCasesLiveData?.value?.map {
+            it::class.java
+        }
         assertThat(enabledUseCaseClasses).containsExactly(
             ImageCapture::class.java,
             MeteringRepeating::class.java
@@ -186,7 +190,7 @@
         useCaseManager.deactivate(imageCapture)
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCases
+        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
         assertThat(enabledUseCases).isEmpty()
     }
 
@@ -235,7 +239,7 @@
             ComboRequestListener()
         ),
         cameraStateAdapter = CameraStateAdapter(),
-        displayInfoManager = DisplayInfoManager(ApplicationProvider.getApplicationContext())
+        displayInfoManager = DisplayInfoManager(ApplicationProvider.getApplicationContext()),
     ).also {
         useCaseManagerList.add(it)
     }
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt
index d550bdb..d318cbe 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt
@@ -32,6 +32,7 @@
 import androidx.camera.core.impl.CaptureConfig
 import androidx.camera.core.impl.Config
 import androidx.camera.core.impl.SessionConfig
+import androidx.lifecycle.MutableLiveData
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Job
@@ -50,7 +51,7 @@
 }
 
 class FakeUseCaseCameraComponent(useCases: List<UseCase>) : UseCaseCameraComponent {
-    private val fakeUseCaseCamera = FakeUseCaseCamera(useCases.toSet())
+    private val fakeUseCaseCamera = FakeUseCaseCamera(MutableLiveData(useCases.toSet()))
 
     override fun getUseCaseCamera(): UseCaseCamera {
         return fakeUseCaseCamera
@@ -128,7 +129,8 @@
 
 // TODO: Further implement the methods in this class as needed
 class FakeUseCaseCamera(
-    override var runningUseCases: Set<UseCase> = emptySet(),
+    override val runningUseCasesLiveData: MutableLiveData<Set<UseCase>> =
+        MutableLiveData(emptySet()),
     override var requestControl: UseCaseCameraRequestControl = FakeUseCaseCameraRequestControl(),
 ) : UseCaseCamera {
 
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2OutputConfigImplBuilder.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2OutputConfigImplBuilder.java
index a66d3ce..1aaeffd4d0 100644
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2OutputConfigImplBuilder.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/advanced/Camera2OutputConfigImplBuilder.java
@@ -33,6 +33,7 @@
     static AtomicInteger sLastId = new AtomicInteger(0);
     private OutputConfigImplImpl mOutputConfig;
     private int mSurfaceGroupId = OutputConfiguration.SURFACE_GROUP_ID_NONE;
+    private int mOutputConfigId = -1;
     private String mPhysicalCameraId;
     private List<Camera2OutputConfigImpl> mSurfaceSharingConfigs;
 
@@ -101,10 +102,23 @@
     }
 
     /**
+     * Sets Output Config id (Optional: Atomic Integer will be used if this function is ot called)
+     */
+    public Camera2OutputConfigImplBuilder setOutputConfigId(int outputConfigId) {
+        mOutputConfigId = outputConfigId;
+        return this;
+    }
+
+    /**
      * Build a {@link Camera2OutputConfigImpl} instance.
      */
     public Camera2OutputConfigImpl build() {
-        mOutputConfig.setId(getNextId());
+        // Use the Atomic Integer if setOutputConfigId is never called
+        if (mOutputConfigId == -1) {
+            mOutputConfig.setId(getNextId());
+        } else {
+            mOutputConfig.setId(mOutputConfigId);
+        }
         mOutputConfig.setPhysicalCameraId(mPhysicalCameraId);
         mOutputConfig.setSurfaceGroup(mSurfaceGroupId);
         mOutputConfig.setSurfaceSharingConfigs(mSurfaceSharingConfigs);
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt
index bccd2e9..d4b062c 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.kt
@@ -21,7 +21,6 @@
 import android.graphics.drawable.ColorDrawable
 import android.os.Build
 import android.util.Size
-import android.view.Display
 import android.view.LayoutInflater
 import android.view.MotionEvent
 import android.view.Surface
@@ -140,8 +139,7 @@
         val fakeController: CameraController = object : CameraController(context) {
             override fun attachPreviewSurface(
                 surfaceProvider: Preview.SurfaceProvider,
-                viewPort: ViewPort,
-                display: Display
+                viewPort: ViewPort
             ) {
                 if (viewPort.scaleType == ViewPort.FIT) {
                     fitTypeSemaphore.release()
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt
index bec354d..5f5ee52 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt
@@ -433,6 +433,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun canRecordToFile_whenPauseAndResumeInTheMiddle() {
         val pauseTimes = 1
         val resumeTimes = 1
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
index d4cca7a..c1443d2 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
@@ -28,7 +28,6 @@
 import android.hardware.camera2.CaptureResult;
 import android.os.Build;
 import android.util.Size;
-import android.view.Display;
 
 import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
@@ -160,18 +159,6 @@
     public static final int COORDINATE_SYSTEM_VIEW_REFERENCED = 1;
 
     /**
-     * States for tap-to-focus feature.
-     *
-     * @hide
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef(value = {TAP_TO_FOCUS_NOT_STARTED, TAP_TO_FOCUS_STARTED, TAP_TO_FOCUS_FOCUSED,
-            TAP_TO_FOCUS_NOT_FOCUSED, TAP_TO_FOCUS_FAILED})
-    public @interface TapToFocusStates {
-    }
-
-    /**
      * No tap-to-focus action has been started by the end user.
      */
     public static final int TAP_TO_FOCUS_NOT_STARTED = 0;
@@ -304,11 +291,6 @@
     @Nullable
     Preview.SurfaceProvider mSurfaceProvider;
 
-    // Synthetic access
-    @SuppressWarnings("WeakerAccess")
-    @Nullable
-    Display mPreviewDisplay;
-
     private final RotationProvider mRotationProvider;
 
     @VisibleForTesting
@@ -375,7 +357,7 @@
     /**
      * Gets the application context and preserves the attribution tag.
      *
-     * TODO(b/185272953): instrument test getting attribution tag once the view artifact depends
+     * <p> TODO(b/185272953): instrument test getting attribution tag once the view artifact depends
      * on a core version that has the fix.
      */
     private static Context getApplicationContext(@NonNull Context context) {
@@ -431,7 +413,7 @@
     }
 
     private boolean isPreviewViewAttached() {
-        return mSurfaceProvider != null && mViewPort != null && mPreviewDisplay != null;
+        return mSurfaceProvider != null && mViewPort != null;
     }
 
     private boolean isCameraAttached() {
@@ -539,14 +521,13 @@
     @SuppressLint({"MissingPermission", "WrongConstant"})
     @MainThread
     void attachPreviewSurface(@NonNull Preview.SurfaceProvider surfaceProvider,
-            @NonNull ViewPort viewPort, @NonNull Display display) {
+            @NonNull ViewPort viewPort) {
         checkMainThread();
         if (mSurfaceProvider != surfaceProvider) {
             mSurfaceProvider = surfaceProvider;
             mPreview.setSurfaceProvider(surfaceProvider);
         }
         mViewPort = viewPort;
-        mPreviewDisplay = display;
         startListeningToRotationEvents();
         startCameraAndTrackStates();
     }
@@ -565,7 +546,6 @@
         mCamera = null;
         mSurfaceProvider = null;
         mViewPort = null;
-        mPreviewDisplay = null;
         stopListeningToRotationEvents();
     }
 
@@ -1827,7 +1807,7 @@
     /**
      * Sets current zoom by a linear zoom value ranging from 0f to 1.0f.
      *
-     * LinearZoom 0f represents the minimum zoom while linearZoom 1.0f represents the maximum
+     * <p> LinearZoom 0f represents the minimum zoom while linearZoom 1.0f represents the maximum
      * zoom. The advantage of linearZoom is that it ensures the field of view (FOV) varies
      * linearly with the linearZoom value, for use with slider UI elements (while
      * {@link #setZoomRatio(float)} works well for pinch-zoom gestures).
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index 1f3921e..65c952a 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -106,7 +106,7 @@
  * {@link View} visible, or initially hiding the {@link View} by setting its
  * {@linkplain View#setAlpha(float) opacity} to 0, then setting it to 1.0F to show it.
  *
- * There are some limitations of transition animations to {@link SurfaceView} and
+ * <p> There are some limitations of transition animations to {@link SurfaceView} and
  * {@link TextureView}, which applies to {@link PreviewView} as well.
  *
  * @see <a href="https://developer.android.com/training/transitions#Limitations">Limitations</a>
@@ -1018,12 +1018,10 @@
     @MainThread
     private void attachToControllerIfReady(boolean shouldFailSilently) {
         checkMainThread();
-        Display display = getDisplay();
         ViewPort viewPort = getViewPort();
-        if (mCameraController != null && viewPort != null && isAttachedToWindow()
-                && display != null) {
+        if (mCameraController != null && viewPort != null && isAttachedToWindow()) {
             try {
-                mCameraController.attachPreviewSurface(getSurfaceProvider(), viewPort, display);
+                mCameraController.attachPreviewSurface(getSurfaceProvider(), viewPort);
             } catch (IllegalStateException ex) {
                 if (shouldFailSilently) {
                     // Swallow the exception and fail silently if the method is invoked by View
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
index b05e764..1383c18 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyRequestProcessor.java
@@ -172,6 +172,7 @@
         listener.onGetProperties(values, errors);
     }
 
+    @SuppressWarnings("deprecation")
     public void fetchCarPropertyProfiles(List<Integer> propertyIds,
             @NonNull OnGetCarPropertyProfilesListener listener) {
         ImmutableList.Builder<CarInternalError> errors = new ImmutableList.Builder<>();
diff --git a/car/app/app-automotive/src/main/res/values-b+sr+Latn/strings.xml b/car/app/app-automotive/src/main/res/values-b+sr+Latn/strings.xml
index 5afd4f1..55021b4 100644
--- a/car/app/app-automotive/src/main/res/values-b+sr+Latn/strings.xml
+++ b/car/app/app-automotive/src/main/res/values-b+sr+Latn/strings.xml
@@ -17,15 +17,15 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="error_action_finish" msgid="7621130025103996211">"Затвори апликацију"</string>
-    <string name="error_action_update_host" msgid="4802951804749609593">"Потражи ажурирања"</string>
-    <string name="error_action_retry" msgid="985347670495166517">"Пробај поново"</string>
-    <string name="error_message_client_side_error" msgid="3323186720368387787">"Грешка апликације. Пријавите ову грешку програмеру апликације"</string>
-    <string name="error_message_host_error" msgid="5484419926049675696">"Системска грешка"</string>
-    <string name="error_message_host_connection_lost" msgid="5723205987837759151">"Систем је привремено недоступан"</string>
-    <string name="error_message_host_not_found" msgid="3241065067065670113">"Систем захтева ажурирање"</string>
-    <string name="error_message_host_incompatible" msgid="160406216155183851">"Систем захтева ажурирање"</string>
-    <string name="error_message_multiple_hosts" msgid="2591031904206928207">"Некомпатибилан систем"</string>
-    <string name="error_message_unknown_error" msgid="1918523834689044166">"Непозната грешка"</string>
-    <string name="error_message_no_vending" msgid="5866202078252905802">"Обратите се корисничкој подршци за аутомобил"</string>
+    <string name="error_action_finish" msgid="7621130025103996211">"Zatvori aplikaciju"</string>
+    <string name="error_action_update_host" msgid="4802951804749609593">"Potraži ažuriranja"</string>
+    <string name="error_action_retry" msgid="985347670495166517">"Probaj ponovo"</string>
+    <string name="error_message_client_side_error" msgid="3323186720368387787">"Greška aplikacije. Prijavite ovu grešku programeru aplikacije"</string>
+    <string name="error_message_host_error" msgid="5484419926049675696">"Sistemska greška"</string>
+    <string name="error_message_host_connection_lost" msgid="5723205987837759151">"Sistem je privremeno nedostupan"</string>
+    <string name="error_message_host_not_found" msgid="3241065067065670113">"Sistem zahteva ažuriranje"</string>
+    <string name="error_message_host_incompatible" msgid="160406216155183851">"Sistem zahteva ažuriranje"</string>
+    <string name="error_message_multiple_hosts" msgid="2591031904206928207">"Nekompatibilan sistem"</string>
+    <string name="error_message_unknown_error" msgid="1918523834689044166">"Nepoznata greška"</string>
+    <string name="error_message_no_vending" msgid="5866202078252905802">"Obratite se korisničkoj podršci za automobil"</string>
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
index 5a98478..9a6f362 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
@@ -17,336 +17,336 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="back_caps_action_title" msgid="6392829425035919422">"НАЗАД"</string>
-    <string name="home_caps_action_title" msgid="4853167242566949502">"КУЋА"</string>
-    <string name="exit_action_title" msgid="9086586388884500731">"Изађи"</string>
-    <string name="refresh_action_title" msgid="3674260822403151377">"Освежи"</string>
-    <string name="close_action_title" msgid="2661907510124308560">"Затвори"</string>
-    <string name="grant_access_action_title" msgid="4033140828804350723">"Одобри приступ"</string>
-    <string name="enable_location_action_title" msgid="8181862247222797044">"Омогући локацију"</string>
-    <string name="cancel_action_title" msgid="1149738685397349236">"Откажи"</string>
-    <string name="stop_action_title" msgid="1187619482795416314">"Заустави"</string>
-    <string name="more_action_title" msgid="1039516575011403837">"Још"</string>
-    <string name="call_action_title" msgid="6218977436905001611">"Позови"</string>
-    <string name="primary_action_title" msgid="7042003552215710683">"Примарно"</string>
-    <string name="options_action_title" msgid="1168121856107932984">"Опције"</string>
-    <string name="search_action_title" msgid="3483459674263446335">"Претражи"</string>
-    <string name="checked_action_title" msgid="906023941445896399">"Означено"</string>
-    <string name="unchecked_action_title" msgid="802503415474307811">"Ознака је уклоњена"</string>
-    <string name="on_action_title" msgid="4129601573763429611">"Укључено"</string>
-    <string name="off_action_title" msgid="8669201170189204848">"Искључено"</string>
-    <string name="settings_action_title" msgid="8616900063253887861">"Подешавања"</string>
-    <string name="accept_action_title" msgid="4899660585470647578">"Прихватам"</string>
-    <string name="reject_action_title" msgid="6730366705938402668">"Одбиј"</string>
-    <string name="ok_action_title" msgid="7128494973966098611">"Потврди"</string>
-    <string name="throw_action_title" msgid="7163710562670220163">"Баци"</string>
-    <string name="commute_action_title" msgid="2585755255290185096">"Редовно путовање"</string>
-    <string name="sign_out_action_title" msgid="1653943000866713010">"Одјавите се"</string>
-    <string name="try_anyway_action_title" msgid="7384500054249311718">"Ипак покушај"</string>
-    <string name="yes_action_title" msgid="5507096013762092189">"Да"</string>
-    <string name="no_action_title" msgid="1452124604210014010">"Не"</string>
-    <string name="disable_all_rows" msgid="3003225080532928046">"Онемогући све редове"</string>
-    <string name="enable_all_rows" msgid="7274285275711872091">"Омогући све редове"</string>
-    <string name="bug_reported_toast_msg" msgid="2487119172744644317">"Пријављена је грешка!"</string>
-    <string name="zoomed_in_toast_msg" msgid="8915301497303842649">"Увећано је"</string>
-    <string name="zoomed_out_toast_msg" msgid="6260981223227212493">"Умањено је"</string>
-    <string name="triggered_toast_msg" msgid="3396166539208366382">"Покренуто је"</string>
-    <string name="primary_toast_msg" msgid="7153771322662005447">"Притиснуто је примарно дугме"</string>
-    <string name="search_toast_msg" msgid="7826530065407699347">"Притиснуто је дугме за претрагу"</string>
-    <string name="options_toast_msg" msgid="2146223786877557730">"Дугме Опције је притиснуто"</string>
-    <string name="favorite_toast_msg" msgid="522064494016370117">"Омиљено!"</string>
-    <string name="not_favorite_toast_msg" msgid="6831181108681007428">"Није омиљено!"</string>
-    <string name="nav_requested_toast_msg" msgid="6696525973145493908">"Навигација је захтевана"</string>
-    <string name="selected_route_toast_msg" msgid="3149189677200086656">"Изабрана рута"</string>
-    <string name="visible_routes_toast_msg" msgid="7065558153736024203">"Видљиве руте"</string>
-    <string name="second_item_toast_msg" msgid="7210054709419608215">"Кликнуто је на другу ставку"</string>
-    <string name="third_item_checked_toast_msg" msgid="3022450599567347361">"Трећа ставка је означена"</string>
-    <string name="fifth_item_checked_toast_msg" msgid="1627599668504718594">"Пета ставка је означена"</string>
-    <string name="sixth_item_toast_msg" msgid="6117028866385793707">"Кликнуто је на шесту ставку"</string>
-    <string name="settings_toast_msg" msgid="7697794473002342727">"Подешавања на која је кликнуто"</string>
-    <string name="parked_toast_msg" msgid="2532422265890824446">"Радња паркирања"</string>
-    <string name="more_toast_msg" msgid="5938288138225509885">"Кликнуто је на Још"</string>
-    <string name="commute_toast_msg" msgid="4112684360647638688">"Дугме Редовно путовање је притиснуто"</string>
-    <string name="grant_location_permission_toast_msg" msgid="268046297444808010">"Одобрите дозволу за локацију да бисте видели актуелну локацију"</string>
-    <string name="sign_in_with_google_toast_msg" msgid="5720947549233124775">"Пријављивање помоћу Google-а почиње овде"</string>
-    <string name="changes_selection_to_index_toast_msg_prefix" msgid="957766225794389167">"Избор је промењен у индекс"</string>
-    <string name="yes_action_toast_msg" msgid="6216215197177241247">"Притиснуто је дугме Да."</string>
-    <string name="no_action_toast_msg" msgid="6165492423831023809">"Притиснуто је дугме Не."</string>
-    <string name="alert_timeout_toast_msg" msgid="5568380708832805374">"Обавештење је истекло."</string>
-    <string name="first_row_title" msgid="219428344573165351">"Ред са великом сликом и дугим текстом дугим текстом дугим текстом дугим текстом дугим текстом"</string>
-    <string name="first_row_text" msgid="3887390298628338716">"Текст текст текст"</string>
-    <string name="other_row_title_prefix" msgid="4702355788835253197">"Наслов реда"</string>
-    <string name="other_row_text" msgid="7510279447493169945">"Текст у реду"</string>
-    <string name="navigate" msgid="2713090390373996139">"Навигација"</string>
-    <string name="dial" msgid="3145707439707628311">"Позови"</string>
-    <string name="address" msgid="9010635942573581302">"Адреса"</string>
-    <string name="phone" msgid="2504766809811627577">"Телефон"</string>
-    <string name="fail_start_nav" msgid="6921321606009212189">"Грешка при покретању навигације"</string>
-    <string name="fail_start_dialer" msgid="1471602619507306261">"Грешка при покретању телефона"</string>
-    <string name="car_hardware_demo_title" msgid="3679106197233262689">"Демонстрација за хардвер аутомобила"</string>
-    <string name="car_hardware_info" msgid="1244783247616395012">"Информације о хардверу аутомобила"</string>
-    <string name="model_info" msgid="494224423025683030">"Информације о моделу"</string>
-    <string name="no_model_permission" msgid="5333629877014978947">"Нема дозволе за модел."</string>
-    <string name="manufacturer_unavailable" msgid="4978995415869838056">"Произвођач је недоступан"</string>
-    <string name="model_unavailable" msgid="4075463010215406573">"Модел је недоступан"</string>
-    <string name="year_unavailable" msgid="994338773299644607">"Година је недоступна"</string>
-    <string name="energy_profile" msgid="81415433590192158">"Енергетски профил"</string>
-    <string name="no_energy_profile_permission" msgid="4662285713731308888">"Нема дозволе за енергетски профил"</string>
-    <string name="fuel_types" msgid="6811375173343218212">"Врсте горива"</string>
-    <string name="unavailable" msgid="3636401138255192934">"Недоступно"</string>
-    <string name="ev_connector_types" msgid="735458637011996125">"Типови конектора за електрична возила"</string>
-    <string name="example_title" msgid="530257630320010494">"Пример %d"</string>
-    <string name="example_1_text" msgid="8456567953748293512">"Овај текст има црвену боју"</string>
-    <string name="example_2_text" msgid="718820705318661440">"Овај текст има зелену боју"</string>
-    <string name="example_3_text" msgid="977269832109695627">"Овај текст има плаву боју"</string>
-    <string name="example_4_text" msgid="2043547015979437373">"Овај текст има жуту боју"</string>
-    <string name="example_5_text" msgid="8828804968749423500">"Овај текст користи примарну боју"</string>
-    <string name="example_6_text" msgid="7991523168517599600">"Овај текст користи секундарну боју"</string>
-    <string name="color_demo" msgid="1822427636476178993">"Демонстрација за боју"</string>
-    <string name="list_limit" msgid="3023536401535417286">"Ограничење листе"</string>
-    <string name="grid_limit" msgid="1350116012893549206">"Ограничење мреже"</string>
-    <string name="pane_limit" msgid="981518409516855230">"Ограничење окна"</string>
-    <string name="place_list_limit" msgid="6785181191763056582">"Ограничење листе места"</string>
-    <string name="route_list_limit" msgid="505793441615134116">"Ограничење листе рута"</string>
-    <string name="content_limits" msgid="5726880972110281095">"Ограничења садржаја"</string>
-    <string name="content_limits_demo_title" msgid="3207211638386727610">"Демонстрација ограничења садржаја"</string>
-    <string name="finish_app_msg" msgid="8354334557053141891">"Тиме ће се апликација завршити, а када је вратите, предучитаће екран са дозволама"</string>
-    <string name="finish_app_title" msgid="9013328479438745074">"Демонстрација завршетка апликације"</string>
-    <string name="finish_app_demo_title" msgid="8223819062053448384">"Демонстрација предучитавања екрана са дозволама при следећем покретању"</string>
-    <string name="preseed_permission_app_title" msgid="182847662545676962">"Демонстрација предучитавања дозвола за апликацију"</string>
-    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Демонстрација предучитавања екрана са дозволама при следећем покретању"</string>
-    <string name="loading_demo_title" msgid="1086529475809143517">"Учитава се демонстрација"</string>
-    <string name="loading_demo_row_title" msgid="8933049915126088142">"Учитавање је довршено!"</string>
-    <string name="pop_to_root" msgid="2078277386355064198">"Пређи на основни ниво"</string>
-    <string name="pop_to_marker" msgid="5007078308762725207">"Маркер демонстрације преласка на разно"</string>
-    <string name="push_stack" msgid="2433062141810168976">"Гурни даље у стек"</string>
-    <string name="pop_to_prefix" msgid="4288884615669751608">"Пређи на"</string>
-    <string name="pop_to_title" msgid="3924696281273379455">"Демонстрација преласка"</string>
-    <string name="package_not_found_error_msg" msgid="7525619456883627939">"Пакет није пронађен."</string>
-    <string name="permissions_granted_msg" msgid="2348556088141992714">"Све дозволе су одобрене. Опозовите дозволе у Подешавањима."</string>
-    <string name="needs_access_msg_prefix" msgid="2204136858798832382">"Апликација треба приступ следећим дозволама:\n"</string>
-    <string name="phone_screen_permission_msg" msgid="3599815596923367256">"Доделите дозволу на екрану телефона"</string>
-    <string name="enable_location_permission_on_device_msg" msgid="472752487966156897">"Омогући дозволе за локацију на уређају"</string>
-    <string name="enable_location_permission_on_phone_msg" msgid="5082615523959139121">"Омогући локацију на екрану телефона"</string>
-    <string name="required_permissions_title" msgid="5351791879153568211">"Обавезне дозволе"</string>
-    <string name="request_permissions_title" msgid="7456426341142412300">"Демонстрација захтева за дозволу"</string>
-    <string name="cancel_reservation_title" msgid="1374986823057959608">"Екран за отказивање резервације"</string>
-    <string name="reservation_cancelled_msg" msgid="6334213670275547875">"Резервација је отказана"</string>
-    <string name="result_demo_title" msgid="3900525190662148290">"Демонстрација резултата"</string>
-    <string name="not_started_for_result_msg" msgid="7498800528148447270">"Ова апликација није покренута ради резултата"</string>
-    <string name="started_for_result_msg" msgid="4225260243713833974">"Ова апликација је позвана за резултат из: %s. Изаберите резултат који ћете послати позиваоцу"</string>
-    <string name="arrived_exclamation_msg" msgid="9132265698563096988">"Дошао је!"</string>
-    <string name="travel_est_trip_text" msgid="5134365408383171144">"Покупи Ану"</string>
-    <string name="send_notification_title" msgid="4731688444696028193">"Пошаљи обавештење"</string>
-    <string name="start_notifications_title" msgid="8699668027543530460">"Покрени обавештења"</string>
-    <string name="stop_notifications_title" msgid="3703892710275206239">"Заустави приказивање обавештења"</string>
-    <string name="notification_title" msgid="5507590705935298176">"Обавештење"</string>
-    <string name="importance_title" msgid="9034862997821839831">"Важност"</string>
-    <string name="category_title" msgid="4783851267093259949">"Категорија"</string>
-    <string name="ongoing_title" msgid="4957996003270280496">"Активно"</string>
-    <string name="default_importance" msgid="6347996298832939989">"Подразумевана"</string>
-    <string name="high_importance" msgid="5009120714837304882">"Висока"</string>
-    <string name="low_importance" msgid="4721161314404294033">"Ниска"</string>
-    <string name="unknown_importance" msgid="909001735933359216">"Непознато"</string>
-    <string name="notification_demo" msgid="1819496937832036387">"Демонстрација обавештења"</string>
-    <string name="misc_demo_title" msgid="7399959062407349380">"Различите демонстрације"</string>
-    <string name="navigating_demo_title" msgid="7454579665387386476">"Демонстрација навигације"</string>
-    <string name="arrived_demo_title" msgid="6708013121387053838">"Демонстрација доласка"</string>
-    <string name="junction_image_demo_title" msgid="3302979708776502314">"Демонстрација слике раскрснице"</string>
-    <string name="nav_template_demos_title" msgid="8215835368932160866">"Демонстрације шаблона навигације"</string>
-    <string name="map_template_pane_demo_title" msgid="4849450903277412004">"Демонстрација шаблона мапе са окном"</string>
-    <string name="map_template_list_demo_title" msgid="1473810899303903185">"Демонстрација шаблона мапе са листом"</string>
-    <string name="start_notification_title" msgid="2208831088632818681">"Покрени обавештење"</string>
-    <string name="stop_notification_title" msgid="3709643750540881176">"Заустави приказивање обавештења"</string>
-    <string name="nav_notification_demo_title" msgid="4448683262984308442">"Демонстрација обавештења навигације"</string>
-    <string name="go_straight" msgid="2301747728609198718">"Иди право"</string>
-    <string name="turn_right" msgid="4710562732720109969">"Скрените десно"</string>
-    <string name="take_520" msgid="3804796387195842741">"Крените путем 520"</string>
-    <string name="gas_station" msgid="1203313937444666161">"Бензинска пумпа"</string>
-    <string name="short_route" msgid="4831864276538141265">"Кратка рута"</string>
-    <string name="less_busy" msgid="310625272281710983">"Мање прометно"</string>
-    <string name="hov_friendly" msgid="6956152104754594971">"Прилагођено возилима са више путника"</string>
-    <string name="long_route" msgid="4737969235741057506">"Дуга путања"</string>
-    <string name="continue_start_nav" msgid="6231797535084469163">"Настави са покретањем навигације"</string>
-    <string name="continue_route" msgid="5172258139245088080">"Настави на путању"</string>
-    <string name="routes_title" msgid="7799772149932075357">"Руте"</string>
-    <string name="place_list_nav_template_demo_title" msgid="8019588508812955290">"Демонстрација шаблона навигације листом места"</string>
-    <string name="route_preview_template_demo_title" msgid="7878704357953167555">"Демонстрација шаблона прегледа руте"</string>
-    <string name="notification_template_demo_title" msgid="5076051497316030274">"Демонстрација шаблона обавештења"</string>
-    <string name="nav_map_template_demo_title" msgid="344985380763975398">"Демонстрација шаблона навигације само са мапом"</string>
-    <string name="nav_demos_title" msgid="72781206086461004">"Демонстрације навигације"</string>
-    <string name="navigation_alert_title" msgid="8306554249264200848">"Да ли се и даље мери брзина?"</string>
-    <string name="navigation_alert_subtitle" msgid="3331130131492672264">"Пријављено пре 10 мин"</string>
-    <string name="no_toll_card_permission" msgid="6789073114449712090">"Нема дозволе за картицу за путарину."</string>
-    <string name="no_energy_level_permission" msgid="1684773185095107825">"Нема дозволе за ниво енергије."</string>
-    <string name="no_speed_permission" msgid="5812532480922675390">"Нема дозволе за брзину."</string>
-    <string name="no_mileage_permission" msgid="4074779840599589847">"Нема дозволе за километражу."</string>
-    <string name="no_ev_status_permission" msgid="933075402821938973">"Нема дозволе за статус електричног возила."</string>
-    <string name="no_accelerometer_permission" msgid="896914448469117234">"Нема дозволе за акцелерометар."</string>
-    <string name="no_gyroscope_permission" msgid="665293140266771569">"Нема дозволе за жироскоп."</string>
-    <string name="no_compass_permission" msgid="5162304489577567125">"Нема дозволе за компас."</string>
-    <string name="no_car_hardware_location" msgid="3505517472938045093">"Нема дозволе за локацију хардвера аутомобила."</string>
-    <string name="fetch_toll_info" msgid="6864627977128179834">"Преузимају се информације о путарини."</string>
-    <string name="fetch_energy_level" msgid="1773415471137542832">"Преузима се ниво енергије."</string>
-    <string name="fetch_speed" msgid="7333830984597189627">"Преузима се брзина."</string>
-    <string name="fetch_mileage" msgid="7490131687788025123">"Преузима се километража."</string>
-    <string name="fetch_ev_status" msgid="2798910410830567052">"Преузима се статус електричног возила."</string>
-    <string name="fetch_accelerometer" msgid="697750041126810911">"Преузима се акцелерометар."</string>
-    <string name="fetch_gyroscope" msgid="7153155318827188539">"Преузима се жироскоп."</string>
-    <string name="fetch_compass" msgid="7316188117590056717">"Преузима се компас."</string>
-    <string name="fetch_location" msgid="5015066922035852615">"Преузима се локација."</string>
-    <string name="toll_card_state" msgid="4430544885695162226">"Статус картице за путарину"</string>
-    <string name="low_energy" msgid="3462774027012877028">"Ниска енергија"</string>
-    <string name="range" msgid="8744960568263400641">"Опсег"</string>
-    <string name="fuel" msgid="4253578650127250651">"Гориво"</string>
-    <string name="battery" msgid="2183623637331546820">"Батерија"</string>
-    <string name="display_speed" msgid="9161318805331348165">"Прикажи брзину"</string>
-    <string name="raw_speed" msgid="7295910214088983967">"Основна брзина"</string>
-    <string name="unit" msgid="7697521583928135171">"Јединица"</string>
-    <string name="odometer" msgid="3925174645651546591">"Одометар"</string>
-    <string name="ev_connected" msgid="2277845607662494696">"Порт за пуњење електричног возила је повезан"</string>
-    <string name="ev_open" msgid="4916704450914519643">"Порт за пуњење електричног возила је отворен"</string>
-    <string name="accelerometer" msgid="2084026313768299185">"Акцелерометар"</string>
-    <string name="gyroscope" msgid="3428075828014504651">"Жироскоп"</string>
-    <string name="compass" msgid="7037367764762441245">"Компас"</string>
-    <string name="car_hardware_location" msgid="5826128477363068617">"Локација хардвера аутомобила"</string>
-    <string name="non_actionable" msgid="8999757911111188784">"Не може да се изврши"</string>
-    <string name="second_item" msgid="5245792503030812493">"Друга ставка"</string>
-    <string name="third_item" msgid="334088179008716411">"Трећа ставка"</string>
-    <string name="fourth_item" msgid="1153409687260543158">"Четврта ставка"</string>
-    <string name="fifth_item" msgid="295284272719956932">"Пета ставка има подешен дугачак наслов"</string>
-    <string name="sixth_item" msgid="3880321601391343607">"Шеста ставка има подешен дугачак наслов"</string>
-    <string name="grid_template_demo_title" msgid="6159115661928982245">"Демонстрација шаблона мреже"</string>
-    <string name="parked_only_title" msgid="3190603222397552672">"Наслов Само за паркиране"</string>
-    <string name="parked_only_text" msgid="8720610556452272916">"Још текста за Само за паркиране."</string>
-    <string name="clicked_row_prefix" msgid="9068303427922069941">"Ред на који је кликнуто"</string>
-    <string name="first_line_text" msgid="6648055806656590336">"Први ред текста"</string>
-    <string name="second_line_text" msgid="38664490158836864">"Други ред текста"</string>
-    <string name="long_line_text" msgid="8082962600953333087">"Овај подтекст може у потпуности да се приказује у неограниченом режиму (нпр. режим паркинга, режим ограничене мале брзине). Али то ће се скратити на само два реда у ограниченом режиму (нпр. режим вожње). У сврхе тестирања овај подтекст је пре пре пре пре пре предугачак"</string>
-    <string name="title_prefix" msgid="3991742709199357049">"Наслов"</string>
-    <string name="list_template_demo_title" msgid="1740208242737246151">"Демонстрација шаблона листе"</string>
-    <string name="long_msg_template_demo_title" msgid="1793748562161438131">"Демонстрација шаблона дуге поруке"</string>
-    <string name="long_msg_template_not_supported_text" msgid="3641559637317672505">"Хост не подржава шаблон дуге поруке"</string>
-    <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Некомпатибилан хост"</string>
-    <string name="msg_template_demo_title" msgid="3895210951340409473">"Демонстрација шаблона поруке"</string>
-    <string name="msg_template_demo_text" msgid="2275291617716161409">"Овде иде порука.\nВише текста у другом реду."</string>
-    <string name="short_msg_template_demo_title" msgid="6798738013668580714">"Демонстрација шаблона кратке поруке"</string>
-    <string name="pane_template_demo_title" msgid="7804292600060341608">"Демонстрација шаблона окна"</string>
-    <string name="place_list_template_demo_title" msgid="2054022985455460469">"Демонстрација шаблона листе места"</string>
-    <string name="browse_places_title" msgid="7246005909846715898">"Прегледајте места"</string>
-    <string name="search_template_demo_title" msgid="1770474418958318114">"Демонстрација шаблона претраге"</string>
-    <string name="search_hint" msgid="978495498991026792">"Претражујте овде"</string>
-    <string name="additional_text" msgid="8410289578276941586">"Прегледајте услове коришћења услуге"</string>
-    <string name="google_sign_in" msgid="6556259799319701727">"Пријављивање на Google"</string>
-    <string name="use_pin" msgid="7850893299484337431">"Користите PIN"</string>
-    <string name="qr_code" msgid="5487041647280777397">"QR кôд"</string>
-    <string name="sign_in_template_not_supported_text" msgid="7184733753948837646">"Хост не подржава шаблон за пријављивање"</string>
-    <string name="sign_in_template_not_supported_title" msgid="4892883228898541764">"Некомпатибилан хост"</string>
-    <string name="email_hint" msgid="7205549445477319606">"Имејл"</string>
-    <string name="sign_in_title" msgid="4551967308262681703">"Пријавите се"</string>
-    <string name="sign_in_instructions" msgid="9044850228284294762">"Унесите акредитиве"</string>
-    <string name="invalid_email_error_msg" msgid="5261362663718987167">"Корисничко име мора да буде важећа имејл адреса"</string>
-    <string name="invalid_length_error_msg" msgid="8238905276326976425">"Најмањи број знакова у корисничком имену је %s"</string>
-    <string name="invalid_password_error_msg" msgid="1090359893902674610">"Неважећа лозинка"</string>
-    <string name="password_hint" msgid="2869107073860012864">"лозинка"</string>
-    <string name="password_sign_in_instruction_prefix" msgid="9105788349198243508">"Корисничко име"</string>
-    <string name="pin_sign_in_instruction" msgid="2288691296234360441">"Унесите овај PIN на телефону"</string>
-    <string name="qr_code_sign_in_title" msgid="8137070561006464518">"Скенирајте QR кôд да бисте се пријавили"</string>
-    <string name="sign_in_with_google_title" msgid="8043752000786977249">"Пријавите се помоћу Google-а"</string>
-    <string name="provider_sign_in_instruction" msgid="7586815688292506743">"Користите ово дугме да бисте довршили пријављивање преко Google-а"</string>
-    <string name="sign_in_complete_text" msgid="8423984266325680606">"Пријављени сте!"</string>
-    <string name="sign_in_complete_title" msgid="8919868148773983428">"Пријављивање је завршено"</string>
-    <string name="sign_in_template_demo_title" msgid="6052035424941410249">"Демонстрација шаблона пријављивања"</string>
-    <string name="images_unknown_host_error" msgid="3180661817432720076">"Слике не могу да се приказују за непознат хост"</string>
-    <string name="icon_title_prefix" msgid="8487026131229541244">"Икона"</string>
-    <string name="content_provider_icons_demo_title" msgid="5708602618664311097">"Демонстрација икона добављача садржаја"</string>
-    <string name="icons_demo_title" msgid="4082976685262307357">"Демонстрација за иконе"</string>
-    <string name="app_icon_title" msgid="7534936683349723423">"Икона апликације"</string>
-    <string name="vector_no_tint_title" msgid="874591632279039146">"Вектор који може да се црта, без тоналитета"</string>
-    <string name="vector_with_tint_title" msgid="1022346419829696827">"Вектор који може да се црта, са тоналитетом"</string>
-    <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Вектор који може да се црта, са атрибутом теме апликације за његову боју"</string>
-    <string name="png_res_title" msgid="7437083018336747544">"PNG фајл, послат као ресурс"</string>
-    <string name="png_bitmap_title" msgid="3385912074130977032">"PNG фајл, послат као бит мапа"</string>
-    <string name="just_row_title" msgid="965700021568970725">"Само наслов"</string>
-    <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Наслов са иконом апликације"</string>
-    <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Наслов са сликом ИД-а ресурса"</string>
-    <string name="title_with_svg_image_row_title" msgid="6109092343637263755">"Наслов са SVG сликом"</string>
-    <string name="colored_secondary_row_title" msgid="5173288934252528929">"Секундарни текст у боји"</string>
-    <string name="title_with_secondary_lines_row_title" msgid="7769408881272549837">"Наслов са више линија секундарног текста"</string>
-    <string name="title_with_secondary_lines_row_text_1" msgid="8945114692653524102">"Грешка и грешка и поново грешка, али мање и мање и мање"</string>
-    <string name="title_with_secondary_lines_row_text_2" msgid="1017734603405251531">"– Пит Хејн"</string>
-    <string name="rows_demo_title" msgid="3198566660454251007">"Демонстрација редова"</string>
-    <string name="text_icons_demo_title" msgid="8732943920672143201">"Демонстрације текста и икона"</string>
-    <string name="row_text_icons_demo_title" msgid="135167694047524905">"Демонстрација редова са текстом и иконама"</string>
-    <string name="radio_button_list_demo_title" msgid="9082264324855338774">"Демонстрација листа са дугметом за избор"</string>
-    <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Демонстрација листа које могу да се изаберу"</string>
-    <string name="option_1_title" msgid="7221252541651471199">"1. опција"</string>
-    <string name="option_2_title" msgid="1905146448697963818">"2. опција"</string>
-    <string name="option_3_title" msgid="6319268250436119258">"3. опција"</string>
-    <string name="option_row_radio_title" msgid="5978617101267398181">"Ред са дугметом за избор"</string>
-    <string name="option_row_radio_icon_title" msgid="3304229002524317977">"Ред са дугметом за избор и иконом"</string>
-    <string name="option_row_radio_icon_colored_text_title" msgid="947641896184637026">"Ред са дугметом за избор и иконом и текстом у боји"</string>
-    <string name="some_additional_text" msgid="4009872495806318260">"Додатни текст"</string>
-    <string name="sample_additional_list" msgid="5085372891301576306">"Пример листе која може да се изабере"</string>
-    <string name="task_restriction_demo_title" msgid="2212084350718766941">"Демонстрација ограничења за задатке"</string>
-    <string name="task_limit_reached_msg" msgid="6038763366777119364">"Достигнуто је ограничење задатака\nАко наставите, апликација ће се принудно зауставити"</string>
-    <string name="task_step_of_title" msgid="2791717962535723839">"%1$d. корак задатка од %2$d"</string>
-    <string name="task_step_of_text" msgid="4646729781462227219">"Кликните да бисте ишли напред"</string>
-    <string name="task_content_allowed" msgid="545061986612431190">"Посетите различите шаблоне и уверите се да је аутомобил у режиму вожње"</string>
-    <string name="toggle_button_demo_title" msgid="3179103600967398928">"Демонстрација дугмета за укључивање/искључивање"</string>
-    <string name="toggle_test_title" msgid="924485265152862631">"Укључи/искључи тест"</string>
-    <string name="toggle_test_text" msgid="8107217216013312857">"Промене стања су дозвољене"</string>
-    <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Омогућите тест укључивања/искључивања"</string>
-    <string name="toggle_test_first_toggle_text" msgid="5914741538328669668">"Изаберите ово да бисте омогућили тест укључивања/искључивања"</string>
-    <string name="toggle_test_second_toggle_title" msgid="1083594617400613969">"Тест укључивања/искључивања"</string>
-    <string name="toggle_test_second_toggle_text" msgid="1813071017415876745">"Промене стања су дозвољене"</string>
-    <string name="image_test_title" msgid="8273863429801477547">"Тест слике"</string>
-    <string name="image_test_text" msgid="6264812093895530445">"Промене слика су дозвољене"</string>
-    <string name="additional_data_title" msgid="3546689652240300617">"Додатни подаци"</string>
-    <string name="additional_data_text" msgid="2846223398214158872">"Ажурирања су дозвољена за операције у позадини."</string>
-    <string name="toggle_test_enabled" msgid="982370904182034076">"Тест укључивања/искључивања је омогућен"</string>
-    <string name="toggle_test_disabled" msgid="8366040658408451664">"Тест укључивања/искључивања је онемогућен"</string>
-    <string name="secondary_actions_decoration_button_demo_title" msgid="3710817648501132309">"Демонстрација секундарне радње и декорације"</string>
-    <string name="secondary_actions_test_title" msgid="3664453747553733613">"Тест секундарне радње"</string>
-    <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Може да се изабере само секундарна радња"</string>
-    <string name="decoration_test_title" msgid="8450127046762442244">"Тест декорације"</string>
-    <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Секундарне радње и декорација"</string>
-    <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Може да се изабере и ред"</string>
-    <string name="secondary_action_toast" msgid="5076434693504006565">"Секундарна радња је изабрана"</string>
-    <string name="row_primary_action_toast" msgid="756516694751965204">"Примарна радња реда је изабрана"</string>
-    <string name="misc_templates_demos_title" msgid="6077169010255928114">"Демонстрације различитих шаблона"</string>
-    <string name="showcase_demos_title" msgid="1542092687878113304">"Демонстрације приказивања"</string>
-    <string name="template_layouts_demo_title" msgid="788249269446087847">"Демонстрације изгледа шаблона"</string>
-    <string name="grid_template_menu_demo_title" msgid="7096285873490705119">"Демонстрације шаблона мреже"</string>
-    <string name="voice_access_demo_title" msgid="3825223890895361496">"Екран демонстрације приступа гласу"</string>
-    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Корисничке интеракције"</string>
-    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Демонстрације захтева за дозволе"</string>
-    <string name="application_overflow_title" msgid="396427940886169325">"Валидатор прекорачења апликације"</string>
-    <string name="application_overflow_subtitle1" msgid="7429415605726615529">"Тестирајте следеће шаблоне током пуњења"</string>
-    <string name="application_overflow_subtitle2" msgid="4385123036846369714">"статус возила из паркираног у вожња"</string>
-    <string name="perm_group" msgid="3834918337351876270">"Група дозвола"</string>
-    <string name="perm_group_description" msgid="7348847631139139024">"Група дозвола за истицање апликације"</string>
-    <string name="perm_fine_location" msgid="5438874642600304118">"Приступ прецизној локацији"</string>
-    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Дозвола за приступ прецизној локацији"</string>
-    <string name="perm_coarse_location" msgid="6140337431619481015">"Приступ приближној локацији"</string>
-    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Дозвола за приступ приближној локацији"</string>
-    <string name="perm_record_audio" msgid="2758340693260523493">"Приступ снимању звука"</string>
-    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Дозвола за приступ снимању звука"</string>
-    <string name="location_1_description" msgid="4801052291684791371">"Вектор ресурса са тоналитетом"</string>
-    <string name="location_2_description" msgid="3331356135359047166">"Бит мапа ресурса слике"</string>
-    <string name="location_3_description" msgid="3982142774088944850">"Маркер текста у боји"</string>
-    <string name="location_4_description" msgid="6560365445044381911">"Бит мапа слике"</string>
-    <string name="location_description_text_label" msgid="2779911545316756419">"Ознака текста"</string>
-    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"Демонстрација са поређењем паркирања и вожње"</string>
-    <string name="latest_feature_details" msgid="6843008350392721502">"Групни прикази у аутомобилима."</string>
-    <string name="latest_feature_title" msgid="7929405790070777460">"Најновије функције"</string>
-    <string name="loading_toggle_enabled" msgid="8828072732804454994">"Учитавање је омогућено"</string>
-    <string name="loading_toggle_disabled" msgid="7689738885077382673">"Учитавање је онемогућено"</string>
-    <string name="loading_screen" msgid="4771507490730308794">"Екран учитавања"</string>
-    <string name="vector_toggle_details" msgid="1301305340033556819">"Дугме за додавање/уклањање боје"</string>
-    <string name="map_template_toggle_demo_title" msgid="6510798293640092611">"Демонстрација шаблона мапе са прекидачима"</string>
-    <string name="avoid_tolls_row_title" msgid="5194057244144831024">"Избегавај наплатне рампе"</string>
-    <string name="route_options_demo_title" msgid="4599699012716426514">"Опције за руте"</string>
-    <string name="avoid_highways_row_title" msgid="4711913426200490304">"Избегавај ауто-путеве"</string>
-    <string name="avoid_ferries_row_title" msgid="8232883866013711974">"Избегавај трајект"</string>
+    <string name="back_caps_action_title" msgid="6392829425035919422">"NAZAD"</string>
+    <string name="home_caps_action_title" msgid="4853167242566949502">"KUĆA"</string>
+    <string name="exit_action_title" msgid="9086586388884500731">"Izađi"</string>
+    <string name="refresh_action_title" msgid="3674260822403151377">"Osveži"</string>
+    <string name="close_action_title" msgid="2661907510124308560">"Zatvori"</string>
+    <string name="grant_access_action_title" msgid="4033140828804350723">"Odobri pristup"</string>
+    <string name="enable_location_action_title" msgid="8181862247222797044">"Omogući lokaciju"</string>
+    <string name="cancel_action_title" msgid="1149738685397349236">"Otkaži"</string>
+    <string name="stop_action_title" msgid="1187619482795416314">"Zaustavi"</string>
+    <string name="more_action_title" msgid="1039516575011403837">"Još"</string>
+    <string name="call_action_title" msgid="6218977436905001611">"Pozovi"</string>
+    <string name="primary_action_title" msgid="7042003552215710683">"Primarno"</string>
+    <string name="options_action_title" msgid="1168121856107932984">"Opcije"</string>
+    <string name="search_action_title" msgid="3483459674263446335">"Pretraži"</string>
+    <string name="checked_action_title" msgid="906023941445896399">"Označeno"</string>
+    <string name="unchecked_action_title" msgid="802503415474307811">"Oznaka je uklonjena"</string>
+    <string name="on_action_title" msgid="4129601573763429611">"Uključeno"</string>
+    <string name="off_action_title" msgid="8669201170189204848">"Isključeno"</string>
+    <string name="settings_action_title" msgid="8616900063253887861">"Podešavanja"</string>
+    <string name="accept_action_title" msgid="4899660585470647578">"Prihvatam"</string>
+    <string name="reject_action_title" msgid="6730366705938402668">"Odbij"</string>
+    <string name="ok_action_title" msgid="7128494973966098611">"Potvrdi"</string>
+    <string name="throw_action_title" msgid="7163710562670220163">"Baci"</string>
+    <string name="commute_action_title" msgid="2585755255290185096">"Redovno putovanje"</string>
+    <string name="sign_out_action_title" msgid="1653943000866713010">"Odjavite se"</string>
+    <string name="try_anyway_action_title" msgid="7384500054249311718">"Ipak pokušaj"</string>
+    <string name="yes_action_title" msgid="5507096013762092189">"Da"</string>
+    <string name="no_action_title" msgid="1452124604210014010">"Ne"</string>
+    <string name="disable_all_rows" msgid="3003225080532928046">"Onemogući sve redove"</string>
+    <string name="enable_all_rows" msgid="7274285275711872091">"Omogući sve redove"</string>
+    <string name="bug_reported_toast_msg" msgid="2487119172744644317">"Prijavljena je greška!"</string>
+    <string name="zoomed_in_toast_msg" msgid="8915301497303842649">"Uvećano je"</string>
+    <string name="zoomed_out_toast_msg" msgid="6260981223227212493">"Umanjeno je"</string>
+    <string name="triggered_toast_msg" msgid="3396166539208366382">"Pokrenuto je"</string>
+    <string name="primary_toast_msg" msgid="7153771322662005447">"Pritisnuto je primarno dugme"</string>
+    <string name="search_toast_msg" msgid="7826530065407699347">"Pritisnuto je dugme za pretragu"</string>
+    <string name="options_toast_msg" msgid="2146223786877557730">"Dugme Opcije je pritisnuto"</string>
+    <string name="favorite_toast_msg" msgid="522064494016370117">"Omiljeno!"</string>
+    <string name="not_favorite_toast_msg" msgid="6831181108681007428">"Nije omiljeno!"</string>
+    <string name="nav_requested_toast_msg" msgid="6696525973145493908">"Navigacija je zahtevana"</string>
+    <string name="selected_route_toast_msg" msgid="3149189677200086656">"Izabrana ruta"</string>
+    <string name="visible_routes_toast_msg" msgid="7065558153736024203">"Vidljive rute"</string>
+    <string name="second_item_toast_msg" msgid="7210054709419608215">"Kliknuto je na drugu stavku"</string>
+    <string name="third_item_checked_toast_msg" msgid="3022450599567347361">"Treća stavka je označena"</string>
+    <string name="fifth_item_checked_toast_msg" msgid="1627599668504718594">"Peta stavka je označena"</string>
+    <string name="sixth_item_toast_msg" msgid="6117028866385793707">"Kliknuto je na šestu stavku"</string>
+    <string name="settings_toast_msg" msgid="7697794473002342727">"Podešavanja na koja je kliknuto"</string>
+    <string name="parked_toast_msg" msgid="2532422265890824446">"Radnja parkiranja"</string>
+    <string name="more_toast_msg" msgid="5938288138225509885">"Kliknuto je na Još"</string>
+    <string name="commute_toast_msg" msgid="4112684360647638688">"Dugme Redovno putovanje je pritisnuto"</string>
+    <string name="grant_location_permission_toast_msg" msgid="268046297444808010">"Odobrite dozvolu za lokaciju da biste videli aktuelnu lokaciju"</string>
+    <string name="sign_in_with_google_toast_msg" msgid="5720947549233124775">"Prijavljivanje pomoću Google-a počinje ovde"</string>
+    <string name="changes_selection_to_index_toast_msg_prefix" msgid="957766225794389167">"Izbor je promenjen u indeks"</string>
+    <string name="yes_action_toast_msg" msgid="6216215197177241247">"Pritisnuto je dugme Da."</string>
+    <string name="no_action_toast_msg" msgid="6165492423831023809">"Pritisnuto je dugme Ne."</string>
+    <string name="alert_timeout_toast_msg" msgid="5568380708832805374">"Obaveštenje je isteklo."</string>
+    <string name="first_row_title" msgid="219428344573165351">"Red sa velikom slikom i dugim tekstom dugim tekstom dugim tekstom dugim tekstom dugim tekstom"</string>
+    <string name="first_row_text" msgid="3887390298628338716">"Tekst tekst tekst"</string>
+    <string name="other_row_title_prefix" msgid="4702355788835253197">"Naslov reda"</string>
+    <string name="other_row_text" msgid="7510279447493169945">"Tekst u redu"</string>
+    <string name="navigate" msgid="2713090390373996139">"Navigacija"</string>
+    <string name="dial" msgid="3145707439707628311">"Pozovi"</string>
+    <string name="address" msgid="9010635942573581302">"Adresa"</string>
+    <string name="phone" msgid="2504766809811627577">"Telefon"</string>
+    <string name="fail_start_nav" msgid="6921321606009212189">"Greška pri pokretanju navigacije"</string>
+    <string name="fail_start_dialer" msgid="1471602619507306261">"Greška pri pokretanju telefona"</string>
+    <string name="car_hardware_demo_title" msgid="3679106197233262689">"Demonstracija za hardver automobila"</string>
+    <string name="car_hardware_info" msgid="1244783247616395012">"Informacije o hardveru automobila"</string>
+    <string name="model_info" msgid="494224423025683030">"Informacije o modelu"</string>
+    <string name="no_model_permission" msgid="5333629877014978947">"Nema dozvole za model."</string>
+    <string name="manufacturer_unavailable" msgid="4978995415869838056">"Proizvođač je nedostupan"</string>
+    <string name="model_unavailable" msgid="4075463010215406573">"Model je nedostupan"</string>
+    <string name="year_unavailable" msgid="994338773299644607">"Godina je nedostupna"</string>
+    <string name="energy_profile" msgid="81415433590192158">"Energetski profil"</string>
+    <string name="no_energy_profile_permission" msgid="4662285713731308888">"Nema dozvole za energetski profil"</string>
+    <string name="fuel_types" msgid="6811375173343218212">"Vrste goriva"</string>
+    <string name="unavailable" msgid="3636401138255192934">"Nedostupno"</string>
+    <string name="ev_connector_types" msgid="735458637011996125">"Tipovi konektora za električna vozila"</string>
+    <string name="example_title" msgid="530257630320010494">"Primer %d"</string>
+    <string name="example_1_text" msgid="8456567953748293512">"Ovaj tekst ima crvenu boju"</string>
+    <string name="example_2_text" msgid="718820705318661440">"Ovaj tekst ima zelenu boju"</string>
+    <string name="example_3_text" msgid="977269832109695627">"Ovaj tekst ima plavu boju"</string>
+    <string name="example_4_text" msgid="2043547015979437373">"Ovaj tekst ima žutu boju"</string>
+    <string name="example_5_text" msgid="8828804968749423500">"Ovaj tekst koristi primarnu boju"</string>
+    <string name="example_6_text" msgid="7991523168517599600">"Ovaj tekst koristi sekundarnu boju"</string>
+    <string name="color_demo" msgid="1822427636476178993">"Demonstracija za boju"</string>
+    <string name="list_limit" msgid="3023536401535417286">"Ograničenje liste"</string>
+    <string name="grid_limit" msgid="1350116012893549206">"Ograničenje mreže"</string>
+    <string name="pane_limit" msgid="981518409516855230">"Ograničenje okna"</string>
+    <string name="place_list_limit" msgid="6785181191763056582">"Ograničenje liste mesta"</string>
+    <string name="route_list_limit" msgid="505793441615134116">"Ograničenje liste ruta"</string>
+    <string name="content_limits" msgid="5726880972110281095">"Ograničenja sadržaja"</string>
+    <string name="content_limits_demo_title" msgid="3207211638386727610">"Demonstracija ograničenja sadržaja"</string>
+    <string name="finish_app_msg" msgid="8354334557053141891">"Time će se aplikacija završiti, a kada je vratite, predučitaće ekran sa dozvolama"</string>
+    <string name="finish_app_title" msgid="9013328479438745074">"Demonstracija završetka aplikacije"</string>
+    <string name="finish_app_demo_title" msgid="8223819062053448384">"Demonstracija predučitavanja ekrana sa dozvolama pri sledećem pokretanju"</string>
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demonstracija predučitavanja dozvola za aplikaciju"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demonstracija predučitavanja ekrana sa dozvolama pri sledećem pokretanju"</string>
+    <string name="loading_demo_title" msgid="1086529475809143517">"Učitava se demonstracija"</string>
+    <string name="loading_demo_row_title" msgid="8933049915126088142">"Učitavanje je dovršeno!"</string>
+    <string name="pop_to_root" msgid="2078277386355064198">"Pređi na osnovni nivo"</string>
+    <string name="pop_to_marker" msgid="5007078308762725207">"Marker demonstracije prelaska na razno"</string>
+    <string name="push_stack" msgid="2433062141810168976">"Gurni dalje u stek"</string>
+    <string name="pop_to_prefix" msgid="4288884615669751608">"Pređi na"</string>
+    <string name="pop_to_title" msgid="3924696281273379455">"Demonstracija prelaska"</string>
+    <string name="package_not_found_error_msg" msgid="7525619456883627939">"Paket nije pronađen."</string>
+    <string name="permissions_granted_msg" msgid="2348556088141992714">"Sve dozvole su odobrene. Opozovite dozvole u Podešavanjima."</string>
+    <string name="needs_access_msg_prefix" msgid="2204136858798832382">"Aplikacija treba pristup sledećim dozvolama:\n"</string>
+    <string name="phone_screen_permission_msg" msgid="3599815596923367256">"Dodelite dozvolu na ekranu telefona"</string>
+    <string name="enable_location_permission_on_device_msg" msgid="472752487966156897">"Omogući dozvole za lokaciju na uređaju"</string>
+    <string name="enable_location_permission_on_phone_msg" msgid="5082615523959139121">"Omogući lokaciju na ekranu telefona"</string>
+    <string name="required_permissions_title" msgid="5351791879153568211">"Obavezne dozvole"</string>
+    <string name="request_permissions_title" msgid="7456426341142412300">"Demonstracija zahteva za dozvolu"</string>
+    <string name="cancel_reservation_title" msgid="1374986823057959608">"Ekran za otkazivanje rezervacije"</string>
+    <string name="reservation_cancelled_msg" msgid="6334213670275547875">"Rezervacija je otkazana"</string>
+    <string name="result_demo_title" msgid="3900525190662148290">"Demonstracija rezultata"</string>
+    <string name="not_started_for_result_msg" msgid="7498800528148447270">"Ova aplikacija nije pokrenuta radi rezultata"</string>
+    <string name="started_for_result_msg" msgid="4225260243713833974">"Ova aplikacija je pozvana za rezultat iz: %s. Izaberite rezultat koji ćete poslati pozivaocu"</string>
+    <string name="arrived_exclamation_msg" msgid="9132265698563096988">"Došao je!"</string>
+    <string name="travel_est_trip_text" msgid="5134365408383171144">"Pokupi Anu"</string>
+    <string name="send_notification_title" msgid="4731688444696028193">"Pošalji obaveštenje"</string>
+    <string name="start_notifications_title" msgid="8699668027543530460">"Pokreni obaveštenja"</string>
+    <string name="stop_notifications_title" msgid="3703892710275206239">"Zaustavi prikazivanje obaveštenja"</string>
+    <string name="notification_title" msgid="5507590705935298176">"Obaveštenje"</string>
+    <string name="importance_title" msgid="9034862997821839831">"Važnost"</string>
+    <string name="category_title" msgid="4783851267093259949">"Kategorija"</string>
+    <string name="ongoing_title" msgid="4957996003270280496">"Aktivno"</string>
+    <string name="default_importance" msgid="6347996298832939989">"Podrazumevana"</string>
+    <string name="high_importance" msgid="5009120714837304882">"Visoka"</string>
+    <string name="low_importance" msgid="4721161314404294033">"Niska"</string>
+    <string name="unknown_importance" msgid="909001735933359216">"Nepoznato"</string>
+    <string name="notification_demo" msgid="1819496937832036387">"Demonstracija obaveštenja"</string>
+    <string name="misc_demo_title" msgid="7399959062407349380">"Različite demonstracije"</string>
+    <string name="navigating_demo_title" msgid="7454579665387386476">"Demonstracija navigacije"</string>
+    <string name="arrived_demo_title" msgid="6708013121387053838">"Demonstracija dolaska"</string>
+    <string name="junction_image_demo_title" msgid="3302979708776502314">"Demonstracija slike raskrsnice"</string>
+    <string name="nav_template_demos_title" msgid="8215835368932160866">"Demonstracije šablona navigacije"</string>
+    <string name="map_template_pane_demo_title" msgid="4849450903277412004">"Demonstracija šablona mape sa oknom"</string>
+    <string name="map_template_list_demo_title" msgid="1473810899303903185">"Demonstracija šablona mape sa listom"</string>
+    <string name="start_notification_title" msgid="2208831088632818681">"Pokreni obaveštenje"</string>
+    <string name="stop_notification_title" msgid="3709643750540881176">"Zaustavi prikazivanje obaveštenja"</string>
+    <string name="nav_notification_demo_title" msgid="4448683262984308442">"Demonstracija obaveštenja navigacije"</string>
+    <string name="go_straight" msgid="2301747728609198718">"Idi pravo"</string>
+    <string name="turn_right" msgid="4710562732720109969">"Skrenite desno"</string>
+    <string name="take_520" msgid="3804796387195842741">"Krenite putem 520"</string>
+    <string name="gas_station" msgid="1203313937444666161">"Benzinska pumpa"</string>
+    <string name="short_route" msgid="4831864276538141265">"Kratka ruta"</string>
+    <string name="less_busy" msgid="310625272281710983">"Manje prometno"</string>
+    <string name="hov_friendly" msgid="6956152104754594971">"Prilagođeno vozilima sa više putnika"</string>
+    <string name="long_route" msgid="4737969235741057506">"Duga putanja"</string>
+    <string name="continue_start_nav" msgid="6231797535084469163">"Nastavi sa pokretanjem navigacije"</string>
+    <string name="continue_route" msgid="5172258139245088080">"Nastavi na putanju"</string>
+    <string name="routes_title" msgid="7799772149932075357">"Rute"</string>
+    <string name="place_list_nav_template_demo_title" msgid="8019588508812955290">"Demonstracija šablona navigacije listom mesta"</string>
+    <string name="route_preview_template_demo_title" msgid="7878704357953167555">"Demonstracija šablona pregleda rute"</string>
+    <string name="notification_template_demo_title" msgid="5076051497316030274">"Demonstracija šablona obaveštenja"</string>
+    <string name="nav_map_template_demo_title" msgid="344985380763975398">"Demonstracija šablona navigacije samo sa mapom"</string>
+    <string name="nav_demos_title" msgid="72781206086461004">"Demonstracije navigacije"</string>
+    <string name="navigation_alert_title" msgid="8306554249264200848">"Da li se i dalje meri brzina?"</string>
+    <string name="navigation_alert_subtitle" msgid="3331130131492672264">"Prijavljeno pre 10 min"</string>
+    <string name="no_toll_card_permission" msgid="6789073114449712090">"Nema dozvole za karticu za putarinu."</string>
+    <string name="no_energy_level_permission" msgid="1684773185095107825">"Nema dozvole za nivo energije."</string>
+    <string name="no_speed_permission" msgid="5812532480922675390">"Nema dozvole za brzinu."</string>
+    <string name="no_mileage_permission" msgid="4074779840599589847">"Nema dozvole za kilometražu."</string>
+    <string name="no_ev_status_permission" msgid="933075402821938973">"Nema dozvole za status električnog vozila."</string>
+    <string name="no_accelerometer_permission" msgid="896914448469117234">"Nema dozvole za akcelerometar."</string>
+    <string name="no_gyroscope_permission" msgid="665293140266771569">"Nema dozvole za žiroskop."</string>
+    <string name="no_compass_permission" msgid="5162304489577567125">"Nema dozvole za kompas."</string>
+    <string name="no_car_hardware_location" msgid="3505517472938045093">"Nema dozvole za lokaciju hardvera automobila."</string>
+    <string name="fetch_toll_info" msgid="6864627977128179834">"Preuzimaju se informacije o putarini."</string>
+    <string name="fetch_energy_level" msgid="1773415471137542832">"Preuzima se nivo energije."</string>
+    <string name="fetch_speed" msgid="7333830984597189627">"Preuzima se brzina."</string>
+    <string name="fetch_mileage" msgid="7490131687788025123">"Preuzima se kilometraža."</string>
+    <string name="fetch_ev_status" msgid="2798910410830567052">"Preuzima se status električnog vozila."</string>
+    <string name="fetch_accelerometer" msgid="697750041126810911">"Preuzima se akcelerometar."</string>
+    <string name="fetch_gyroscope" msgid="7153155318827188539">"Preuzima se žiroskop."</string>
+    <string name="fetch_compass" msgid="7316188117590056717">"Preuzima se kompas."</string>
+    <string name="fetch_location" msgid="5015066922035852615">"Preuzima se lokacija."</string>
+    <string name="toll_card_state" msgid="4430544885695162226">"Status kartice za putarinu"</string>
+    <string name="low_energy" msgid="3462774027012877028">"Niska energija"</string>
+    <string name="range" msgid="8744960568263400641">"Opseg"</string>
+    <string name="fuel" msgid="4253578650127250651">"Gorivo"</string>
+    <string name="battery" msgid="2183623637331546820">"Baterija"</string>
+    <string name="display_speed" msgid="9161318805331348165">"Prikaži brzinu"</string>
+    <string name="raw_speed" msgid="7295910214088983967">"Osnovna brzina"</string>
+    <string name="unit" msgid="7697521583928135171">"Jedinica"</string>
+    <string name="odometer" msgid="3925174645651546591">"Odometar"</string>
+    <string name="ev_connected" msgid="2277845607662494696">"Port za punjenje električnog vozila je povezan"</string>
+    <string name="ev_open" msgid="4916704450914519643">"Port za punjenje električnog vozila je otvoren"</string>
+    <string name="accelerometer" msgid="2084026313768299185">"Akcelerometar"</string>
+    <string name="gyroscope" msgid="3428075828014504651">"Žiroskop"</string>
+    <string name="compass" msgid="7037367764762441245">"Kompas"</string>
+    <string name="car_hardware_location" msgid="5826128477363068617">"Lokacija hardvera automobila"</string>
+    <string name="non_actionable" msgid="8999757911111188784">"Ne može da se izvrši"</string>
+    <string name="second_item" msgid="5245792503030812493">"Druga stavka"</string>
+    <string name="third_item" msgid="334088179008716411">"Treća stavka"</string>
+    <string name="fourth_item" msgid="1153409687260543158">"Četvrta stavka"</string>
+    <string name="fifth_item" msgid="295284272719956932">"Peta stavka ima podešen dugačak naslov"</string>
+    <string name="sixth_item" msgid="3880321601391343607">"Šesta stavka ima podešen dugačak naslov"</string>
+    <string name="grid_template_demo_title" msgid="6159115661928982245">"Demonstracija šablona mreže"</string>
+    <string name="parked_only_title" msgid="3190603222397552672">"Naslov Samo za parkirane"</string>
+    <string name="parked_only_text" msgid="8720610556452272916">"Još teksta za Samo za parkirane."</string>
+    <string name="clicked_row_prefix" msgid="9068303427922069941">"Red na koji je kliknuto"</string>
+    <string name="first_line_text" msgid="6648055806656590336">"Prvi red teksta"</string>
+    <string name="second_line_text" msgid="38664490158836864">"Drugi red teksta"</string>
+    <string name="long_line_text" msgid="8082962600953333087">"Ovaj podtekst može u potpunosti da se prikazuje u neograničenom režimu (npr. režim parkinga, režim ograničene male brzine). Ali to će se skratiti na samo dva reda u ograničenom režimu (npr. režim vožnje). U svrhe testiranja ovaj podtekst je pre pre pre pre pre predugačak"</string>
+    <string name="title_prefix" msgid="3991742709199357049">"Naslov"</string>
+    <string name="list_template_demo_title" msgid="1740208242737246151">"Demonstracija šablona liste"</string>
+    <string name="long_msg_template_demo_title" msgid="1793748562161438131">"Demonstracija šablona duge poruke"</string>
+    <string name="long_msg_template_not_supported_text" msgid="3641559637317672505">"Host ne podržava šablon duge poruke"</string>
+    <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nekompatibilan host"</string>
+    <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstracija šablona poruke"</string>
+    <string name="msg_template_demo_text" msgid="2275291617716161409">"Ovde ide poruka.\nViše teksta u drugom redu."</string>
+    <string name="short_msg_template_demo_title" msgid="6798738013668580714">"Demonstracija šablona kratke poruke"</string>
+    <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstracija šablona okna"</string>
+    <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstracija šablona liste mesta"</string>
+    <string name="browse_places_title" msgid="7246005909846715898">"Pregledajte mesta"</string>
+    <string name="search_template_demo_title" msgid="1770474418958318114">"Demonstracija šablona pretrage"</string>
+    <string name="search_hint" msgid="978495498991026792">"Pretražujte ovde"</string>
+    <string name="additional_text" msgid="8410289578276941586">"Pregledajte uslove korišćenja usluge"</string>
+    <string name="google_sign_in" msgid="6556259799319701727">"Prijavljivanje na Google"</string>
+    <string name="use_pin" msgid="7850893299484337431">"Koristite PIN"</string>
+    <string name="qr_code" msgid="5487041647280777397">"QR kôd"</string>
+    <string name="sign_in_template_not_supported_text" msgid="7184733753948837646">"Host ne podržava šablon za prijavljivanje"</string>
+    <string name="sign_in_template_not_supported_title" msgid="4892883228898541764">"Nekompatibilan host"</string>
+    <string name="email_hint" msgid="7205549445477319606">"Imejl"</string>
+    <string name="sign_in_title" msgid="4551967308262681703">"Prijavite se"</string>
+    <string name="sign_in_instructions" msgid="9044850228284294762">"Unesite akreditive"</string>
+    <string name="invalid_email_error_msg" msgid="5261362663718987167">"Korisničko ime mora da bude važeća imejl adresa"</string>
+    <string name="invalid_length_error_msg" msgid="8238905276326976425">"Najmanji broj znakova u korisničkom imenu je %s"</string>
+    <string name="invalid_password_error_msg" msgid="1090359893902674610">"Nevažeća lozinka"</string>
+    <string name="password_hint" msgid="2869107073860012864">"lozinka"</string>
+    <string name="password_sign_in_instruction_prefix" msgid="9105788349198243508">"Korisničko ime"</string>
+    <string name="pin_sign_in_instruction" msgid="2288691296234360441">"Unesite ovaj PIN na telefonu"</string>
+    <string name="qr_code_sign_in_title" msgid="8137070561006464518">"Skenirajte QR kôd da biste se prijavili"</string>
+    <string name="sign_in_with_google_title" msgid="8043752000786977249">"Prijavite se pomoću Google-a"</string>
+    <string name="provider_sign_in_instruction" msgid="7586815688292506743">"Koristite ovo dugme da biste dovršili prijavljivanje preko Google-a"</string>
+    <string name="sign_in_complete_text" msgid="8423984266325680606">"Prijavljeni ste!"</string>
+    <string name="sign_in_complete_title" msgid="8919868148773983428">"Prijavljivanje je završeno"</string>
+    <string name="sign_in_template_demo_title" msgid="6052035424941410249">"Demonstracija šablona prijavljivanja"</string>
+    <string name="images_unknown_host_error" msgid="3180661817432720076">"Slike ne mogu da se prikazuju za nepoznat host"</string>
+    <string name="icon_title_prefix" msgid="8487026131229541244">"Ikona"</string>
+    <string name="content_provider_icons_demo_title" msgid="5708602618664311097">"Demonstracija ikona dobavljača sadržaja"</string>
+    <string name="icons_demo_title" msgid="4082976685262307357">"Demonstracija za ikone"</string>
+    <string name="app_icon_title" msgid="7534936683349723423">"Ikona aplikacije"</string>
+    <string name="vector_no_tint_title" msgid="874591632279039146">"Vektor koji može da se crta, bez tonaliteta"</string>
+    <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektor koji može da se crta, sa tonalitetom"</string>
+    <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektor koji može da se crta, sa atributom teme aplikacije za njegovu boju"</string>
+    <string name="png_res_title" msgid="7437083018336747544">"PNG fajl, poslat kao resurs"</string>
+    <string name="png_bitmap_title" msgid="3385912074130977032">"PNG fajl, poslat kao bit mapa"</string>
+    <string name="just_row_title" msgid="965700021568970725">"Samo naslov"</string>
+    <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Naslov sa ikonom aplikacije"</string>
+    <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Naslov sa slikom ID-a resursa"</string>
+    <string name="title_with_svg_image_row_title" msgid="6109092343637263755">"Naslov sa SVG slikom"</string>
+    <string name="colored_secondary_row_title" msgid="5173288934252528929">"Sekundarni tekst u boji"</string>
+    <string name="title_with_secondary_lines_row_title" msgid="7769408881272549837">"Naslov sa više linija sekundarnog teksta"</string>
+    <string name="title_with_secondary_lines_row_text_1" msgid="8945114692653524102">"Greška i greška i ponovo greška, ali manje i manje i manje"</string>
+    <string name="title_with_secondary_lines_row_text_2" msgid="1017734603405251531">"– Pit Hejn"</string>
+    <string name="rows_demo_title" msgid="3198566660454251007">"Demonstracija redova"</string>
+    <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstracije teksta i ikona"</string>
+    <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstracija redova sa tekstom i ikonama"</string>
+    <string name="radio_button_list_demo_title" msgid="9082264324855338774">"Demonstracija lista sa dugmetom za izbor"</string>
+    <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstracija lista koje mogu da se izaberu"</string>
+    <string name="option_1_title" msgid="7221252541651471199">"1. opcija"</string>
+    <string name="option_2_title" msgid="1905146448697963818">"2. opcija"</string>
+    <string name="option_3_title" msgid="6319268250436119258">"3. opcija"</string>
+    <string name="option_row_radio_title" msgid="5978617101267398181">"Red sa dugmetom za izbor"</string>
+    <string name="option_row_radio_icon_title" msgid="3304229002524317977">"Red sa dugmetom za izbor i ikonom"</string>
+    <string name="option_row_radio_icon_colored_text_title" msgid="947641896184637026">"Red sa dugmetom za izbor i ikonom i tekstom u boji"</string>
+    <string name="some_additional_text" msgid="4009872495806318260">"Dodatni tekst"</string>
+    <string name="sample_additional_list" msgid="5085372891301576306">"Primer liste koja može da se izabere"</string>
+    <string name="task_restriction_demo_title" msgid="2212084350718766941">"Demonstracija ograničenja za zadatke"</string>
+    <string name="task_limit_reached_msg" msgid="6038763366777119364">"Dostignuto je ograničenje zadataka\nAko nastavite, aplikacija će se prinudno zaustaviti"</string>
+    <string name="task_step_of_title" msgid="2791717962535723839">"%1$d. korak zadatka od %2$d"</string>
+    <string name="task_step_of_text" msgid="4646729781462227219">"Kliknite da biste išli napred"</string>
+    <string name="task_content_allowed" msgid="545061986612431190">"Posetite različite šablone i uverite se da je automobil u režimu vožnje"</string>
+    <string name="toggle_button_demo_title" msgid="3179103600967398928">"Demonstracija dugmeta za uključivanje/isključivanje"</string>
+    <string name="toggle_test_title" msgid="924485265152862631">"Uključi/isključi test"</string>
+    <string name="toggle_test_text" msgid="8107217216013312857">"Promene stanja su dozvoljene"</string>
+    <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Omogućite test uključivanja/isključivanja"</string>
+    <string name="toggle_test_first_toggle_text" msgid="5914741538328669668">"Izaberite ovo da biste omogućili test uključivanja/isključivanja"</string>
+    <string name="toggle_test_second_toggle_title" msgid="1083594617400613969">"Test uključivanja/isključivanja"</string>
+    <string name="toggle_test_second_toggle_text" msgid="1813071017415876745">"Promene stanja su dozvoljene"</string>
+    <string name="image_test_title" msgid="8273863429801477547">"Test slike"</string>
+    <string name="image_test_text" msgid="6264812093895530445">"Promene slika su dozvoljene"</string>
+    <string name="additional_data_title" msgid="3546689652240300617">"Dodatni podaci"</string>
+    <string name="additional_data_text" msgid="2846223398214158872">"Ažuriranja su dozvoljena za operacije u pozadini."</string>
+    <string name="toggle_test_enabled" msgid="982370904182034076">"Test uključivanja/isključivanja je omogućen"</string>
+    <string name="toggle_test_disabled" msgid="8366040658408451664">"Test uključivanja/isključivanja je onemogućen"</string>
+    <string name="secondary_actions_decoration_button_demo_title" msgid="3710817648501132309">"Demonstracija sekundarne radnje i dekoracije"</string>
+    <string name="secondary_actions_test_title" msgid="3664453747553733613">"Test sekundarne radnje"</string>
+    <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Može da se izabere samo sekundarna radnja"</string>
+    <string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
+    <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
+    <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Može da se izabere i red"</string>
+    <string name="secondary_action_toast" msgid="5076434693504006565">"Sekundarna radnja je izabrana"</string>
+    <string name="row_primary_action_toast" msgid="756516694751965204">"Primarna radnja reda je izabrana"</string>
+    <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstracije različitih šablona"</string>
+    <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstracije prikazivanja"</string>
+    <string name="template_layouts_demo_title" msgid="788249269446087847">"Demonstracije izgleda šablona"</string>
+    <string name="grid_template_menu_demo_title" msgid="7096285873490705119">"Demonstracije šablona mreže"</string>
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ekran demonstracije pristupa glasu"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Korisničke interakcije"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demonstracije zahteva za dozvole"</string>
+    <string name="application_overflow_title" msgid="396427940886169325">"Validator prekoračenja aplikacije"</string>
+    <string name="application_overflow_subtitle1" msgid="7429415605726615529">"Testirajte sledeće šablone tokom punjenja"</string>
+    <string name="application_overflow_subtitle2" msgid="4385123036846369714">"status vozila iz parkiranog u vožnja"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupa dozvola"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupa dozvola za isticanje aplikacije"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Pristup preciznoj lokaciji"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Dozvola za pristup preciznoj lokaciji"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Pristup približnoj lokaciji"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Dozvola za pristup približnoj lokaciji"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Pristup snimanju zvuka"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Dozvola za pristup snimanju zvuka"</string>
+    <string name="location_1_description" msgid="4801052291684791371">"Vektor resursa sa tonalitetom"</string>
+    <string name="location_2_description" msgid="3331356135359047166">"Bit mapa resursa slike"</string>
+    <string name="location_3_description" msgid="3982142774088944850">"Marker teksta u boji"</string>
+    <string name="location_4_description" msgid="6560365445044381911">"Bit mapa slike"</string>
+    <string name="location_description_text_label" msgid="2779911545316756419">"Oznaka teksta"</string>
+    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"Demonstracija sa poređenjem parkiranja i vožnje"</string>
+    <string name="latest_feature_details" msgid="6843008350392721502">"Grupni prikazi u automobilima."</string>
+    <string name="latest_feature_title" msgid="7929405790070777460">"Najnovije funkcije"</string>
+    <string name="loading_toggle_enabled" msgid="8828072732804454994">"Učitavanje je omogućeno"</string>
+    <string name="loading_toggle_disabled" msgid="7689738885077382673">"Učitavanje je onemogućeno"</string>
+    <string name="loading_screen" msgid="4771507490730308794">"Ekran učitavanja"</string>
+    <string name="vector_toggle_details" msgid="1301305340033556819">"Dugme za dodavanje/uklanjanje boje"</string>
+    <string name="map_template_toggle_demo_title" msgid="6510798293640092611">"Demonstracija šablona mape sa prekidačima"</string>
+    <string name="avoid_tolls_row_title" msgid="5194057244144831024">"Izbegavaj naplatne rampe"</string>
+    <string name="route_options_demo_title" msgid="4599699012716426514">"Opcije za rute"</string>
+    <string name="avoid_highways_row_title" msgid="4711913426200490304">"Izbegavaj auto-puteve"</string>
+    <string name="avoid_ferries_row_title" msgid="8232883866013711974">"Izbegavaj trajekt"</string>
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
index 17c4bb5..563f2c0 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
@@ -244,7 +244,7 @@
     <string name="sign_in_template_not_supported_title" msgid="4892883228898541764">"میزبان سازگار نیست"</string>
     <string name="email_hint" msgid="7205549445477319606">"ایمیل"</string>
     <string name="sign_in_title" msgid="4551967308262681703">"ورود به سیستم"</string>
-    <string name="sign_in_instructions" msgid="9044850228284294762">"اطلاعات کاربری‌تان را وارد کنید"</string>
+    <string name="sign_in_instructions" msgid="9044850228284294762">"اطلاعات اعتباری‌تان را وارد کنید"</string>
     <string name="invalid_email_error_msg" msgid="5261362663718987167">"نام کاربری باید نشانی ایمیل معتبر باشد"</string>
     <string name="invalid_length_error_msg" msgid="8238905276326976425">"‏نام کاربری باید حداقل %s نویسه داشته باشد"</string>
     <string name="invalid_password_error_msg" msgid="1090359893902674610">"گذرواژه نامعتبر است"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
index b33a0cc..382a301 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
@@ -108,8 +108,8 @@
     <string name="pane_limit" msgid="981518409516855230">"Панель шегі"</string>
     <string name="place_list_limit" msgid="6785181191763056582">"Орындар тізімінің шегі"</string>
     <string name="route_list_limit" msgid="505793441615134116">"Бағыт тізімінің шегі"</string>
-    <string name="content_limits" msgid="5726880972110281095">"Мазмұн шектеулері"</string>
-    <string name="content_limits_demo_title" msgid="3207211638386727610">"Мазмұн шектеулерінің демо нұсқасы"</string>
+    <string name="content_limits" msgid="5726880972110281095">"Контент шектеулері"</string>
+    <string name="content_limits_demo_title" msgid="3207211638386727610">"Контент шектеулерінің демо нұсқасы"</string>
     <string name="finish_app_msg" msgid="8354334557053141891">"Қолданба жабылады, ал қайта ашқан кезде, рұқсат сұрау экранын қосады."</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Қолданбаның демо нұсқасын аяқтау"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Келесі іске қосу кезінде рұқсат сұрау экранын қосу операциясының демо нұсқасы"</string>
@@ -259,7 +259,7 @@
     <string name="sign_in_template_demo_title" msgid="6052035424941410249">"Кіру үлгісінің демо нұсқасы"</string>
     <string name="images_unknown_host_error" msgid="3180661817432720076">"Суреттер белгісіз хост үшін көрсетілмейді."</string>
     <string name="icon_title_prefix" msgid="8487026131229541244">"Белгіше"</string>
-    <string name="content_provider_icons_demo_title" msgid="5708602618664311097">"Мазмұн провайдерлерінің белгішесін көрсету"</string>
+    <string name="content_provider_icons_demo_title" msgid="5708602618664311097">"Контент провайдерлерінің белгішесін көрсету"</string>
     <string name="icons_demo_title" msgid="4082976685262307357">"Белгішенің демо нұсқасы"</string>
     <string name="app_icon_title" msgid="7534936683349723423">"Қолданба белгішесі"</string>
     <string name="vector_no_tint_title" msgid="874591632279039146">"Вектор кескінделетін дереккөз, түс реңкісіз"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
index 299a0b4..c2dc5b5 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
@@ -237,7 +237,7 @@
     <string name="search_template_demo_title" msgid="1770474418958318114">"Демонстрація шаблона пошуку"</string>
     <string name="search_hint" msgid="978495498991026792">"Шукати"</string>
     <string name="additional_text" msgid="8410289578276941586">"Перегляньте наші умови використання"</string>
-    <string name="google_sign_in" msgid="6556259799319701727">"Вхід у Google"</string>
+    <string name="google_sign_in" msgid="6556259799319701727">"Вхід через Google"</string>
     <string name="use_pin" msgid="7850893299484337431">"Ввести PIN-код"</string>
     <string name="qr_code" msgid="5487041647280777397">"QR-код"</string>
     <string name="sign_in_template_not_supported_text" msgid="7184733753948837646">"Ваш хост не підтримує шаблон екрана входу"</string>
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 d4afd09..2564e4b 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
@@ -78,6 +78,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
@@ -206,6 +207,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_clickWithEnterKey() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
@@ -233,6 +235,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_clickWithNumPadEnterKey() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
@@ -260,6 +263,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_clickWithDPadCenter() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
@@ -1271,6 +1275,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_interactionSource_focus_inKeyboardMode() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1919,6 +1924,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_enterKey_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1964,6 +1970,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_numPadEnterKey_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -2009,6 +2016,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_dpadCenter_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -2090,6 +2098,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_doubleEnterKey_emitsFurtherInteractions() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -2149,6 +2158,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -2207,6 +2217,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_interruptedClick_emitsCancelIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
index a46762b..2fec561 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
@@ -31,6 +31,7 @@
 import androidx.compose.ui.test.performTouchInput
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
+import kotlin.test.assertFalse
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
@@ -673,6 +674,18 @@
         assertThat(state.currentPage).isEqualTo(5)
     }
 
+    @Test
+    fun currentPageOffsetFraction_shouldNeverBeNan() {
+        rule.setContent {
+            val state = rememberPagerState()
+            // Read state in composition, should never be Nan
+            assertFalse { state.currentPageOffsetFraction.isNaN() }
+            HorizontalOrVerticalPager(pageCount = 10, state = state) {
+                Page(index = it)
+            }
+        }
+    }
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
index 79e0a63..179bbd1 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
@@ -66,6 +66,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
@@ -528,6 +529,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_interactionSource_focus_inKeyboardMode() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -629,6 +631,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_clickWithEnterKey() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
@@ -656,6 +659,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_clickWithNumPadEnterKey() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
@@ -683,6 +687,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_clickWithDPadCenter() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
@@ -710,6 +715,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_enterKey_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -756,6 +762,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_numPadEnterKey_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -802,6 +809,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_dpadCenter_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -885,6 +893,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_doubleEnterKey_emitsFurtherInteractions() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -945,6 +954,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1006,6 +1016,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_interruptedClick_emitsCancelIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
index 15c8297..38d0d22 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
@@ -75,6 +75,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
@@ -620,6 +621,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_interactionSource_focus_inKeyboardMode() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -820,6 +822,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithEnterKey() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
@@ -848,6 +851,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithNumPadEnterKey() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
@@ -876,6 +880,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithDpadCenter() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
@@ -904,6 +909,7 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithEnterKey_triStateToggleable() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
@@ -932,6 +938,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_enterKey_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -978,6 +985,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_numPadEnterKey_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1024,6 +1032,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_dpadCenter_emitsIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1107,6 +1116,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_doubleEnterKey_emitsFurtherInteractions() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1167,6 +1177,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
@@ -1226,6 +1237,7 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_interruptedClick_emitsCancelIndication() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
index ac2eff0..9e3faa2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
@@ -229,9 +229,14 @@
     val currentPageOffsetFraction: Float by derivedStateOf {
         val currentPagePositionOffset = closestPageToSnappedPosition?.offset ?: 0
         val pageUsedSpace = pageAvailableSpace.toFloat()
-        ((-currentPagePositionOffset) / (pageUsedSpace)).coerceIn(
-            MinPageOffset, MaxPageOffset
-        )
+        if (pageUsedSpace == 0f) {
+            // Default to 0 when there's no info about the page size yet.
+            0f
+        } else {
+            ((-currentPagePositionOffset) / (pageUsedSpace)).coerceIn(
+                MinPageOffset, MaxPageOffset
+            )
+        }
     }
 
     /**
diff --git a/compose/material3/material3/src/androidMain/res/values-af/strings.xml b/compose/material3/material3/src/androidMain/res/values-af/strings.xml
index 43a6fbd..8075df8 100644
--- a/compose/material3/material3/src/androidMain/res/values-af/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-af/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Maak toe"</string>
     <string name="search" msgid="8595876902241072592">"Soek"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Voorstelle hieronder"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Kies datum"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Geselekteerde datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Skakel oor na kies van ’n jaar"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Skakel oor na kies van ’n dag"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Verander na volgende maand"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Verander na vorige maand"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-am/strings.xml b/compose/material3/material3/src/androidMain/res/values-am/strings.xml
index 9a0c9e3..ed2e3cf 100644
--- a/compose/material3/material3/src/androidMain/res/values-am/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-am/strings.xml
@@ -20,10 +20,13 @@
     <string name="dialog" msgid="4057925834421392736">"መገናኛ"</string>
     <string name="expanded" msgid="5974471714631304645">"ተዘርግቷል"</string>
     <string name="collapsed" msgid="5389587048670450460">"ተሰብስቧል"</string>
-    <!-- no translation found for dismiss (1461218791585306270) -->
-    <skip />
-    <!-- no translation found for search (8595876902241072592) -->
-    <skip />
-    <!-- no translation found for suggestions_available (7189888345201419934) -->
-    <skip />
+    <string name="dismiss" msgid="1461218791585306270">"አሰናብት"</string>
+    <string name="search" msgid="8595876902241072592">"ፍለጋ"</string>
+    <string name="suggestions_available" msgid="7189888345201419934">"የአስተያየት ጥቆማዎች ከታች"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ቀን ይምረጡ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"የተመረጠው ቀን"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ወደ ዓመት መምረጥ ቀይር"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ወደ ቀን መምረጥ ቀይር"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ወደ የሚቀጥለው ወር ቀይር"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ወደ ቀዳሚው ወር ቀይር"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ar/strings.xml b/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
index c1b4e81..70f4f05 100644
--- a/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"إغلاق"</string>
     <string name="search" msgid="8595876902241072592">"بحث"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"إليك الاقتراحات:"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"اختيار تاريخ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"التاريخ المحدَّد"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"التبديل لاختيار سنة"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"التبديل لاختيار يوم"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"التغيير إلى الشهر التالي"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"التغيير إلى الشهر السابق"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-as/strings.xml b/compose/material3/material3/src/androidMain/res/values-as/strings.xml
index 0a15a3e..d7f3c72 100644
--- a/compose/material3/material3/src/androidMain/res/values-as/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-as/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"অগ্ৰাহ্য কৰক"</string>
     <string name="search" msgid="8595876902241072592">"সন্ধান"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"তলত পৰামৰ্শ দেখুওৱা হৈছে"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"তাৰিখ বাছনি কৰক"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"বাছনি কৰা তাৰিখ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"বছৰ বাছনি কৰাৰ ছুইচ"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"দিন বাছনি কৰাৰ ছুইচ"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"পৰৱৰ্তী মাহলৈ সলনি কৰক"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"পূৰ্বৱৰ্তী মাহলৈ সলনি কৰক"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-az/strings.xml b/compose/material3/material3/src/androidMain/res/values-az/strings.xml
index f45c06e..3b2fd43 100644
--- a/compose/material3/material3/src/androidMain/res/values-az/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-az/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Qapadılsın"</string>
     <string name="search" msgid="8595876902241072592">"Axtarış"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Təkliflər aşağıdadır"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Tarix seçin"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Seçilmiş tarix"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"İl seçiminə keçin"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Gün seçiminə keçin"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Növbəti aya dəyişin"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Əvvəlki aya dəyişin"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml b/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml
index cee26b5..c8b3281 100644
--- a/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml
@@ -17,10 +17,16 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="dialog" msgid="4057925834421392736">"Дијалог"</string>
-    <string name="expanded" msgid="5974471714631304645">"Проширено је"</string>
-    <string name="collapsed" msgid="5389587048670450460">"Скупљено је"</string>
-    <string name="dismiss" msgid="1461218791585306270">"Одбаци"</string>
-    <string name="search" msgid="8595876902241072592">"Претрага"</string>
-    <string name="suggestions_available" msgid="7189888345201419934">"Предлози су у наставку"</string>
+    <string name="dialog" msgid="4057925834421392736">"Dijalog"</string>
+    <string name="expanded" msgid="5974471714631304645">"Prošireno je"</string>
+    <string name="collapsed" msgid="5389587048670450460">"Skupljeno je"</string>
+    <string name="dismiss" msgid="1461218791585306270">"Odbaci"</string>
+    <string name="search" msgid="8595876902241072592">"Pretraga"</string>
+    <string name="suggestions_available" msgid="7189888345201419934">"Predlozi su u nastavku"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Izaberite datum"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Izabrani datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Pređite na izbor godine"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Pređite na izbor dana"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Pređite na sledeći mesec"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Pređite na prethodni mesec"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-be/strings.xml b/compose/material3/material3/src/androidMain/res/values-be/strings.xml
index 8187d2f..5dcf47d 100644
--- a/compose/material3/material3/src/androidMain/res/values-be/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-be/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Закрыць"</string>
     <string name="search" msgid="8595876902241072592">"Пошук"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Прапановы ўнізе"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Выберыце дату"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Выбраная дата"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Перайсці да выбару года"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Перайсці да выбару дня"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Перайсці да наступнага месяца"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Перайсці да папярэдняга месяца"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-bg/strings.xml b/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
index 9ba9a74..53c62d3 100644
--- a/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Отхвърляне"</string>
     <string name="search" msgid="8595876902241072592">"Търсене"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Предложенията са по-долу"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Избиране на дата"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Избрана дата"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Превключване към избиране на година"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Превключване към избиране на ден"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Преминаване към следващия месец"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Преминаване към предишния месец"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-bn/strings.xml b/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
index 6d841e3..bae5ac5 100644
--- a/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"বাতিল করুন"</string>
     <string name="search" msgid="8595876902241072592">"সার্চ করুন"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"নিচে দেওয়া সাজেশন"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"তারিখ বেছে নিন"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"বেছে নেওয়া তারিখ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"কোনও একটি বছর বেছে নিতে পাল্টে নিন"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"কোনও একটি দিন বেছে নিতে পাল্টে নিন"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"আগামী মাসে পরিবর্তন করুন"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"আগের মাসে পরিবর্তন করুন"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-bs/strings.xml b/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
index 312bd7f..592e753 100644
--- a/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Odbacivanje"</string>
     <string name="search" msgid="8595876902241072592">"Pretraživanje"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Prijedlozi su u nastavku"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Odabir datuma"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Odabrani datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Prebaci na odabir godine"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Prebaci na odabir dana"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Promijeni na sljedeći mjesec"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Promijeni na prethodni mjesec"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ca/strings.xml b/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
index 29c65fa..55f8816 100644
--- a/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Ignora"</string>
     <string name="search" msgid="8595876902241072592">"Cerca"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggeriments a continuació"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Selecciona la data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data seleccionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Canvia a la selecció de l\'any"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Canvia a la selecció del dia"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Canvia al mes següent"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Canvia al mes anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-cs/strings.xml b/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
index 077f16f..a33e105 100644
--- a/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Zavřít"</string>
     <string name="search" msgid="8595876902241072592">"Hledat"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Návrh je níže"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Vybrat datum"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Vybrané datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Přepnout na výběr roku"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Přepnout na výběr dne"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Přejít na další měsíc"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Přejít na předchozí měsíc"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-da/strings.xml b/compose/material3/material3/src/androidMain/res/values-da/strings.xml
index c455775..4c9bcda 100644
--- a/compose/material3/material3/src/androidMain/res/values-da/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-da/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Afvis"</string>
     <string name="search" msgid="8595876902241072592">"Søg"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Forslag nedenfor"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Vælg dato"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Valgt dato"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Skift til valg af år"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Skift til valg af dag"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Skift til næste måned"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Skift til forrige måned"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-de/strings.xml b/compose/material3/material3/src/androidMain/res/values-de/strings.xml
index 372ac72..d86213e 100644
--- a/compose/material3/material3/src/androidMain/res/values-de/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-de/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Ablehnen"</string>
     <string name="search" msgid="8595876902241072592">"Suchen"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Vorschläge unten"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Datum auswählen"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Ausgewähltes Datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Zur Jahresauswahl wechseln"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Zur Tagesauswahl wechseln"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Zum nächsten Monat wechseln"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Zum vorherigen Monat wechseln"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-el/strings.xml b/compose/material3/material3/src/androidMain/res/values-el/strings.xml
index 9a8ed40..03afa6e 100644
--- a/compose/material3/material3/src/androidMain/res/values-el/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-el/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Παράβλεψη"</string>
     <string name="search" msgid="8595876902241072592">"Αναζήτηση"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Προτάσεις παρακάτω"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Επιλογή ημερομηνίας"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Επιλεγμένη ημερομηνία"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Εναλλαγή σε επιλογή έτους"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Εναλλαγή σε επιλογή ημερομηνίας"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Αλλαγή στον επόμενο μήνα"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Αλλαγή στον προηγούμενο μήνα"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml
index 0ebd7ad..d4ff0a6 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Dismiss"</string>
     <string name="search" msgid="8595876902241072592">"Search"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggestions below"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Select date"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Selected date"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Switch to selecting a year"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Switch to selecting a day"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Change to next month"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Change to previous month"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml
index c643bb3..adbcb28 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Dismiss"</string>
     <string name="search" msgid="8595876902241072592">"Search"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggestions below"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Select date"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Selected date"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Switch to selecting a year"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Switch to selecting a day"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Change to next month"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Change to previous month"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml
index 0ebd7ad..d4ff0a6 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Dismiss"</string>
     <string name="search" msgid="8595876902241072592">"Search"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggestions below"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Select date"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Selected date"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Switch to selecting a year"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Switch to selecting a day"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Change to next month"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Change to previous month"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml
index 0ebd7ad..d4ff0a6 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Dismiss"</string>
     <string name="search" msgid="8595876902241072592">"Search"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggestions below"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Select date"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Selected date"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Switch to selecting a year"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Switch to selecting a day"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Change to next month"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Change to previous month"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml
index 0af22b0..5e13b3d 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‎Dismiss‎‏‎‎‏‎"</string>
     <string name="search" msgid="8595876902241072592">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎Search‎‏‎‎‏‎"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎Suggestions below‎‏‎‎‏‎"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎Select date‎‏‎‎‏‎"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎Selected date‎‏‎‎‏‎"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎Switch to selecting a year‎‏‎‎‏‎"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎Switch to selecting a day‎‏‎‎‏‎"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎Change to next month‎‏‎‎‏‎"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎Change to previous month‎‏‎‎‏‎"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml b/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml
index c540528..972a8f1 100644
--- a/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Descartar"</string>
     <string name="search" msgid="8595876902241072592">"Buscar"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugerencias a continuación"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Seleccionar fecha"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Fecha seleccionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Cambiar a seleccionar un año"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Cambiar a seleccionar un día"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Cambiar al mes siguiente"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Cambiar al mes anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-es/strings.xml b/compose/material3/material3/src/androidMain/res/values-es/strings.xml
index 6d649b9..3a866ce 100644
--- a/compose/material3/material3/src/androidMain/res/values-es/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-es/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Cerrar"</string>
     <string name="search" msgid="8595876902241072592">"Buscar"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugerencias a continuación"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Seleccionar fecha"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Fecha seleccionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Cambiar para seleccionar un año"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Cambiar para seleccionar un día"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Cambiar al mes siguiente"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Cambiar al mes anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-et/strings.xml b/compose/material3/material3/src/androidMain/res/values-et/strings.xml
index b51e1bd..9106900 100644
--- a/compose/material3/material3/src/androidMain/res/values-et/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-et/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Loobu"</string>
     <string name="search" msgid="8595876902241072592">"Otsing"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Soovitused on allpool"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Valige kuupäev"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Valitud kuupäev"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Lülitu aasta valimisele"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Lülitu päeva valimisele"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Vaheta järgmisele kuule"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Vaheta eelmisele kuule"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-eu/strings.xml b/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
index bde3c8d..2c4a279 100644
--- a/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Baztertu"</string>
     <string name="search" msgid="8595876902241072592">"Bilatu"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Iradokizunak daude behean"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Hautatu data bat"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Hautatutako data"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Joan urte-hautatzailera"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Joan egun-hautatzailera"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Aldatu hurrengo hilabetera"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Aldatu aurreko hilabetera"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fa/strings.xml b/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
index 1249b6d..a678350 100644
--- a/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"رد شدن"</string>
     <string name="search" msgid="8595876902241072592">"جستجو"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"پیشنهادهای زیر"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"انتخاب تاریخ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"تاریخ انتخابی"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"رفتن به انتخاب سال"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"رفتن به انتخاب روز"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"تغییر به ماه بعدی"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"تغییر به ماه قبلی"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fi/strings.xml b/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
index 8ff4f5c..490bd84 100644
--- a/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Hylkää"</string>
     <string name="search" msgid="8595876902241072592">"Haku"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Ehdotuksia alla"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Valitse päivämäärä"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Valittu päivämäärä"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Vaihda vuoden valintaan"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Vaihda päivämäärän valintaan"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Vaihda seuraavaan kuukauteen"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Vaihda edelliseen kuukauteen"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml b/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml
index 9692366..e4d5587 100644
--- a/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Fermer"</string>
     <string name="search" msgid="8595876902241072592">"Recherche"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggestions ci-dessous"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Sélectionnez une date"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Date sélectionnée"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Passer à la sélection d\'une année"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Passer à la sélection d\'un jour"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Passer au mois suivant"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Passer au mois précédent"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fr/strings.xml b/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
index 5421e54..0cb1010 100644
--- a/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Ignorer"</string>
     <string name="search" msgid="8595876902241072592">"Rechercher"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggestions ci-dessous"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Sélectionner une date"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Date sélectionnée"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Passer à la sélection d\'une année"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Passer à la sélection d\'un jour"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Passer au mois suivant"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Passer au mois précédent"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-gl/strings.xml b/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
index 88e0ebb..ca68328 100644
--- a/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Pechar"</string>
     <string name="search" msgid="8595876902241072592">"Buscar"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Hai suxestións abaixo"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Selecciona a data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data seleccionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Cambiar a seleccionar un ano"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Cambiar a seleccionar un día"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Cambiar ao mes seguinte"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Cambiar ao mes anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-gu/strings.xml b/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
index 80c8ec2..55997a2 100644
--- a/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"છોડી દો"</string>
     <string name="search" msgid="8595876902241072592">"શોધો"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"સૂચનો નીચે છે"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"તારીખ પસંદ કરો"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"પસંદ કરેલી તારીખ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"વર્ષ પસંદ કરવાના વિકલ્પ પર સ્વિચ કરો"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"દિવસ પસંદ કરવાના વિકલ્પ પર સ્વિચ કરો"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"બદલીને આગલો મહિનો પસંદ કરો"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"બદલીને પાછલો મહિનો પસંદ કરો"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hi/strings.xml b/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
index 8185ee3..d8ded33 100644
--- a/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"खारिज करें"</string>
     <string name="search" msgid="8595876902241072592">"खोजें"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"सुझाव यहां मौजूद हैं"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"तारीख चुनें"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"चुनी गई तारीख"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"साल चुनने के लिए स्विच करें"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"दिन चुनने के लिए स्विच करें"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"अगले महीने पर जाएं"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"पिछले महीने पर जाएं"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hr/strings.xml b/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
index 67cf697..f2bb389 100644
--- a/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Odbaci"</string>
     <string name="search" msgid="8595876902241072592">"Pretraživanje"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Prijedlozi su u nastavku"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Odaberite datum"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Odabrani datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Prijelaz na odabir godine"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Prijelaz na odabir dana"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Pomicanje na sljedeći mjesec"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Pomicanje na prethodni mjesec"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hu/strings.xml b/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
index 680ce87..248168e 100644
--- a/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Elvetés"</string>
     <string name="search" msgid="8595876902241072592">"Keresés"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Javaslatok alább"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Dátum kiválasztása"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Kiválasztott dátum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Váltson a kívánt év kiválasztásához"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Váltson a kívánt nap kiválasztásához"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Váltás a következő hónapra"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Váltás az előző hónapra"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hy/strings.xml b/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
index 6619cdb..34a1312 100644
--- a/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Փակել"</string>
     <string name="search" msgid="8595876902241072592">"Որոնել"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Առաջարկները հասանելի են ստորև"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Ընտրեք ամսաթիվը"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Ընտրված ամսաթիվ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Անցնել տարվա ընտրությանը"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Անցնել օրվա ընտրությանը"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Անցնել հաջորդ ամսվան"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Անցնել նախորդ ամսվան"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-in/strings.xml b/compose/material3/material3/src/androidMain/res/values-in/strings.xml
index 501db84..1edfa948 100644
--- a/compose/material3/material3/src/androidMain/res/values-in/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-in/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Tutup"</string>
     <string name="search" msgid="8595876902241072592">"Telusuri"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Saran di bawah"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Pilih tanggal"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Tanggal yang dipilih"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Beralih ke memilih tahun"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Beralih ke memilih hari"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Ubah ke bulan berikutnya"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Ubah ke bulan sebelumnya"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-is/strings.xml b/compose/material3/material3/src/androidMain/res/values-is/strings.xml
index e81a201..037f206 100644
--- a/compose/material3/material3/src/androidMain/res/values-is/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-is/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Hunsa"</string>
     <string name="search" msgid="8595876902241072592">"Leita"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Tillögur hér fyrir neðan"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Velja dagsetningu"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Valin dagsetning"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Skipta yfir í val á ári"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Skipta yfir í val á dagsetningu"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Breyta í næsta mánuð"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Breyta í fyrri mánuð"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-it/strings.xml b/compose/material3/material3/src/androidMain/res/values-it/strings.xml
index 174e30e..690d277 100644
--- a/compose/material3/material3/src/androidMain/res/values-it/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-it/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Chiudi"</string>
     <string name="search" msgid="8595876902241072592">"Cerca"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggerimenti sotto"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Seleziona data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data selezionata"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Passa alla selezione di un anno"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Passa alla selezione di un giorno"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Passa al mese successivo"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Passa al mese precedente"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-iw/strings.xml b/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
index b61cbcd..8b653f1 100644
--- a/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"סגירה"</string>
     <string name="search" msgid="8595876902241072592">"חיפוש"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"הצעות מופיעות למטה"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"בחירת תאריך"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"התאריך הנבחר"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"החלפה לבחירה של שנה"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"החלפה לבחירה של יום"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"מעבר לחודש הבא"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"מעבר לחודש הקודם"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ja/strings.xml b/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
index e2da645..272f0b3 100644
--- a/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
@@ -23,4 +23,16 @@
     <string name="dismiss" msgid="1461218791585306270">"閉じる"</string>
     <string name="search" msgid="8595876902241072592">"検索"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"検索候補は次のとおりです"</string>
+    <!-- no translation found for date_picker_title (9208721003668059792) -->
+    <skip />
+    <!-- no translation found for date_picker_headline (2846784065735639969) -->
+    <skip />
+    <!-- no translation found for date_picker_switch_to_year_selection (3412370019845183965) -->
+    <skip />
+    <!-- no translation found for date_picker_switch_to_day_selection (5820832733264067677) -->
+    <skip />
+    <!-- no translation found for date_picker_switch_to_next_month (8313783187901412102) -->
+    <skip />
+    <!-- no translation found for date_picker_switch_to_previous_month (7596294429748914881) -->
+    <skip />
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ka/strings.xml b/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
index 122d7bf..2d049d1 100644
--- a/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"დახურვა"</string>
     <string name="search" msgid="8595876902241072592">"ძიება"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"შემოთავაზებები იხილეთ ქვემოთ"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"აირჩიეთ თარიღი"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"არჩეული თარიღი"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"წლის არჩევაზე გადასვლა"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"დღის არჩევაზე გადასვლა"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"შემდეგ თვეზე გადასვლა"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"წინა თვეზე გადასვლა"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-kk/strings.xml b/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
index 2c4fcf5..c919e76 100644
--- a/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Жабу"</string>
     <string name="search" msgid="8595876902241072592">"Іздеу"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Төмендегі ұсыныстар"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Күн таңдау"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Таңдалған күн"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Жыл таңдауға өту"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Күн таңдауға өту"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Келесі айға өзгерту"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Алдыңғы айға өзгерту"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-km/strings.xml b/compose/material3/material3/src/androidMain/res/values-km/strings.xml
index 9486050..d9840e17 100644
--- a/compose/material3/material3/src/androidMain/res/values-km/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-km/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ច្រានចោល"</string>
     <string name="search" msgid="8595876902241072592">"ស្វែងរក"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"ការណែនាំខាងក្រោម"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ជ្រើសរើស​កាលបរិច្ឆេទ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"កាលបរិច្ឆេទដែលបាន​ជ្រើសរើស"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ប្ដូរទៅ​ការជ្រើសរើសឆ្នាំ"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ប្ដូរទៅ​ការជ្រើសរើសថ្ងៃ"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ប្ដូរ​ទៅ​ខែបន្ទាប់"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ប្ដូរ​ទៅ​ខែមុន"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-kn/strings.xml b/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
index 958c9a6d..1d0145e 100644
--- a/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ವಜಾಗೊಳಿಸಿ"</string>
     <string name="search" msgid="8595876902241072592">"ಹುಡುಕಿ"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"ಸಲಹೆಗಳನ್ನು ಕೆಳಗೆ ನೀಡಲಾಗಿದೆ"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"ದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ವರ್ಷವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಬದಲಿಸಿ"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ದಿನವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಬದಲಿಸಿ"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ಮುಂದಿನ ತಿಂಗಳಿಗೆ ಬದಲಿಸಿ"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ಹಿಂದಿನ ತಿಂಗಳಿಗೆ ಬದಲಿಸಿ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ko/strings.xml b/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
index 6d771e5..361bac5 100644
--- a/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"닫기"</string>
     <string name="search" msgid="8595876902241072592">"검색"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"아래의 추천 검색어"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"날짜 선택"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"선택한 날짜"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"연도 선택으로 전환"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"일자 선택으로 전환"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"다음 달로 변경"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"이전 달로 변경"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ky/strings.xml b/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
index b402d6d..0d3bfa9 100644
--- a/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Четке кагуу"</string>
     <string name="search" msgid="8595876902241072592">"Издөө"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Сунуштар төмөндө келтирилди"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Күндү тандоо"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Тандалган күн"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Жыл тандоого которулуу"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Күн тандоого которулуу"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Кийинки айга өзгөртүү"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Мурунку айга өзгөртүү"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-lo/strings.xml b/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
index 5c33bd9..3c06f84 100644
--- a/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ປິດໄວ້"</string>
     <string name="search" msgid="8595876902241072592">"ຊອກຫາ"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"ການແນະນຳຢູ່ຂ້າງລຸ່ມ"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ເລືອກວັນທີ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"ວັນທີທີ່ເລືອກໄວ້"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ປ່ຽນໄປເລືອກປີ"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ປ່ຽນໄປເລືອກມື້"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ປ່ຽນເປັນເດືອນຕໍ່ໄປ"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ປ່ຽນເປັນເດືອນຜ່ານມາ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-lt/strings.xml b/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
index 5423db9..da08acd 100644
--- a/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Atsisakyti"</string>
     <string name="search" msgid="8595876902241072592">"Paieška"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Pasiūlymai pateikti toliau"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Pasirinkite datą"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Pasirinkta data"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Perjungti į metų pasirinkimą"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Perjungti į dienos pasirinkimą"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Pakeisti į kitą mėnesį"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Pakeisti į ankstesnį mėnesį"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-lv/strings.xml b/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
index 6184942..ded3c32 100644
--- a/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Noraidīt"</string>
     <string name="search" msgid="8595876902241072592">"Meklēšana"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Tālāk ir sniegti ieteikumi"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Atlasīt datumu"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Atlasītais datums"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Pāriet uz gada atlasi"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Pāriet uz dienas atlasi"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Mainīt uz nākamo mēnesi"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Mainīt uz iepriekšējo mēnesi"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-mk/strings.xml b/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
index 72dd898..473d9ba 100644
--- a/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Отфрли"</string>
     <string name="search" msgid="8595876902241072592">"Пребарување"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Предлозите се наведени подолу"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Изберете датум"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Избран датум"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Префрли на бирање година"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Префрли на бирање ден"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Промени на следниот месец"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Промени на претходниот месец"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ml/strings.xml b/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
index 5cf71a9..894966d 100644
--- a/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ഡിസ്‌മിസ് ചെയ്യുക"</string>
     <string name="search" msgid="8595876902241072592">"തിരയുക"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"നിദ്ദേശങ്ങൾ ചുവടെയുണ്ട്"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"തീയതി തിരഞ്ഞെടുക്കുക"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"തിരഞ്ഞെടുത്ത തീയതി"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"വർഷം തിരഞ്ഞെടുക്കുന്നതിലേക്ക് മാറുക"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ദിവസം തിരഞ്ഞെടുക്കുന്നതിലേക്ക് മാറുക"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"അടുത്ത മാസത്തിലേക്ക് മാറ്റുക"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"മുമ്പത്തെ മാസത്തിലേക്ക് മാറ്റുക"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-mn/strings.xml b/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
index 709a2e1..6726d22 100644
--- a/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Хаах"</string>
     <string name="search" msgid="8595876902241072592">"Хайлт"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Доорх зөвлөмжүүд"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Огноо сонгох"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Сонгосон огноо"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Жил сонгох руу сэлгэх"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Өдөр сонгох руу сэлгэх"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Дараагийн сар луу өөрчлөх"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Өмнөх сар луу өөрчлөх"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-mr/strings.xml b/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
index 26dc2fb..843cbab 100644
--- a/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"डिसमिस करा"</string>
     <string name="search" msgid="8595876902241072592">"शोधा"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"सूचना खाली आहेत"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"तारीख निवडा"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"निवडलेली तारीख"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"वर्ष निवडणे वर स्विच करा"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"दिवस निवडणे वर स्विच करा"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"पुढील महिन्यावर बदला"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"मागील महिन्यावर बदला"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ms/strings.xml b/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
index 0ab9a35..c06ad24 100644
--- a/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Ketepikan"</string>
     <string name="search" msgid="8595876902241072592">"Carian"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Cadangan di bawah"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Pilih tarikh"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Tarikh dipilih"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Beralih kepada pemilihan tahun"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Beralih kepada pemilihan hari"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Tukar kepada bulan seterusnya"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Tukar kepada bulan sebelumnya"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-my/strings.xml b/compose/material3/material3/src/androidMain/res/values-my/strings.xml
index 1d05641..c9f7272 100644
--- a/compose/material3/material3/src/androidMain/res/values-my/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-my/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ပယ်ရန်"</string>
     <string name="search" msgid="8595876902241072592">"ရှာရန်"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"အကြံပြုချက်များ အောက်တွင်ရှိသည်"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ရက်စွဲရွေးရန်"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"ရွေးထားသည့် ရက်စွဲ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"နှစ်ရွေးခြင်းသို့ ပြောင်းရန်"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ရက်ရွေးခြင်းသို့ ပြောင်းရန်"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"နောက်လသို့ ပြောင်းရန်"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ယခင်လသို့ ပြောင်းရန်"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-nb/strings.xml b/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
index ac14bdc..1b20120 100644
--- a/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Lukk"</string>
     <string name="search" msgid="8595876902241072592">"Søk"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Du finner forslag nedenfor"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Velg dato"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Valgt dato"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Bytt til å velge et år"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Bytt til å velge en dag"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Endre til neste måned"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Endre til forrige måned"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ne/strings.xml b/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
index 7067053..c099435 100644
--- a/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"हटाउनुहोस्"</string>
     <string name="search" msgid="8595876902241072592">"खोज्नुहोस्"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"सुझावहरू तल दिइएका छन्"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"मिति चयन गर्नुहोस्"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"चयन गरिएको मिति"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"साल चयन गर्ने फिल्डमा जानुहोस्"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"दिन चयन गर्ने फिल्डमा जानुहोस्"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"हाल चयन गरिएको महिना परिवर्तन गरी आगामी महिना बनाउनुहोस्"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"हाल चयन गरिएको महिना परिवर्तन गरी अघिल्लो महिना बनाउनुहोस्"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-nl/strings.xml b/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
index 905d0b7..ca7c80a 100644
--- a/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Sluiten"</string>
     <string name="search" msgid="8595876902241072592">"Zoeken"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Suggesties hieronder"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Datum selecteren"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Geselecteerde datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Schakelaar om een jaar te selecteren"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Schakelaar om een dag te selecteren"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Naar volgende maand gaan"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Naar vorige maand gaan"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-or/strings.xml b/compose/material3/material3/src/androidMain/res/values-or/strings.xml
index 10a68ce..afac4e3 100644
--- a/compose/material3/material3/src/androidMain/res/values-or/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-or/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ଖାରଜ କରନ୍ତୁ"</string>
     <string name="search" msgid="8595876902241072592">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"ପରାମର୍ଶ ତଳେ ଦିଆଯାଇଛି"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ତାରିଖ ଚୟନ କରନ୍ତୁ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"ଚୟନିତ ତାରିଖ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ବର୍ଷ ଚୟନ କରିବାକୁ ସ୍ୱିଚ କରନ୍ତୁ"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ଦିନ ଚୟନ କରିବାକୁ ସ୍ୱିଚ କରନ୍ତୁ"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ପରବର୍ତ୍ତୀ ମାସକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ପୂର୍ବବର୍ତ୍ତୀ ମାସକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pa/strings.xml b/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
index eade997..0728c6c 100644
--- a/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ਖਾਰਜ ਕਰੋ"</string>
     <string name="search" msgid="8595876902241072592">"ਖੋਜੋ"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"ਸੁਝਾਅ ਹੇਠਾਂ ਹਨ"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"ਤਾਰੀਖ ਚੁਣੋ"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"ਚੁਣੀ ਗਈ ਤਾਰੀਖ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ਸਾਲ ਚੁਣਨ ਲਈ ਸਵਿੱਚ ਕਰੋ"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ਦਿਨ ਚੁਣਨ ਲਈ ਸਵਿੱਚ ਕਰੋ"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ਅਗਲੇ ਮਹੀਨੇ \'ਤੇ ਜਾਓ"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"ਪਿਛਲੇ ਮਹੀਨੇ \'ਤੇ ਜਾਓ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pl/strings.xml b/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
index 35b55b8..26ee516 100644
--- a/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Zamknij"</string>
     <string name="search" msgid="8595876902241072592">"Szukaj"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Propozycje znajdziesz poniżej"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Wybierz datę"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Wybrana data"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Przełącz na wybór roku"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Przełącz na wybór dnia"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Zmień na następny miesiąc"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Zmień na poprzedni miesiąc"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml b/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml
index 4865a5b..339ab46 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Dispensar"</string>
     <string name="search" msgid="8595876902241072592">"Pesquisa"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugestões abaixo"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Selecionar data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data selecionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Trocar para a seleção de ano"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Trocar para a seleção de dia"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Mudar para o próximo mês"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Mudar para o mês anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml b/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml
index df99251..ab2f38d 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Ignorar"</string>
     <string name="search" msgid="8595876902241072592">"Pesquisar"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugestões abaixo"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Selecionar data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data selecionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Mude para a seleção do ano"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Mude para a seleção do dia"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Mudar para o mês seguinte"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Mudar para o mês anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pt/strings.xml b/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
index 4865a5b..339ab46 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Dispensar"</string>
     <string name="search" msgid="8595876902241072592">"Pesquisa"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugestões abaixo"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Selecionar data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data selecionada"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Trocar para a seleção de ano"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Trocar para a seleção de dia"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Mudar para o próximo mês"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Mudar para o mês anterior"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ro/strings.xml b/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
index 3ac31b7..60335f1 100644
--- a/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Respinge"</string>
     <string name="search" msgid="8595876902241072592">"Caută"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugestii mai jos"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Selectează data"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data selectată"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Comută la selectarea anului"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Comută la selectarea zilei"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Treci la luna următoare"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Treci la luna anterioară"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ru/strings.xml b/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
index 66715a6..656224f 100644
--- a/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Закрыть"</string>
     <string name="search" msgid="8595876902241072592">"Строка поиска"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Подсказки показаны ниже"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Выбор даты"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Выбранная дата"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Перейти к выбору года"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Перейти к выбору дня"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Перейти к следующему месяцу"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Перейти к предыдущему месяцу"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-si/strings.xml b/compose/material3/material3/src/androidMain/res/values-si/strings.xml
index 13c5e56..9d042e5 100644
--- a/compose/material3/material3/src/androidMain/res/values-si/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-si/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"අස් කරන්න"</string>
     <string name="search" msgid="8595876902241072592">"සෙවීම"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"පහත යෝජනා"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"දිනය තෝරන්න"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"තේරූ දිනය"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"වසරක් තේරීමට මාරු වන්න"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"දිනක් තේරීමට මාරු වන්න"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"ලබන මාසයට වෙනස් කරන්න"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"කලින් මාසයට වෙනස් කරන්න"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sk/strings.xml b/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
index d64d152..11cf395 100644
--- a/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Zavrieť"</string>
     <string name="search" msgid="8595876902241072592">"Hľadať"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Návrhy sú nižšie"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Vybrať dátum"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Vybraný dátum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Prepnúť na výber roka"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Prepnúť na výber dňa"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Zmeniť na nasledujúci mesiac"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Zmeniť na predchádzajúci mesiac"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sl/strings.xml b/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
index accf4ea..d7deaad 100644
--- a/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Opusti"</string>
     <string name="search" msgid="8595876902241072592">"Iskanje"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Predlogi so spodaj"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Izbira datuma"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Izbrani datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Preklopi na izbiro leta"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Preklopi na izbiro dneva"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Spremeni na naslednji mesec"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Spremeni na prejšnji mesec"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sq/strings.xml b/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
index f34e2e9..6d9f00d 100644
--- a/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Hiq"</string>
     <string name="search" msgid="8595876902241072592">"Kërko"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Sugjerimet më poshtë"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Zgjidh datën"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Data e zgjedhur"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Kalo te zgjedhja e një viti"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Kalo te zgjedhja e një dite"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Ndrysho te muaji i ardhshëm"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Ndrysho te muaji i kaluar"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sr/strings.xml b/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
index cee26b5..67dba7f 100644
--- a/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Одбаци"</string>
     <string name="search" msgid="8595876902241072592">"Претрага"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Предлози су у наставку"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Изаберите датум"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Изабрани датум"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Пређите на избор године"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Пређите на избор дана"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Пређите на следећи месец"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Пређите на претходни месец"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sv/strings.xml b/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
index 247810c..43fd705 100644
--- a/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Stäng"</string>
     <string name="search" msgid="8595876902241072592">"Sök"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Se förslag nedan"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Välj datum"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Valt datum"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Byt till att välja år"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Byt till att välja dag"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Ändra till nästa månad"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Ändra till föregående månad"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sw/strings.xml b/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
index b1f3221..3c8c90e 100644
--- a/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Ondoa"</string>
     <string name="search" msgid="8595876902241072592">"Tafuta"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Mapendekezo yaliyo hapa chini"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Chagua tarehe"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Tarehe uliyochagua"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Nenda kwenye sehemu ya kuchagua mwaka"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Nenda kwenye sehemu ya kuchagua siku"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Nenda kwenye mwezi unaofuata"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Rudi kwenye mwezi uliotangulia"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ta/strings.xml b/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
index 73ce2c5..86098d5 100644
--- a/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
@@ -20,10 +20,13 @@
     <string name="dialog" msgid="4057925834421392736">"உரையாடல்"</string>
     <string name="expanded" msgid="5974471714631304645">"விரிக்கப்பட்டது"</string>
     <string name="collapsed" msgid="5389587048670450460">"சுருக்கப்பட்டது"</string>
-    <!-- no translation found for dismiss (1461218791585306270) -->
-    <skip />
-    <!-- no translation found for search (8595876902241072592) -->
-    <skip />
-    <!-- no translation found for suggestions_available (7189888345201419934) -->
-    <skip />
+    <string name="dismiss" msgid="1461218791585306270">"மூடும்"</string>
+    <string name="search" msgid="8595876902241072592">"தேடும்"</string>
+    <string name="suggestions_available" msgid="7189888345201419934">"பரிந்துரைகள் கீழே கிடைக்கும்"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"தேதியைத் தேர்ந்தெடுக்கவும்"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"தேர்ந்தெடுக்கப்பட்ட தேதி"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ஆண்டைத் தேர்ந்தெடுக்கும் விருப்பத்திற்கு மாற்று"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"தேதியைத் தேர்ந்தெடுக்கும் விருப்பத்திற்கு மாற்று"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"அடுத்த மாதத்திற்கு மாற்று"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"முந்தைய மாதத்திற்கு மாற்று"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-te/strings.xml b/compose/material3/material3/src/androidMain/res/values-te/strings.xml
index 012ed0c..d3899dc 100644
--- a/compose/material3/material3/src/androidMain/res/values-te/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-te/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"విస్మరించండి"</string>
     <string name="search" msgid="8595876902241072592">"సెర్చ్ చేయండి"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"సూచనలు దిగువున ఉన్నాయి"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"తేదీని ఎంచుకోండి"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"ఎంచుకున్న తేదీ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ఒక సంవత్సరాన్ని ఎంచుకునే ఆప్షన్‌కు మారండి"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"ఒక రోజును ఎంచుకునే ఆప్షన్‌కు మారండి"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"వచ్చే నెలకు మార్చండి"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"మునుపటి నెలకు మార్చండి"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-th/strings.xml b/compose/material3/material3/src/androidMain/res/values-th/strings.xml
index 50e8c44..94a81e4 100644
--- a/compose/material3/material3/src/androidMain/res/values-th/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-th/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"ปิด"</string>
     <string name="search" msgid="8595876902241072592">"ค้นหา"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"มีคำแนะนำที่ด้านล่าง"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"เลือกวันที่"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"วันที่ที่เลือก"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"เปลี่ยนไปที่การเลือกปี"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"เปลี่ยนไปที่การเลือกวัน"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"เปลี่ยนไปที่เดือนถัดไป"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"เปลี่ยนไปที่เดือนก่อนหน้า"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-tl/strings.xml b/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
index a420914..873992f 100644
--- a/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"I-dismiss"</string>
     <string name="search" msgid="8595876902241072592">"Maghanap"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Mga suhestyon sa ibaba"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Pumili ng petsa"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Piniling petsa"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Lumipat sa pagpili ng taon"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Lumipat sa pagpili ng araw"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Lumipat sa susunod na buwan"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Lumipat sa nakaraang buwan"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-tr/strings.xml b/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
index bd16289..404c0f4 100644
--- a/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Kapat"</string>
     <string name="search" msgid="8595876902241072592">"Arama"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Önerileri aşağıda bulabilirsiniz"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Tarih seç"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Seçilen tarih"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Yıl seçimine geç"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Gün seçimine geç"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Sonraki aya değiştir"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Önceki aya değiştir"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-uk/strings.xml b/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
index 6c1191c..9e5cbc2 100644
--- a/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Закрити"</string>
     <string name="search" msgid="8595876902241072592">"Пошук"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Підказки внизу"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Вибрати дату"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Вибрана дата"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Перейти до вибору року"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Перейти до вибору дня"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Перейти до наступного місяця"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Перейти до попереднього місяця"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ur/strings.xml b/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
index fa9dd639..8e99d91 100644
--- a/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"برخاست کریں"</string>
     <string name="search" msgid="8595876902241072592">"تلاش کریں"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"تلاش کی تجاویز نیچے دستیاب ہیں"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"تاریخ منتخب کریں"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"منتخب کردہ تاریخ"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"ایک سال کا انتخاب کرنے کے لیے سوئچ کریں"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"دن منتخب کرنے کے لیے سوئچ کریں"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"اگلے ماہ میں تبدیل کریں"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"گزشتہ ماہ میں منتقل کریں"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-uz/strings.xml b/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
index 59e8616..615b41b 100644
--- a/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Yopish"</string>
     <string name="search" msgid="8595876902241072592">"Qidiruv"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Takliflar quyida"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Sanani tanlang"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Tanlangan sana"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Tanlangan yilga oʻtish"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Tanlangan kunga oʻtish"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Keyingi oyga oʻzgartirish"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Avvalgi oyga oʻzgartirish"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-vi/strings.xml b/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
index 45b6392..6f28932 100644
--- a/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Đóng"</string>
     <string name="search" msgid="8595876902241072592">"Tìm kiếm"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Các đề xuất ở bên dưới"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Chọn ngày"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Ngày đã chọn"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Chuyển sang chọn năm"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Chuyển sang chọn ngày"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Chuyển sang tháng tiếp theo"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Chuyển về tháng trước"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml b/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml
index 2ec0a78..f87282a 100644
--- a/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"关闭"</string>
     <string name="search" msgid="8595876902241072592">"搜索"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"以下是搜索建议"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"选择日期"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"选定的日期"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"切换以选择年份"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"切换以选择日期"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"转到下个月"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"转到上个月"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml b/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml
index f0a4295..8f77fd6 100644
--- a/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"關閉"</string>
     <string name="search" msgid="8595876902241072592">"搜尋"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"建議如下"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"選取日期"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"所選日期"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"切換為選取年份"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"切換為選取日期"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"變更至下個月"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"變更至上個月"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml b/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml
index a66373c..3373d5c 100644
--- a/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"關閉"</string>
     <string name="search" msgid="8595876902241072592">"搜尋"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"建議如下"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"選取日期"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"所選日期"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"改為選取年份"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"改為選取星期幾"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"改成下個月"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"改成上個月"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zu/strings.xml b/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
index 77a92b7..a2276aa 100644
--- a/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
@@ -23,4 +23,10 @@
     <string name="dismiss" msgid="1461218791585306270">"Chitha"</string>
     <string name="search" msgid="8595876902241072592">"Sesha"</string>
     <string name="suggestions_available" msgid="7189888345201419934">"Iziphakamiso ngezansi"</string>
+    <string name="date_picker_title" msgid="9208721003668059792">"Khetha usuku"</string>
+    <string name="date_picker_headline" msgid="2846784065735639969">"Khetha usuku"</string>
+    <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Shintshela ekukhetheni unyaka"</string>
+    <string name="date_picker_switch_to_day_selection" msgid="5820832733264067677">"Shintshela ekukhetheni usuku"</string>
+    <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Shintshela kunyanga elandelayo"</string>
+    <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Shintshela kunyanga edlule"</string>
 </resources>
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/RobolectricIdlingStrategy.android.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/RobolectricIdlingStrategy.android.kt
index 5ff5012..f5896af 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/RobolectricIdlingStrategy.android.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/RobolectricIdlingStrategy.android.kt
@@ -49,6 +49,12 @@
             // Use Java's clock, Android's clock is mocked
             val start = System.currentTimeMillis()
             var iteration = 0
+            // This doesn't just check if compose is idle, it also potentially performs work to try
+            // to get to idle. That work may queue up work on the main queue, so even if compose
+            // reports idle we need to drain the main queue at least one more time to ensure that
+            // is complete. However, we also need to check compose again after draining the queue
+            // since it may have queued up more compose work.
+            var composeIsIdle = composeIdlingResource.isIdleNow
             do {
                 // Check if we hit the timeout
                 if (System.currentTimeMillis() - start >= timeoutMillis) {
@@ -62,14 +68,19 @@
                     )
                 }
                 iteration++
-                // Run Espresso.onIdle() to drain the main message queue
+                // Run Espresso.onIdle() to drain the main message queue. This may queue up more
+                // work for compose, so we need to check if compose is idle one more time.
                 runEspressoOnIdle()
-                // Check if we need a measure/layout pass
+                // Check if we need a measure/layout pass.
                 requestLayoutIfNeeded()
-                // Let ComposeIdlingResource fast-forward compositions
-                val isIdle = composeIdlingResource.isIdleNow
-                // Repeat while not idle
-            } while (!isIdle)
+                // Check if draining the main queue queued up any more compose work. Even if compose
+                // itself reports idle, reading this property queue up work on the main queue, so
+                // always drain it one more time. We only consider compose truly idle if it reported
+                // idle both before and after draining the main queue.
+                val composeWasIdleBeforeDrain = composeIsIdle
+                composeIsIdle = composeIdlingResource.isIdleNow
+                // Repeat while not idle.
+            } while (!(composeIsIdle && composeWasIdleBeforeDrain))
         }
     }
 
diff --git a/compose/ui/ui-test-junit4/src/test/kotlin/androidx/compose/ui/test/junit4/RobolectricComposeTest.kt b/compose/ui/ui-test-junit4/src/test/kotlin/androidx/compose/ui/test/junit4/RobolectricComposeTest.kt
index a29c430..40ec08b 100644
--- a/compose/ui/ui-test-junit4/src/test/kotlin/androidx/compose/ui/test/junit4/RobolectricComposeTest.kt
+++ b/compose/ui/ui-test-junit4/src/test/kotlin/androidx/compose/ui/test/junit4/RobolectricComposeTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.test.junit4
 
+import android.os.Handler
+import android.os.Looper
 import androidx.compose.animation.core.animateFloatAsState
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.LocalOverscrollConfiguration
@@ -33,10 +35,12 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.Button
+import androidx.compose.material.DropdownMenuItem
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -59,6 +63,7 @@
 import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.test.runComposeUiTest
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Popup
 import androidx.test.espresso.AppNotIdleException
 import androidx.test.espresso.IdlingPolicies
 import androidx.test.espresso.IdlingPolicy
@@ -275,4 +280,61 @@
             return 0f
         }
     }
+
+    @Test
+    fun testComposePostsToMainThread() = runComposeUiTest {
+        var postToMain by mutableStateOf(false)
+        var postedToMain by mutableStateOf(false)
+        var composedAfterMain = false
+
+        setContent {
+            if (postToMain && !postedToMain) {
+                DisposableEffect(Unit) {
+                    val handler = Handler(Looper.getMainLooper())
+                    handler.post { postedToMain = true }
+                    onDispose {}
+                }
+            } else if (postedToMain) {
+                DisposableEffect(Unit) {
+                    composedAfterMain = true
+                    onDispose {}
+                }
+            }
+        }
+
+        runOnIdle {
+            assertThat(postedToMain).isFalse()
+            assertThat(composedAfterMain).isFalse()
+        }
+
+        postToMain = true
+
+        runOnIdle {
+            assertThat(postedToMain).isTrue()
+            assertThat(composedAfterMain).isTrue()
+        }
+    }
+
+    @Test
+    fun testWaitForPopupWindow() = runComposeUiTest {
+        var expanded by mutableStateOf(false)
+
+        setContent {
+            Box(Modifier.requiredSize(20.dp)) {
+                if (expanded) {
+                    Popup {
+                        DropdownMenuItem(modifier = Modifier.testTag("MenuContent"), onClick = {}) {
+                            Text("Option 1")
+                        }
+                    }
+                }
+            }
+        }
+
+        onNodeWithTag("MenuContent").assertDoesNotExist()
+
+        expanded = true
+
+        onNodeWithTag("MenuContent").assertIsDisplayed()
+    }
 }
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index aa8aa59..64f1e59 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -1775,6 +1775,17 @@
 package androidx.compose.ui.input.rotary {
 
   public final class RotaryInputModifierKt {
+    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
+  }
+
+  public final class RotaryScrollEvent {
+    method public float getHorizontalScrollPixels();
+    method public long getUptimeMillis();
+    method public float getVerticalScrollPixels();
+    property public final float horizontalScrollPixels;
+    property public final long uptimeMillis;
+    property public final float verticalScrollPixels;
   }
 
 }
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index 5199a29..311f6cb 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -1951,8 +1951,8 @@
 package androidx.compose.ui.input.rotary {
 
   public final class RotaryInputModifierKt {
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
   }
 
   @androidx.compose.ui.ExperimentalComposeUiApi public interface RotaryInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
@@ -1960,7 +1960,7 @@
     method public boolean onRotaryScrollEvent(androidx.compose.ui.input.rotary.RotaryScrollEvent event);
   }
 
-  @androidx.compose.ui.ExperimentalComposeUiApi public final class RotaryScrollEvent {
+  public final class RotaryScrollEvent {
     method public float getHorizontalScrollPixels();
     method public long getUptimeMillis();
     method public float getVerticalScrollPixels();
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index 7d8ccd9..8e347f9 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -1775,6 +1775,17 @@
 package androidx.compose.ui.input.rotary {
 
   public final class RotaryInputModifierKt {
+    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
+  }
+
+  public final class RotaryScrollEvent {
+    method public float getHorizontalScrollPixels();
+    method public long getUptimeMillis();
+    method public float getVerticalScrollPixels();
+    property public final float horizontalScrollPixels;
+    property public final long uptimeMillis;
+    property public final float verticalScrollPixels;
   }
 
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
index 778c1ae..1c940a9 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
@@ -29,6 +29,7 @@
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.filters.FlakyTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -53,6 +54,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun initialInputMode() {
         // Arrange.
         rule.setContentWithInputManager {
@@ -64,6 +66,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun switchToTouchModeProgrammatically() {
         // Arrange.
         rule.setContentWithInputManager {
@@ -92,6 +95,7 @@
 
     @FlakyTest(bugId = 202524920)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun switchToKeyboardModeProgrammatically() {
         // Arrange.
         val testTag = "Box"
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
index 3350d69..6845b6a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
@@ -54,14 +54,12 @@
  * [androidx.compose.ui.input.rotary.RotaryScrollEvent]s, but it is meant to test the generic
  * propagation logic for all focus-aware events.
  */
-@OptIn(ExperimentalComposeUiApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
 class FocusAwareEventPropagationTest(private val nodeType: NodeType) {
     @get:Rule
     val rule = createComposeRule()
 
-    @OptIn(ExperimentalComposeUiApi::class)
     private val sentEvent: Any = when (nodeType) {
         KeyInput ->
             KeyEvent(AndroidKeyEvent(AndroidKeyEvent.ACTION_DOWN, AndroidKeyEvent.KEYCODE_A))
@@ -528,6 +526,7 @@
     }
 
     private fun Modifier.onFocusAwareEvent(onEvent: (Any) -> Boolean): Modifier = this.then(
+        @OptIn(ExperimentalComposeUiApi::class)
         when (nodeType) {
             KeyInput -> modifierElementOf(
                 key = onEvent,
@@ -552,6 +551,7 @@
     )
 
     private fun Modifier.onPreFocusAwareEvent(onEvent: (Any) -> Boolean): Modifier = this.then(
+        @OptIn(ExperimentalComposeUiApi::class)
         when (nodeType) {
             KeyInput -> modifierElementOf(
                 key = onEvent,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt
index 00613cd..2b9168f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEventTest.kt
@@ -25,7 +25,6 @@
 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.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
@@ -48,7 +47,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@OptIn(ExperimentalComposeUiApi::class)
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 class RotaryScrollEventTest {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogTest.kt
index 31b3907..1f5e56a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogTest.kt
@@ -40,6 +40,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import androidx.test.uiautomator.UiDevice
 import com.google.common.truth.Truth
@@ -266,6 +267,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun dialogTest_backHandler_isCalled_backButtonPressed() {
         val clickCountPrefix = "Click: "
 
diff --git a/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml b/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
index 466b1b6..6b0adbe 100644
--- a/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
@@ -17,21 +17,21 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="indeterminate" msgid="7933458017204019916">"Делимично означено"</string>
-    <string name="on" msgid="8655164131929253426">"Укључено"</string>
-    <string name="off" msgid="875452955155264703">"Искључено"</string>
-    <string name="switch_role" msgid="2561197295334830845">"Прекидач"</string>
-    <string name="selected" msgid="6043586758067023">"Изабрано"</string>
-    <string name="not_selected" msgid="6610465462668679431">"Није изабрано"</string>
-    <string name="template_percent" msgid="5946805113151406391">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> посто."</string>
-    <string name="in_progress" msgid="6827826412747255547">"У току"</string>
-    <string name="tab" msgid="1672349317127674378">"Картица"</string>
-    <string name="navigation_menu" msgid="542007171693138492">"Мени за навигацију"</string>
-    <string name="dropdown_menu" msgid="1890207353314751437">"Падајући мени"</string>
-    <string name="close_drawer" msgid="406453423630273620">"Затвори мени за навигацију"</string>
-    <string name="close_sheet" msgid="7573152094250666567">"Затворите табелу"</string>
-    <string name="default_error_message" msgid="8038256446254964252">"Унос је неважећи"</string>
-    <string name="default_popup_window_title" msgid="6312721426453364202">"Искачући прозор"</string>
-    <string name="range_start" msgid="7097486360902471446">"Почетак опсега"</string>
-    <string name="range_end" msgid="5941395253238309765">"Крај опсега"</string>
+    <string name="indeterminate" msgid="7933458017204019916">"Delimično označeno"</string>
+    <string name="on" msgid="8655164131929253426">"Uključeno"</string>
+    <string name="off" msgid="875452955155264703">"Isključeno"</string>
+    <string name="switch_role" msgid="2561197295334830845">"Prekidač"</string>
+    <string name="selected" msgid="6043586758067023">"Izabrano"</string>
+    <string name="not_selected" msgid="6610465462668679431">"Nije izabrano"</string>
+    <string name="template_percent" msgid="5946805113151406391">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> posto."</string>
+    <string name="in_progress" msgid="6827826412747255547">"U toku"</string>
+    <string name="tab" msgid="1672349317127674378">"Kartica"</string>
+    <string name="navigation_menu" msgid="542007171693138492">"Meni za navigaciju"</string>
+    <string name="dropdown_menu" msgid="1890207353314751437">"Padajući meni"</string>
+    <string name="close_drawer" msgid="406453423630273620">"Zatvori meni za navigaciju"</string>
+    <string name="close_sheet" msgid="7573152094250666567">"Zatvorite tabelu"</string>
+    <string name="default_error_message" msgid="8038256446254964252">"Unos je nevažeći"</string>
+    <string name="default_popup_window_title" msgid="6312721426453364202">"Iskačući prozor"</string>
+    <string name="range_start" msgid="7097486360902471446">"Početak opsega"</string>
+    <string name="range_end" msgid="5941395253238309765">"Kraj opsega"</string>
 </resources>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
index ef95e65..b833b6b 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
@@ -20,7 +20,7 @@
     <string name="indeterminate" msgid="7933458017204019916">"部分檢查"</string>
     <string name="on" msgid="8655164131929253426">"已開啟"</string>
     <string name="off" msgid="875452955155264703">"已關閉"</string>
-    <string name="switch_role" msgid="2561197295334830845">"切換按鈕"</string>
+    <string name="switch_role" msgid="2561197295334830845">"切換鈕"</string>
     <string name="selected" msgid="6043586758067023">"已選取"</string>
     <string name="not_selected" msgid="6610465462668679431">"未選取"</string>
     <string name="template_percent" msgid="5946805113151406391">"百分之 <xliff:g id="PERCENTAGE">%1$d</xliff:g>。"</string>
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
index f7574c4..7176b18 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
@@ -160,9 +160,9 @@
         val source = rootFocusNode.findActiveFocusNode() ?: return false
 
         // Check if a custom focus traversal order is specified.
-        return when (val next = source.customFocusSearch(focusDirection, layoutDirection)) {
+        when (val next = source.customFocusSearch(focusDirection, layoutDirection)) {
             @OptIn(ExperimentalComposeUiApi::class)
-            Cancel -> false
+            Cancel -> return false
             Default -> {
                 val foundNextItem =
                     rootFocusNode.focusSearch(focusDirection, layoutDirection) { destination ->
@@ -172,18 +172,11 @@
                         }
                         // If we found a potential next item, move focus to it.
                         destination.requestFocus()
-                        true
                     }
                 // If we didn't find a potential next item, try to wrap around.
-                foundNextItem || wrapAroundFocus(focusDirection)
+                return foundNextItem || wrapAroundFocus(focusDirection)
             }
-            else -> {
-                // TODO(b/175899786): We ideally need to check if the nextFocusRequester points to
-                //  something that is visible and focusable in the current mode (Touch/Non-Touch
-                //  mode).
-                next.requestFocus()
-                true
-            }
+            else -> return next.findFocusTarget { it.requestFocus() } ?: false
         }
     }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt
index 7393f77..9566714 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwner.kt
@@ -82,7 +82,6 @@
     /**
      * Dispatches a rotary scroll event through the compose hierarchy.
      */
-    @OptIn(ExperimentalComposeUiApi::class)
     fun dispatchRotaryEvent(event: RotaryScrollEvent): Boolean
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
index c1d6b0e..6b591e7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
@@ -48,7 +48,7 @@
     fun onPreRotaryScrollEvent(event: RotaryScrollEvent): Boolean
 }
 
-@ExperimentalComposeUiApi
+@OptIn(ExperimentalComposeUiApi::class)
 internal class RotaryInputModifierNodeImpl(
     var onEvent: ((RotaryScrollEvent) -> Boolean)?,
     var onPreEvent: ((RotaryScrollEvent) -> Boolean)?
@@ -81,10 +81,10 @@
  * @sample androidx.compose.ui.samples.PreRotaryEventSample
  */
 @Suppress("ModifierInspectorInfo") // b/251831790.
-@ExperimentalComposeUiApi
 fun Modifier.onRotaryScrollEvent(
     onRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
 ): Modifier = this.then(
+    @OptIn(ExperimentalComposeUiApi::class)
     modifierElementOf(
         key = onRotaryScrollEvent,
         create = { RotaryInputModifierNodeImpl(onEvent = onRotaryScrollEvent, onPreEvent = null) },
@@ -118,10 +118,10 @@
  * @sample androidx.compose.ui.samples.PreRotaryEventSample
  */
 @Suppress("ModifierInspectorInfo") // b/251831790.
-@ExperimentalComposeUiApi
 fun Modifier.onPreRotaryScrollEvent(
     onPreRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
 ): Modifier = this.then(
+    @OptIn(ExperimentalComposeUiApi::class)
     modifierElementOf(
         key = onPreRotaryScrollEvent,
         create = {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
index 732b277..c79101e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryScrollEvent.kt
@@ -16,15 +16,12 @@
 
 package androidx.compose.ui.input.rotary
 
-import androidx.compose.ui.ExperimentalComposeUiApi
-
 /**
  * This event represents a rotary input event.
  *
  * Some Wear OS devices contain a physical rotating side button, or a rotating bezel. When the user
  * turns the button or rotates the bezel, a [RotaryScrollEvent] is sent to the item in focus.
  */
-@ExperimentalComposeUiApi
 class RotaryScrollEvent internal constructor(
     /**
      * The amount to scroll (in pixels) in response to a [RotaryScrollEvent] in a container that
diff --git a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/ConstraintLayoutTest.kt b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/ConstraintLayoutTest.kt
index f525946..1153106 100644
--- a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/ConstraintLayoutTest.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/ConstraintLayoutTest.kt
@@ -1927,6 +1927,76 @@
         )
     }
 
+    @Test
+    fun testLinkToBias_withInlineDsl_rtl() = with(rule.density) {
+        val rootSize = 200
+        val boxSize = 20
+        val box1Bias = 0.2f
+        val box2Bias = 0.2f
+
+        var box1Position = IntOffset.Zero
+        var box2Position = IntOffset.Zero
+        rule.setContent {
+            CompositionLocalProvider(LocalLayoutDirection.provides(LayoutDirection.Rtl)) {
+                ConstraintLayout(Modifier.size(rootSize.toDp())) {
+                    val (box1Ref, box2Ref) = createRefs()
+
+                    Box(
+                        modifier = Modifier
+                            .background(Color.Red)
+                            .constrainAs(box1Ref) {
+                                width = Dimension.value(boxSize.toDp())
+                                height = Dimension.value(boxSize.toDp())
+
+                                centerTo(parent)
+                                horizontalBias = box1Bias // unaffected by Rtl
+                            }
+                            .onGloballyPositioned {
+                                box1Position = it
+                                    .positionInRoot()
+                                    .round()
+                            }
+                    )
+                    Box(
+                        modifier = Modifier
+                            .background(Color.Blue)
+                            .constrainAs(box2Ref) {
+                                width = Dimension.value(boxSize.toDp())
+                                height = Dimension.value(boxSize.toDp())
+
+                                top.linkTo(box1Ref.bottom)
+                                linkTo(
+                                    start = parent.start,
+                                    end = box1Ref.start,
+                                    startMargin = 0.dp,
+                                    endMargin = 0.dp,
+                                    startGoneMargin = 0.dp,
+                                    endGoneMargin = 0.dp,
+                                    bias = box2Bias // affected by Rtl
+                                )
+                            }
+                            .onGloballyPositioned {
+                                box2Position = it
+                                    .positionInRoot()
+                                    .round()
+                            }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            val expectedBox1X = (rootSize - boxSize) * box1Bias
+            val expectedBox1Y = (rootSize * 0.5f) - (boxSize * 0.5f)
+            assertEquals(Offset(expectedBox1X, expectedBox1Y).round(), box1Position)
+
+            val expectedBox1End = expectedBox1X + boxSize
+            val expectedBox2X =
+                (rootSize - expectedBox1End - boxSize) * (1f - box2Bias) + expectedBox1End
+            assertEquals(Offset(expectedBox2X, expectedBox1Y + boxSize).round(), box2Position)
+        }
+    }
+
     private fun listAnchors(box: ConstrainedLayoutReference): List<ConstrainScope.() -> Unit> {
         // TODO(172055763) directly construct an immutable list when Lint supports it
         val anchors = mutableListOf<ConstrainScope.() -> Unit>()
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt
index f11b623..eed1540 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt
@@ -255,7 +255,7 @@
             margin = endMargin,
             goneMargin = endGoneMargin
         )
-        containerObject.putNumber("hBias", bias)
+        containerObject.putNumber("hRtlBias", bias)
     }
 
     /**
diff --git a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java
index da914e6..f482540 100644
--- a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java
+++ b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java
@@ -1490,6 +1490,16 @@
                 value = layoutVariables.get(element.get(attributeName));
                 reference.verticalBias(value);
                 break;
+            case "hRtlBias":
+                // TODO: This is a temporary solution to support bias with start/end constraints,
+                //  where the bias needs to be reversed in RTL, we probably want a better or more
+                //  intuitive way to do this
+                value = layoutVariables.get(element.get(attributeName));
+                if (!state.isLtr()) {
+                    value = 1f - value;
+                }
+                reference.horizontalBias(value);
+                break;
             case "hBias":
                 value = layoutVariables.get(element.get(attributeName));
                 reference.horizontalBias(value);
diff --git a/core/core-appdigest/src/androidTest/java/androidx/core/appdigest/ChecksumsTest.java b/core/core-appdigest/src/androidTest/java/androidx/core/appdigest/ChecksumsTest.java
index 74b5db2..b17233f 100644
--- a/core/core-appdigest/src/androidTest/java/androidx/core/appdigest/ChecksumsTest.java
+++ b/core/core-appdigest/src/androidTest/java/androidx/core/appdigest/ChecksumsTest.java
@@ -308,6 +308,7 @@
 
     @SmallTest
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34 // b/262909049: Failing on SDK 34
     public void testDefaultChecksums() throws Exception {
         checkDefaultChecksums(
                 getChecksums(V2V3_PACKAGE_NAME, true, 0, TRUST_NONE),
@@ -322,7 +323,7 @@
         assertEquals(0, checksums.length);
     }
 
-    @SdkSuppress(minSdkVersion = 29)
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testSplitsDefaultChecksums() throws Exception {
@@ -348,7 +349,7 @@
         assertEquals(0, checksums.length);
     }
 
-    @SdkSuppress(minSdkVersion = 29)
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testSplitsSha256Checksums() throws Exception {
@@ -405,7 +406,7 @@
                 "ce4ad41be1191ab3cdfef09ab6fb3c5d057e15cb3553661b393f770d9149f1cc");
     }
 
-    @SdkSuppress(minSdkVersion = 29)
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testFixedDefaultChecksums() throws Exception {
@@ -430,7 +431,7 @@
         assertEquals(0, checksums.length);
     }
 
-    @SdkSuppress(minSdkVersion = 29)
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testFixedV1DefaultChecksums() throws Exception {
@@ -462,7 +463,7 @@
         assertEquals(0, checksums.length);
     }
 
-    @SdkSuppress(minSdkVersion = 29)
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testFixedSha512DefaultChecksums() throws Exception {
@@ -502,7 +503,7 @@
         assertEquals(0, checksums.length);
     }
 
-    @SdkSuppress(minSdkVersion = 29)
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testFixedVerityDefaultChecksums() throws Exception {
@@ -730,7 +731,7 @@
         InstallerApi31.checkWrittenChecksums(TEST_FIXED_APK_DIGESTS_FILE);
     }
 
-    @SdkSuppress(minSdkVersion = 31)
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testInstallerChecksumsTrustNone() throws Exception {
@@ -766,7 +767,7 @@
         assertEquals(0, checksums.length);
     }
 
-    @SdkSuppress(minSdkVersion = 31)
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testInstallerChecksumsTrustAll() throws Exception {
@@ -841,7 +842,7 @@
         */
     }
 
-    @SdkSuppress(minSdkVersion = 31)
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     @LargeTest
     @Test
     public void testInstallerSignedChecksums() throws Exception {
diff --git a/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java b/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java
index 782cd06..8f35b82 100644
--- a/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java
+++ b/core/core-i18n/src/androidTest/java/androidx/core/i18n/CheckTheJavaApisTest.java
@@ -33,6 +33,7 @@
 import androidx.core.i18n.DateTimeFormatterSkeletonOptions.WeekDay;
 import androidx.core.i18n.DateTimeFormatterSkeletonOptions.Year;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -84,6 +85,7 @@
     }
 
     @Test @SmallTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testSkeletonOptions() {
         final DateTimeFormatterSkeletonOptions.Builder builder =
                 new DateTimeFormatterSkeletonOptions.Builder()
diff --git a/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterCommonOptionsTest.kt b/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterCommonOptionsTest.kt
index 6a67d9f..1ac2699a 100644
--- a/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterCommonOptionsTest.kt
+++ b/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterCommonOptionsTest.kt
@@ -39,6 +39,7 @@
     )
 
     @Test @SmallTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun test() {
         val commonFormats = mapOf(
             DateTimeFormatterCommonOptions.ABBR_MONTH_WEEKDAY_DAY to "Sun, Sep 19",
diff --git a/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt b/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt
index cb0ccc9..d16c736 100644
--- a/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt
+++ b/core/core-i18n/src/androidTest/java/androidx/core/i18n/DateTimeFormatterTest.kt
@@ -96,6 +96,7 @@
     }
 
     @Test @SmallTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun test() {
         val locale = Locale.US
         val options = SkeletonOptions.fromString("yMMMdjms")
@@ -110,6 +111,7 @@
     }
 
     @Test @SmallTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testApi() {
         val builder = SkeletonOptions.Builder()
             .setYear(SkeletonOptions.Year.NUMERIC)
@@ -184,7 +186,10 @@
     }
 
     @Test @SmallTest
-    @SdkSuppress(minSdkVersion = AVAILABLE_LANGUAGE_TAG)
+    @SdkSuppress(
+        minSdkVersion = AVAILABLE_LANGUAGE_TAG,
+        maxSdkVersion = 33 // b/262909049: Failing on SDK 34
+    )
     // Without `Locale.forLanguageTag` we can't even build a locale with `-u-` extension.
     fun testSystemSupportForExtensionU() {
         val enUsForceH11 = Locale.forLanguageTag("en-US-u-hc-h11")
@@ -229,7 +234,10 @@
     }
 
     @Test @SmallTest
-    @SdkSuppress(minSdkVersion = AVAILABLE_LANGUAGE_TAG)
+    @SdkSuppress(
+        minSdkVersion = AVAILABLE_LANGUAGE_TAG,
+        maxSdkVersion = 33 // b/262909049: Failing on SDK 34
+    )
     fun testHourCycleOverrides() {
         val expectedUs12 = "Sep 19, 2021, 9:42:12 PM"
         val expectedUs24 = "Sep 19, 2021, 21:42:12"
@@ -387,6 +395,7 @@
     }
 
     @Test @SmallTest
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testTimeZone() {
         val builder = SkeletonOptions.Builder()
             .setHour(SkeletonOptions.Hour.NUMERIC)
@@ -432,6 +441,7 @@
 
     @Test @SmallTest
     // Making sure the APIs honor the default timezone
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testDefaultTimeZone() {
         val options = SkeletonOptions.Builder()
             .setHour(SkeletonOptions.Hour.NUMERIC)
diff --git a/core/core/build.gradle b/core/core/build.gradle
index b105104..3f464c5 100644
--- a/core/core/build.gradle
+++ b/core/core/build.gradle
@@ -13,7 +13,7 @@
     }
 
     api(projectOrArtifact(":annotation:annotation"))
-    api(projectOrArtifact(":annotation:annotation-experimental"))
+    api("androidx.annotation:annotation-experimental:1.3.0")
     api("androidx.lifecycle:lifecycle-runtime:2.3.1")
     api("androidx.versionedparcelable:versionedparcelable:1.1.1")
     implementation("androidx.collection:collection:1.0.0")
diff --git a/core/core/src/main/res/values-b+sr+Latn/strings.xml b/core/core/src/main/res/values-b+sr+Latn/strings.xml
index acb7df2..ca7b946 100644
--- a/core/core/src/main/res/values-b+sr+Latn/strings.xml
+++ b/core/core/src/main/res/values-b+sr+Latn/strings.xml
@@ -18,11 +18,11 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="status_bar_notification_info_overflow" msgid="6277540029070332960">"999+"</string>
-    <string name="call_notification_answer_action" msgid="881409763997275156">"Одговори"</string>
-    <string name="call_notification_answer_video_action" msgid="8793775615905189152">"Видео"</string>
-    <string name="call_notification_decline_action" msgid="3229508546291798546">"Одбиј"</string>
-    <string name="call_notification_hang_up_action" msgid="2659457946726154263">"Прекини везу"</string>
-    <string name="call_notification_incoming_text" msgid="6107532579223922871">"Долазни позив"</string>
-    <string name="call_notification_ongoing_text" msgid="8623827134497363134">"Позив је у току"</string>
-    <string name="call_notification_screening_text" msgid="59049573811482460">"Проверава се долазни позив"</string>
+    <string name="call_notification_answer_action" msgid="881409763997275156">"Odgovori"</string>
+    <string name="call_notification_answer_video_action" msgid="8793775615905189152">"Video"</string>
+    <string name="call_notification_decline_action" msgid="3229508546291798546">"Odbij"</string>
+    <string name="call_notification_hang_up_action" msgid="2659457946726154263">"Prekini vezu"</string>
+    <string name="call_notification_incoming_text" msgid="6107532579223922871">"Dolazni poziv"</string>
+    <string name="call_notification_ongoing_text" msgid="8623827134497363134">"Poziv je u toku"</string>
+    <string name="call_notification_screening_text" msgid="59049573811482460">"Proverava se dolazni poziv"</string>
 </resources>
diff --git a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/TestUtils.kt b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/TestUtils.kt
index 2e57ee3..996e2ad 100644
--- a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/TestUtils.kt
+++ b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/TestUtils.kt
@@ -16,6 +16,7 @@
 
 package androidx.credentials.playservices
 
+import android.os.Bundle
 import androidx.credentials.playservices.controllers.CreatePublicKeyCredential.PublicKeyCredentialControllerUtility
 import com.google.android.gms.common.ConnectionResult
 import org.json.JSONArray
@@ -103,6 +104,33 @@
             return setValue
         }
 
+        /** True if the two Bundles contain the same elements, and false otherwise. Borrowed from
+         * the credentials package.
+         */
+        @Suppress("DEPRECATION")
+        fun equals(a: Bundle, b: Bundle): Boolean {
+            if (a.keySet().size != b.keySet().size) {
+                return false
+            }
+            for (key in a.keySet()) {
+                if (!b.keySet().contains(key)) {
+                    return false
+                }
+
+                val valA = a.get(key)
+                val valB = b.get(key)
+                if (valA is Bundle && valB is Bundle && !equals(valA, valB)) {
+                    return false
+                } else {
+                    val isEqual = (valA?.equals(valB) ?: (valB == null))
+                    if (!isEqual) {
+                        return false
+                    }
+                }
+            }
+            return true
+        }
+
         @JvmStatic
         val ConnectionResultFailureCases = arrayListOf(
             ConnectionResult.UNKNOWN, ConnectionResult.API_DISABLED, ConnectionResult.CANCELED,
diff --git a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/createpassword/CredentialProviderCreatePasswordControllerJavaTest.java b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/createpassword/CredentialProviderCreatePasswordControllerJavaTest.java
new file mode 100644
index 0000000..7e75793
--- /dev/null
+++ b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/createpassword/CredentialProviderCreatePasswordControllerJavaTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.playservices.createpassword;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.os.Bundle;
+
+import androidx.credentials.CreateCredentialResponse;
+import androidx.credentials.CreatePasswordRequest;
+import androidx.credentials.CreatePasswordResponse;
+import androidx.credentials.playservices.TestCredentialsActivity;
+import androidx.credentials.playservices.TestUtils;
+import androidx.credentials.playservices.controllers.CreatePassword.CredentialProviderCreatePasswordController;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.google.android.gms.auth.api.identity.SignInPassword;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import kotlin.Unit;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class CredentialProviderCreatePasswordControllerJavaTest {
+
+    @Test
+    public void convertResponseToCredentialManager_unitInput_success() {
+        ActivityScenario<TestCredentialsActivity> activityScenario =
+                ActivityScenario.launch(TestCredentialsActivity.class);
+        String expectedResponseType = new CreatePasswordResponse().getType();
+        activityScenario.onActivity(activity -> {
+
+            CreateCredentialResponse actualResponse =
+                    CredentialProviderCreatePasswordController
+                            .getInstance(activity)
+                            .convertResponseToCredentialManager(Unit.INSTANCE);
+
+            assertThat(actualResponse.getType()).isEqualTo(expectedResponseType);
+            assertThat(TestUtils.Companion.equals(actualResponse.getData(), Bundle.EMPTY)).isTrue();
+        });
+    }
+
+    @Test
+    public void convertRequestToPlayServices_createPasswordRequest_success() {
+        ActivityScenario<TestCredentialsActivity> activityScenario =
+                ActivityScenario.launch(TestCredentialsActivity.class);
+        String expectedId = "LM";
+        String expectedPassword = "SodaButton";
+        activityScenario.onActivity(activity -> {
+
+            SignInPassword actualRequest =
+                    CredentialProviderCreatePasswordController
+                            .getInstance(activity)
+                            .convertRequestToPlayServices(new CreatePasswordRequest(
+                                    expectedId, expectedPassword
+                            ))
+                            .getSignInPassword();
+
+            assertThat(actualRequest.getPassword()).isEqualTo(expectedPassword);
+            assertThat(actualRequest.getId()).isEqualTo(expectedId);
+        });
+    }
+
+    @Test
+    public void convertRequestToPlayServices_nullRequest_throws() {
+        ActivityScenario<TestCredentialsActivity> activityScenario =
+                ActivityScenario.launch(TestCredentialsActivity.class);
+        activityScenario.onActivity(activity -> {
+
+            assertThrows(
+                    "null create password request must throw exception",
+                    NullPointerException.class,
+                    () -> CredentialProviderCreatePasswordController
+                            .getInstance(activity)
+                            .convertRequestToPlayServices(null)
+                            .getSignInPassword()
+            );
+        });
+    }
+
+    @Test
+    public void convertResponseToCredentialManager_nullRequest_throws() {
+        ActivityScenario<TestCredentialsActivity> activityScenario =
+                ActivityScenario.launch(TestCredentialsActivity.class);
+        activityScenario.onActivity(activity -> {
+
+            assertThrows(
+                    "null unit response must throw exception",
+                    NullPointerException.class,
+                    () -> CredentialProviderCreatePasswordController
+                            .getInstance(activity)
+                            .convertResponseToCredentialManager(null)
+            );
+        });
+    }
+
+}
diff --git a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/createpassword/CredentialProviderCreatePasswordControllerTest.kt b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/createpassword/CredentialProviderCreatePasswordControllerTest.kt
new file mode 100644
index 0000000..e499bce
--- /dev/null
+++ b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/createpassword/CredentialProviderCreatePasswordControllerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.playservices.createpassword
+
+import android.os.Bundle
+import androidx.credentials.CreatePasswordRequest
+import androidx.credentials.CreatePasswordResponse
+import androidx.credentials.playservices.TestCredentialsActivity
+import androidx.credentials.playservices.TestUtils.Companion.equals
+import androidx.credentials.playservices.controllers.CreatePassword.CredentialProviderCreatePasswordController.Companion.getInstance
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class CredentialProviderCreatePasswordControllerTest {
+    @Test
+    fun convertResponseToCredentialManager_unitInput_success() {
+        val activityScenario = ActivityScenario.launch(
+            TestCredentialsActivity::class.java
+        )
+        val expectedResponseType = CreatePasswordResponse().type
+        activityScenario.onActivity { activity: TestCredentialsActivity? ->
+
+            val actualResponse = getInstance(activity!!)
+                .convertResponseToCredentialManager(Unit)
+
+            assertThat(actualResponse.type)
+                .isEqualTo(expectedResponseType)
+            assertThat(equals(actualResponse.data, Bundle.EMPTY)).isTrue()
+        }
+    }
+
+    @Test
+    fun convertRequestToPlayServices_createPasswordRequest_success() {
+        val activityScenario = ActivityScenario.launch(
+            TestCredentialsActivity::class.java
+        )
+        val expectedId = "LM"
+        val expectedPassword = "SodaButton"
+        activityScenario.onActivity { activity: TestCredentialsActivity? ->
+
+            val actualRequest = getInstance(activity!!)
+                .convertRequestToPlayServices(CreatePasswordRequest(
+                        expectedId, expectedPassword)).signInPassword
+
+            assertThat(actualRequest.password)
+                .isEqualTo(expectedPassword)
+            assertThat(actualRequest.id).isEqualTo(expectedId)
+        }
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/api/current.txt b/credentials/credentials/api/current.txt
index 3ac46f0..dba3b82 100644
--- a/credentials/credentials/api/current.txt
+++ b/credentials/credentials/api/current.txt
@@ -103,6 +103,13 @@
     method public void onResult(R? result);
   }
 
+  public interface CredentialProvider {
+    method public boolean isAvailableOnDevice();
+    method public void onClearCredential(androidx.credentials.ClearCredentialStateRequest request, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<java.lang.Void,androidx.credentials.exceptions.ClearCredentialException> callback);
+    method public void onCreateCredential(androidx.credentials.CreateCredentialRequest request, android.app.Activity activity, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<androidx.credentials.CreateCredentialResponse,androidx.credentials.exceptions.CreateCredentialException> callback);
+    method public void onGetCredential(androidx.credentials.GetCredentialRequest request, android.app.Activity activity, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<androidx.credentials.GetCredentialResponse,androidx.credentials.exceptions.GetCredentialException> callback);
+  }
+
   public class CustomCredential extends androidx.credentials.Credential {
     ctor public CustomCredential(String type, android.os.Bundle data);
     method public final android.os.Bundle getData();
diff --git a/credentials/credentials/api/public_plus_experimental_current.txt b/credentials/credentials/api/public_plus_experimental_current.txt
index 3ac46f0..dba3b82 100644
--- a/credentials/credentials/api/public_plus_experimental_current.txt
+++ b/credentials/credentials/api/public_plus_experimental_current.txt
@@ -103,6 +103,13 @@
     method public void onResult(R? result);
   }
 
+  public interface CredentialProvider {
+    method public boolean isAvailableOnDevice();
+    method public void onClearCredential(androidx.credentials.ClearCredentialStateRequest request, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<java.lang.Void,androidx.credentials.exceptions.ClearCredentialException> callback);
+    method public void onCreateCredential(androidx.credentials.CreateCredentialRequest request, android.app.Activity activity, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<androidx.credentials.CreateCredentialResponse,androidx.credentials.exceptions.CreateCredentialException> callback);
+    method public void onGetCredential(androidx.credentials.GetCredentialRequest request, android.app.Activity activity, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<androidx.credentials.GetCredentialResponse,androidx.credentials.exceptions.GetCredentialException> callback);
+  }
+
   public class CustomCredential extends androidx.credentials.Credential {
     ctor public CustomCredential(String type, android.os.Bundle data);
     method public final android.os.Bundle getData();
diff --git a/credentials/credentials/api/restricted_current.txt b/credentials/credentials/api/restricted_current.txt
index 3ac46f0..dba3b82 100644
--- a/credentials/credentials/api/restricted_current.txt
+++ b/credentials/credentials/api/restricted_current.txt
@@ -103,6 +103,13 @@
     method public void onResult(R? result);
   }
 
+  public interface CredentialProvider {
+    method public boolean isAvailableOnDevice();
+    method public void onClearCredential(androidx.credentials.ClearCredentialStateRequest request, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<java.lang.Void,androidx.credentials.exceptions.ClearCredentialException> callback);
+    method public void onCreateCredential(androidx.credentials.CreateCredentialRequest request, android.app.Activity activity, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<androidx.credentials.CreateCredentialResponse,androidx.credentials.exceptions.CreateCredentialException> callback);
+    method public void onGetCredential(androidx.credentials.GetCredentialRequest request, android.app.Activity activity, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Executor executor, androidx.credentials.CredentialManagerCallback<androidx.credentials.GetCredentialResponse,androidx.credentials.exceptions.GetCredentialException> callback);
+  }
+
   public class CustomCredential extends androidx.credentials.Credential {
     ctor public CustomCredential(String type, android.os.Bundle data);
     method public final android.os.Bundle getData();
diff --git a/credentials/credentials/src/main/java/androidx/credentials/CredentialProvider.kt b/credentials/credentials/src/main/java/androidx/credentials/CredentialProvider.kt
index 7d811b0..49085d8 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/CredentialProvider.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CredentialProvider.kt
@@ -45,8 +45,6 @@
  * <p>For SDK version 34 and above, this interface will only be implemented by an internal
  * class that will route all requests to the android framework. Providers will need
  * to register directly with the framework to provide credentials.
- *
- * @hide
  */
 interface CredentialProvider {
     /**
diff --git a/credentials/credentials/src/main/res/values-am/strings.xml b/credentials/credentials/src/main/res/values-am/strings.xml
new file mode 100644
index 0000000..becd4e28
--- /dev/null
+++ b/credentials/credentials/src/main/res/values-am/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"የይለፍ ቁልፍ"</string>
+    <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"የይለፍ ቃል"</string>
+</resources>
diff --git a/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml b/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml
index 0e0be5e..9cf1ec4 100644
--- a/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml
+++ b/credentials/credentials/src/main/res/values-b+sr+Latn/strings.xml
@@ -17,6 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Приступни кôд"</string>
-    <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"Лозинка"</string>
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"Pristupni kôd"</string>
+    <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"Lozinka"</string>
 </resources>
diff --git a/credentials/credentials/src/main/res/values-iw/strings.xml b/credentials/credentials/src/main/res/values-iw/strings.xml
new file mode 100644
index 0000000..3ddedd6
--- /dev/null
+++ b/credentials/credentials/src/main/res/values-iw/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"מפתח גישה"</string>
+    <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"סיסמה"</string>
+</resources>
diff --git a/credentials/credentials/src/main/res/values-zh-rHK/strings.xml b/credentials/credentials/src/main/res/values-zh-rHK/strings.xml
index 884239a..6111c53 100644
--- a/credentials/credentials/src/main/res/values-zh-rHK/strings.xml
+++ b/credentials/credentials/src/main/res/values-zh-rHK/strings.xml
@@ -17,6 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"密碼金鑰"</string>
+    <string name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" msgid="3929015085059320822">"密鑰"</string>
     <string name="android.credentials.TYPE_PASSWORD_CREDENTIAL" msgid="8397015543330865059">"密碼"</string>
 </resources>
diff --git a/datastore/datastore/build.gradle b/datastore/datastore/build.gradle
index bf52132..d450a9b 100644
--- a/datastore/datastore/build.gradle
+++ b/datastore/datastore/build.gradle
@@ -69,6 +69,9 @@
         }
         androidMain {
             dependsOn(jvmMain)
+            dependencies {
+                implementation(libs.okio)
+            }
         }
         androidAndroidTest {
             dependsOn(jvmTest)
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index d780eaa..838954d 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -737,6 +737,7 @@
 \^
 # Gradle will log if you are not authenticated to upload scans
 A build scan was not published as you have not authenticated with server 'ge\.androidx\.dev'\.
+For more information, please see https://gradle\.com/help/gradle\-authenticating\-with\-gradle\-enterprise\.
 # Room unresolved type error messages
 Found an unresolved type in androidx\.room\.RoomDatabase\.Builder\$createFromAsset\(kotlin\.String\) \(RoomDatabase\.kt:[0-9]+\)
 Found an unresolved type in androidx\.room\.RoomDatabase\.Builder\$createFromAsset\(kotlin\.String\,\ androidx\.room\.RoomDatabase\.PrepackagedDatabaseCallback\) \(RoomDatabase\.kt:[0-9]+\)
diff --git a/development/importMaven/src/main/kotlin/androidx/build/importMaven/ArtifactResolver.kt b/development/importMaven/src/main/kotlin/androidx/build/importMaven/ArtifactResolver.kt
index bb160a2..231694c 100644
--- a/development/importMaven/src/main/kotlin/androidx/build/importMaven/ArtifactResolver.kt
+++ b/development/importMaven/src/main/kotlin/androidx/build/importMaven/ArtifactResolver.kt
@@ -56,6 +56,8 @@
         "https://maven.pkg.jetbrains.space/public/p/compose/dev"
     )
 
+    internal val gradlePluginPortalRepo = "https://plugins.gradle.org/m2/"
+
     internal fun createAndroidXRepo(
         buildId: Int
     ) = "https://androidx.dev/snapshots/builds/$buildId/artifacts/repository"
@@ -170,7 +172,7 @@
                     "Resolved files: ${result.size}"
                 }
                 check(result.isNotEmpty()) {
-                    "Didn't resolve any artifacts from $artifacts"
+                    "Didn't resolve any artifacts from $artifacts . Try --verbose for more information"
                 }
                 result.forEach { artifact ->
                     logger.trace {
@@ -245,6 +247,7 @@
             val repoUrls = additionalPriorityRepositories + listOf(
                 RepositoryHandler.GOOGLE_URL,
                 RepositoryHandler.MAVEN_CENTRAL_URL,
+                gradlePluginPortalRepo
             )
             return MavenRepositoryProxy.startAll(
                 repositoryUrls = repoUrls,
@@ -436,4 +439,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/development/importMaven/src/main/kotlin/androidx/build/importMaven/MavenRepositoryProxy.kt b/development/importMaven/src/main/kotlin/androidx/build/importMaven/MavenRepositoryProxy.kt
index a7d13e5..85568ab 100644
--- a/development/importMaven/src/main/kotlin/androidx/build/importMaven/MavenRepositoryProxy.kt
+++ b/development/importMaven/src/main/kotlin/androidx/build/importMaven/MavenRepositoryProxy.kt
@@ -66,9 +66,10 @@
             routing {
                 get("/{...}") {
                     val path = this.call.request.path()
+                    val displayUrl = "$delegateHost$path"
                     val incomingHeaders = this.call.request.headers
                     logger.trace {
-                        "Request($path)"
+                        "Request ($displayUrl)"
                     }
 
                     try {
@@ -83,12 +84,12 @@
                             status = clientResponse.status
                         ).also {
                             logger.trace {
-                                "Success ($path)"
+                                "Success ($displayUrl)"
                             }
                         }
                     } catch (ex: Throwable) {
                         logger.error(ex) {
-                            "Failed ($path): ${ex.message}"
+                            "Failed ($displayUrl): ${ex.message}"
                         }
                         throw ex
                     }
@@ -190,4 +191,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/dynamicanimation/dynamicanimation/src/androidTest/java/androidx/dynamicanimation/tests/SpringTests.java b/dynamicanimation/dynamicanimation/src/androidTest/java/androidx/dynamicanimation/tests/SpringTests.java
index 8548a1f..ae48994 100644
--- a/dynamicanimation/dynamicanimation/src/androidTest/java/androidx/dynamicanimation/tests/SpringTests.java
+++ b/dynamicanimation/dynamicanimation/src/androidTest/java/androidx/dynamicanimation/tests/SpringTests.java
@@ -874,7 +874,7 @@
     }
 
     @Test
-    @SdkSuppress(minSdkVersion = 33)
+    @SdkSuppress(minSdkVersion = 33, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testDurationScaleChangeListener() throws InterruptedException {
         final SpringAnimation anim = new SpringAnimation(mView1, DynamicAnimation.Y, 0f);
         final CountDownLatch registerUnregisterLatch = new CountDownLatch(2);
diff --git a/emoji2/emoji2-emojipicker/build.gradle b/emoji2/emoji2-emojipicker/build.gradle
index 9a9292c..17422f1 100644
--- a/emoji2/emoji2-emojipicker/build.gradle
+++ b/emoji2/emoji2-emojipicker/build.gradle
@@ -28,10 +28,8 @@
     implementation("androidx.core:core-ktx:1.8.0")
     implementation project(path: ':emoji2:emoji2')
     implementation project(path: ':core:core')
-    implementation 'androidx.recyclerview:recyclerview:1.2.1'
     implementation 'androidx.appcompat:appcompat:1.5.1'
-    implementation 'androidx.tracing:tracing-ktx:1.0.0'
-    implementation 'androidx.test.ext:junit-ktx:1.1.3'
+    implementation 'androidx.recyclerview:recyclerview:1.2.1'
 
     androidTestImplementation(libs.bundles.espressoContrib, excludes.espresso)
     androidTestImplementation(libs.espressoCore, excludes.espresso)
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt b/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt
index ad6f687..dde4446 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt
+++ b/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt
@@ -18,15 +18,11 @@
 
 import android.content.Context
 import android.os.Bundle
+import android.widget.Button
 import android.widget.EditText
 import androidx.appcompat.app.AppCompatActivity
 import androidx.emoji2.emojipicker.EmojiPickerView
 import androidx.emoji2.emojipicker.RecentEmojiProvider
-import kotlin.coroutines.EmptyCoroutineContext
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
 
 class MainActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -39,9 +35,7 @@
         }
         view.setRecentEmojiProvider(CustomRecentEmojiProvider(applicationContext))
 
-        CoroutineScope(EmptyCoroutineContext).launch(Dispatchers.Main) {
-            // delay a few seconds to view the layout reformat
-            delay(3000)
+        findViewById<Button>(R.id.button).setOnClickListener {
             view.emojiGridColumns = 8
             view.emojiGridRows = 8.3f
         }
@@ -49,14 +43,13 @@
 }
 
 /**
- * Define a custom recent emoji provider which only provides emoji with clicks >= 2
+ * Define a custom recent emoji provider which shows most frequently used emoji
  */
 internal class CustomRecentEmojiProvider(
     context: Context
 ) : RecentEmojiProvider {
 
     companion object {
-        private const val PREF_KEY_CUSTOM_RECENT_EMOJI = "pref_key_custom_recent_emoji"
         private const val PREF_KEY_CUSTOM_EMOJI_FREQ = "pref_key_custom_emoji_freq"
         private const val RECENT_EMOJI_LIST_FILE_NAME =
             "androidx.emoji2.emojipicker.sample.preferences"
@@ -66,31 +59,19 @@
 
     private val sharedPreferences =
         context.getSharedPreferences(RECENT_EMOJI_LIST_FILE_NAME, Context.MODE_PRIVATE)
-    private val recentEmojiList =
-        sharedPreferences.getString(PREF_KEY_CUSTOM_RECENT_EMOJI, null)
-            ?.split(SPLIT_CHAR)
-            ?.toMutableList()
-            ?: mutableListOf()
 
-    private val emoji2Frequency: MutableMap<String, Int> = mutableMapOf()
-
-    init {
-        for (entry in sharedPreferences.getString(PREF_KEY_CUSTOM_EMOJI_FREQ, null)
-            ?.split(SPLIT_CHAR) ?: listOf()) {
-            val kv = entry.split(KEY_VALUE_DELIMITER)
-            emoji2Frequency[kv[0]] = kv[1].toInt()
-        }
+    private val emoji2Frequency: MutableMap<String, Int> by lazy {
+        sharedPreferences.getString(PREF_KEY_CUSTOM_EMOJI_FREQ, null)?.split(SPLIT_CHAR)
+            ?.associate { entry ->
+                entry.split(KEY_VALUE_DELIMITER, limit = 2).takeIf { it.size == 2 }
+                    ?.let { it[0] to it[1].toInt() } ?: ("" to 0)
+            }?.toMutableMap() ?: mutableMapOf()
     }
 
-    override suspend fun getRecentEmojiList(): List<String> {
-        val recentList = mutableListOf<String>()
-        emoji2Frequency.keys.filter { (emoji2Frequency[it] ?: 0) >= 2 }
-            .map { recentList.add(it) }
-        return recentList
-    }
+    override suspend fun getRecentEmojiList() =
+        emoji2Frequency.toList().sortedByDescending { it.second }.map { it.first }
 
     override fun recordSelection(emoji: String) {
-        recentEmojiList.add(0, emoji)
         emoji2Frequency[emoji] = (emoji2Frequency[emoji] ?: 0) + 1
         saveToPreferences()
     }
@@ -98,7 +79,6 @@
     private fun saveToPreferences() {
         sharedPreferences
             .edit()
-            .putString(PREF_KEY_CUSTOM_RECENT_EMOJI, recentEmojiList.joinToString(SPLIT_CHAR))
             .putString(PREF_KEY_CUSTOM_EMOJI_FREQ, emoji2Frequency.entries.joinToString(SPLIT_CHAR))
             .commit()
     }
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml b/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml
index d8dd0d2..e55d888 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml
+++ b/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml
@@ -25,6 +25,12 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
 
+    <Button
+        android:id="@+id/button"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Change Layout" />
+
     <androidx.emoji2.emojipicker.EmojiPickerView
         android:id="@+id/emoji_picker"
         android:layout_width="match_parent"
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml b/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml
index e8a6b66..2270f92 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml
+++ b/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml
@@ -25,6 +25,12 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
 
+    <Button
+        android:id="@+id/button"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Change Layout" />
+
     <androidx.emoji2.emojipicker.EmojiPickerView
         android:id="@+id/emoji_picker"
         android:layout_width="match_parent"
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
index 93046f9..b18d7a4 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
@@ -21,14 +21,13 @@
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewGroup.LayoutParams
+import android.widget.TextView
 import androidx.annotation.LayoutRes
 import androidx.annotation.UiThread
-import androidx.appcompat.widget.AppCompatTextView
 import androidx.core.view.ViewCompat
 import androidx.emoji2.emojipicker.Extensions.toItemType
 import androidx.recyclerview.widget.RecyclerView.Adapter
 import androidx.recyclerview.widget.RecyclerView.ViewHolder
-import androidx.tracing.Trace
 
 /** RecyclerView adapter for emoji body.  */
 internal class EmojiPickerBodyAdapter(
@@ -44,60 +43,54 @@
     private var emojiCellHeight: Int? = null
 
     @UiThread
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
-        Trace.beginSection("EmojiPickerBodyAdapter.onCreateViewHolder")
-        return try {
-            when (viewType.toItemType()) {
-                ItemType.CATEGORY_TITLE -> createSimpleHolder(R.layout.category_text_view, parent)
-                ItemType.PLACEHOLDER_TEXT -> createSimpleHolder(
-                    R.layout.empty_category_text_view, parent
-                ) {
-                    minimumHeight =
-                        emojiCellHeight ?: (parent.measuredHeight / emojiGridRows).toInt()
-                            .also { emojiCellHeight = it }
-                }
-
-                ItemType.EMOJI -> {
-                    EmojiViewHolder(context,
-                        parent,
-                        emojiCellWidth ?: (getParentWidth(parent) / emojiGridColumns).also {
-                            emojiCellWidth = it
-                        },
-                        emojiCellHeight ?: (parent.measuredHeight / emojiGridRows).toInt()
-                            .also { emojiCellHeight = it },
-                        layoutInflater,
-                        stickyVariantProvider,
-                        onEmojiPickedListener = { emojiViewItem ->
-                            onEmojiPickedListener(emojiViewItem)
-                        },
-                        onEmojiPickedFromPopupListener = { emoji ->
-                            with(
-                                emojiPickerItems.getBodyItem(bindingAdapterPosition)
-                                    as EmojiViewData
-                            ) {
-                                if (updateToSticky) {
-                                    this.emoji = emoji
-                                    notifyItemChanged(bindingAdapterPosition)
-                                }
-                            }
-                        })
-                }
-
-                ItemType.PLACEHOLDER_EMOJI -> object : ViewHolder(View(context)) {}
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
+        when (viewType.toItemType()) {
+            ItemType.CATEGORY_TITLE -> createSimpleHolder(R.layout.category_text_view, parent)
+            ItemType.PLACEHOLDER_TEXT -> createSimpleHolder(
+                R.layout.empty_category_text_view, parent
+            ) {
+                minimumHeight =
+                    emojiCellHeight ?: (parent.measuredHeight / emojiGridRows).toInt()
+                        .also { emojiCellHeight = it }
             }
-        } finally {
-            Trace.endSection()
+
+            ItemType.EMOJI -> {
+                EmojiViewHolder(context,
+                    parent,
+                    emojiCellWidth ?: (getParentWidth(parent) / emojiGridColumns).also {
+                        emojiCellWidth = it
+                    },
+                    emojiCellHeight ?: (parent.measuredHeight / emojiGridRows).toInt()
+                        .also { emojiCellHeight = it },
+                    layoutInflater,
+                    stickyVariantProvider,
+                    onEmojiPickedListener = { emojiViewItem ->
+                        onEmojiPickedListener(emojiViewItem)
+                    },
+                    onEmojiPickedFromPopupListener = { emoji ->
+                        with(
+                            emojiPickerItems.getBodyItem(bindingAdapterPosition)
+                                as EmojiViewData
+                        ) {
+                            if (updateToSticky) {
+                                this.emoji = emoji
+                                notifyItemChanged(bindingAdapterPosition)
+                            }
+                        }
+                    })
+            }
+
+            ItemType.PLACEHOLDER_EMOJI -> object : ViewHolder(View(context)) {}
         }
-    }
 
     override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
         val item = emojiPickerItems.getBodyItem(position)
         when (getItemViewType(position).toItemType()) {
-            ItemType.CATEGORY_TITLE -> ViewCompat.requireViewById<AppCompatTextView>(
+            ItemType.CATEGORY_TITLE -> ViewCompat.requireViewById<TextView>(
                 viewHolder.itemView, R.id.category_name
             ).text = (item as CategoryTitle).title
 
-            ItemType.PLACEHOLDER_TEXT -> ViewCompat.requireViewById<AppCompatTextView>(
+            ItemType.PLACEHOLDER_TEXT -> ViewCompat.requireViewById<TextView>(
                 viewHolder.itemView, R.id.emoji_picker_empty_category_view
             ).text = (item as PlaceholderText).text
 
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt
index 5b054e6..5e1993d 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt
@@ -21,7 +21,7 @@
 import android.view.View
 import android.view.ViewGroup
 import android.view.accessibility.AccessibilityEvent
-import androidx.appcompat.widget.AppCompatImageView
+import android.widget.ImageView
 import androidx.core.view.ViewCompat
 import androidx.recyclerview.widget.RecyclerView.Adapter
 import androidx.recyclerview.widget.RecyclerView.ViewHolder
@@ -53,7 +53,7 @@
 
     override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
         val isItemSelected = i == selectedGroupIndex
-        val headerIcon = ViewCompat.requireViewById<AppCompatImageView>(
+        val headerIcon = ViewCompat.requireViewById<ImageView>(
             viewHolder.itemView,
             R.id.emoji_picker_header_icon
         ).apply {
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt
index eb67152..a8d08ce 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt
@@ -16,7 +16,6 @@
 
 package androidx.emoji2.emojipicker
 
-import android.util.Log
 import androidx.annotation.DrawableRes
 import androidx.annotation.IntRange
 
@@ -60,16 +59,10 @@
 internal class EmojiPickerItems(
     private val groups: List<ItemGroup>,
 ) {
-    companion object {
-        const val LOG_TAG = "EmojiPickerItems"
-    }
-
     val size: Int get() = groups.sumOf { it.size }
 
     init {
-        if (groups.isEmpty()) {
-            Log.wtf(LOG_TAG, "Initialized with empty categorized sources")
-        }
+        check(groups.isNotEmpty()) { "Initialized with empty categorized sources" }
     }
 
     fun getBodyItem(@IntRange(from = 0) absolutePosition: Int): ItemViewData {
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt
index 6f7e5b3..ef30c3b 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt
@@ -247,11 +247,10 @@
     fun setRecentEmojiProvider(recentEmojiProvider: RecentEmojiProvider) {
         this.recentEmojiProvider = recentEmojiProvider
 
-        if (::emojiPickerItems.isInitialized) {
-            scope.launch {
-                refreshRecentItems()
+        scope.launch {
+            refreshRecentItems()
+            if (::emojiPickerItems.isInitialized) {
                 val range = emojiPickerItems.groupRange(recentItemGroup)
-
                 withContext(Dispatchers.Main) {
                     bodyAdapter.notifyItemRangeChanged(range.first, range.last + 1)
                 }
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt
index 890df40a..6f54129 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt
@@ -46,7 +46,7 @@
         .inflate(R.layout.emoji_view_holder, parent, /* attachToRoot = */false)
 ) {
     private val onEmojiLongClickListener: OnLongClickListener = OnLongClickListener {
-        showPopupWindow {
+        showPopupWindow(context) {
             PopupViewHelper(context).fillPopupView(
                 it,
                 layoutInflater,
@@ -98,6 +98,7 @@
     }
 
     private fun showPopupWindow(
+        context: Context,
         init: PopupWindow.(GridLayout) -> Unit
     ) {
         val popupView = layoutInflater
@@ -113,6 +114,9 @@
             val y =
                 location[1] - popupView.rowCount * emojiView.height -
                     popupView.paddingBottom - popupView.paddingTop
+            // Set background drawable so that the popup window is dismissed properly when clicking
+            // outside / scrolling for API < 23.
+            setBackgroundDrawable(context.getDrawable(R.drawable.popup_view_rounded_background))
             isOutsideTouchable = true
             isTouchable = true
             animationStyle = R.style.VariantPopupAnimation
diff --git a/gradle.properties b/gradle.properties
index 9186349..d61eb3a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-org.gradle.jvmargs=-Xmx8g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -Dkotlin.daemon.jvm.options=-XX:MaxMetaspaceSize=1g -Dlint.nullness.ignore-deprecated=true
+org.gradle.jvmargs=-Xmx8g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -Dkotlin.daemon.jvm.options=-XX:MaxMetaspaceSize=1g -Dlint.nullness.ignore-deprecated=true -Dorg.gradle.configuration-cache.internal.load-after-store=false
 org.gradle.daemon=true
 org.gradle.configureondemand=true
 org.gradle.parallel=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d923620..edf4011 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,5 +2,5 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=../../../../tools/external/gradle/gradle-7.6-bin.zip
-distributionSha256Sum=7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b
+distributionUrl=../../../../tools/external/gradle/gradle-8.0-rc-1-bin.zip
+distributionSha256Sum=d5bb29e784426547e4f455fbc0e6512d7a6a67d7d890cf24d601309287128b79
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
index 8f62713..ab28109 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
@@ -532,6 +532,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testTransactionSetBuffer_singleReleaseCallback() {
         val releaseLatch = CountDownLatch(1)
         val scenario = ActivityScenario.launch(SurfaceControlWrapperTestActivity::class.java)
@@ -591,6 +592,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testTransactionSetBuffer_multipleReleaseCallbacksAndOverwriteWithSingleSC() {
         val releaseLatch = CountDownLatch(1)
         val releaseLatch2 = CountDownLatch(1)
diff --git a/health/connect/connect-client/src/androidTest/AndroidManifest.xml b/health/connect/connect-client/src/androidTest/AndroidManifest.xml
index 4d68dc2..fc6f218 100644
--- a/health/connect/connect-client/src/androidTest/AndroidManifest.xml
+++ b/health/connect/connect-client/src/androidTest/AndroidManifest.xml
@@ -15,5 +15,99 @@
   limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- Read permissions for ACTIVITY. -->
+    <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_DISTANCE"/>
+    <uses-permission android:name="android.permission.health.READ_ELEVATION_GAINED"/>
+    <uses-permission android:name="android.permission.health.READ_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED"/>
+    <uses-permission android:name="android.permission.health.READ_STEPS"/>
+    <uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.READ_VO2_MAX"/>
+    <uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES"/>
+    <uses-permission android:name="android.permission.health.READ_POWER"/>
+    <uses-permission android:name="android.permission.health.READ_SPEED"/>
 
+    <!-- Read permissions for BODY_MEASUREMENTS. -->
+    <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_BODY_FAT"/>
+    <uses-permission android:name="android.permission.health.READ_BODY_WATER_MASS"/>
+    <uses-permission android:name="android.permission.health.READ_BONE_MASS"/>
+    <uses-permission android:name="android.permission.health.READ_HEIGHT"/>
+    <uses-permission android:name="android.permission.health.READ_HIP_CIRCUMFERENCE"/>
+    <uses-permission android:name="android.permission.health.READ_LEAN_BODY_MASS"/>
+    <uses-permission android:name="android.permission.health.READ_WAIST_CIRCUMFERENCE"/>
+    <uses-permission android:name="android.permission.health.READ_WEIGHT"/>
+
+    <!-- Read permissions for CYCLE_TRACKING. -->
+    <uses-permission android:name="android.permission.health.READ_CERVICAL_MUCUS"/>
+    <uses-permission android:name="android.permission.health.READ_MENSTRUATION"/>
+    <uses-permission android:name="android.permission.health.READ_OVULATION_TEST"/>
+    <uses-permission android:name="android.permission.health.READ_SEXUAL_ACTIVITY"/>
+
+    <!-- Read permissions for NUTRITION. -->
+    <uses-permission android:name="android.permission.health.READ_HYDRATION"/>
+    <uses-permission android:name="android.permission.health.READ_NUTRITION"/>
+
+    <!-- Read permissions for SLEEP. -->
+    <uses-permission android:name="android.permission.health.READ_SLEEP"/>
+
+    <!-- Read permissions for VITALS. -->
+    <uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE"/>
+    <uses-permission android:name="android.permission.health.READ_BLOOD_PRESSURE"/>
+    <uses-permission android:name="android.permission.health.READ_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_HEART_RATE_VARIABILITY"/>
+    <uses-permission android:name="android.permission.health.READ_OXYGEN_SATURATION"/>
+    <uses-permission android:name="android.permission.health.READ_RESPIRATORY_RATE"/>
+    <uses-permission android:name="android.permission.health.READ_RESTING_HEART_RATE"/>
+
+    <!-- Write permissions for ACTIVITY. -->
+    <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_DISTANCE"/>
+    <uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED"/>
+    <uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
+    <uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
+    <uses-permission android:name="android.permission.health.WRITE_STEPS"/>
+    <uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
+    <uses-permission android:name="android.permission.health.WRITE_VO2_MAX"/>
+    <uses-permission android:name="android.permission.health.WRITE_WHEELCHAIR_PUSHES"/>
+    <uses-permission android:name="android.permission.health.WRITE_POWER"/>
+    <uses-permission android:name="android.permission.health.WRITE_SPEED"/>
+
+    <!-- Write permissions for BODY_MEASUREMENTS. -->
+    <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BODY_FAT"/>
+    <uses-permission android:name="android.permission.health.WRITE_BODY_WATER_MASS"/>
+    <uses-permission android:name="android.permission.health.WRITE_BONE_MASS"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEIGHT"/>
+    <uses-permission android:name="android.permission.health.WRITE_HIP_CIRCUMFERENCE"/>
+    <uses-permission android:name="android.permission.health.WRITE_LEAN_BODY_MASS"/>
+    <uses-permission android:name="android.permission.health.WRITE_WAIST_CIRCUMFERENCE"/>
+    <uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
+
+    <!-- Write permissions for CYCLE_TRACKING. -->
+    <uses-permission android:name="android.permission.health.WRITE_CERVICAL_MUCUS"/>
+    <uses-permission android:name="android.permission.health.WRITE_MENSTRUATION"/>
+    <uses-permission android:name="android.permission.health.WRITE_OVULATION_TEST"/>
+    <uses-permission android:name="android.permission.health.WRITE_SEXUAL_ACTIVITY"/>
+
+    <!-- Write permissions for NUTRITION. -->
+    <uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
+    <uses-permission android:name="android.permission.health.WRITE_NUTRITION"/>
+
+    <!-- Write permissions for SLEEP. -->
+    <uses-permission android:name="android.permission.health.WRITE_SLEEP"/>
+
+    <!-- Write permissions for VITALS. -->
+    <uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BLOOD_PRESSURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_BODY_TEMPERATURE"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_HEART_RATE_VARIABILITY"/>
+    <uses-permission android:name="android.permission.health.WRITE_OXYGEN_SATURATION"/>
+    <uses-permission android:name="android.permission.health.WRITE_RESPIRATORY_RATE"/>
+    <uses-permission android:name="android.permission.health.WRITE_RESTING_HEART_RATE"/>
 </manifest>
diff --git a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt
index bbd7551..1e293f8 100644
--- a/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt
+++ b/health/connect/connect-client/src/androidTest/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImplTest.kt
@@ -17,9 +17,12 @@
 package androidx.health.connect.client.impl
 
 import android.annotation.TargetApi
+import android.content.Context
+import android.content.pm.PackageManager
 import android.os.Build
 import android.os.RemoteException
 import androidx.health.connect.client.HealthConnectClient
+import androidx.health.connect.client.changes.DeletionChange
 import androidx.health.connect.client.changes.UpsertionChange
 import androidx.health.connect.client.permission.HealthPermission
 import androidx.health.connect.client.records.StepsRecord
@@ -34,6 +37,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
+import androidx.test.rule.GrantPermissionRule
 import com.google.common.truth.Truth.assertThat
 import java.time.Duration
 import java.time.Instant
@@ -42,7 +46,10 @@
 import java.time.ZoneOffset
 import kotlin.test.assertFailsWith
 import kotlinx.coroutines.test.runTest
+import org.junit.After
 import org.junit.Before
+import org.junit.Ignore
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -54,34 +61,29 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
 class HealthConnectClientUpsideDownImplTest {
 
+    private val context: Context = ApplicationProvider.getApplicationContext()
+
+    // Grant every permission as deletion by id checks for every permission
+    @get:Rule
+    val grantPermissionRule: GrantPermissionRule =
+        GrantPermissionRule.grant(
+            *context.packageManager.getPackageInfo(
+                context.packageName,
+                PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS.toLong())
+            ).requestedPermissions
+        )
+
     private lateinit var healthConnectClient: HealthConnectClient
 
     @Before
     fun setUp() {
         healthConnectClient =
-            HealthConnectClientUpsideDownImpl(ApplicationProvider.getApplicationContext())
+            HealthConnectClientUpsideDownImpl(context)
     }
 
-    @Test
-    fun filterGrantedPermissions_throwUOE() = runTest {
-        assertFailsWith<UnsupportedOperationException> {
-            healthConnectClient.permissionController.filterGrantedPermissions(
-                setOf(HealthPermission.READ_ACTIVE_CALORIES_BURNED)
-            )
-        }
-    }
-
-    @Test
-    fun getGrantedPermission_throwUOE() = runTest {
-        assertFailsWith<UnsupportedOperationException> {
-            healthConnectClient.permissionController.getGrantedPermissions(
-                setOf(
-                    HealthPermission.createReadPermission(
-                        StepsRecord::class,
-                    )
-                )
-            )
-        }
+    @After
+    fun tearDown() = runTest {
+        healthConnectClient.deleteRecords(StepsRecord::class, TimeRangeFilter.none())
     }
 
     @Test
@@ -101,6 +103,102 @@
     }
 
     @Test
+    fun deleteRecords_byId() = runTest {
+        val recordIds = healthConnectClient.insertRecords(
+            listOf(
+                StepsRecord(
+                    count = 100,
+                    startTime = Instant.ofEpochMilli(1234L),
+                    startZoneOffset = null,
+                    endTime = Instant.ofEpochMilli(5678L),
+                    endZoneOffset = null
+                ),
+                StepsRecord(
+                    count = 150,
+                    startTime = Instant.ofEpochMilli(12340L),
+                    startZoneOffset = null,
+                    endTime = Instant.ofEpochMilli(56780L),
+                    endZoneOffset = null
+                ),
+                StepsRecord(
+                    count = 200,
+                    startTime = Instant.ofEpochMilli(123400L),
+                    startZoneOffset = null,
+                    endTime = Instant.ofEpochMilli(567800L),
+                    endZoneOffset = null,
+                    metadata = Metadata(clientRecordId = "clientId")
+                ),
+            )
+        ).recordIdsList
+
+        val initialRecords = healthConnectClient.readRecords(
+            ReadRecordsRequest(
+                StepsRecord::class,
+                TimeRangeFilter.none()
+            )
+        ).records
+
+        healthConnectClient.deleteRecords(
+            StepsRecord::class, listOf(recordIds[1]),
+            listOf("clientId")
+        )
+
+        assertThat(
+            healthConnectClient.readRecords(
+                ReadRecordsRequest(
+                    StepsRecord::class,
+                    TimeRangeFilter.none()
+                )
+            ).records
+        ).containsExactly(initialRecords[0])
+    }
+
+    // TODO(b/264253708): remove @Ignore from this test case once bug is resolved
+    @Test
+    @Ignore("Blocked while investigating b/264253708")
+    fun deleteRecords_byTimeRange() = runTest {
+        healthConnectClient.insertRecords(
+            listOf(
+                StepsRecord(
+                    count = 100,
+                    startTime = Instant.ofEpochMilli(1_234L),
+                    startZoneOffset = ZoneOffset.UTC,
+                    endTime = Instant.ofEpochMilli(5_678L),
+                    endZoneOffset = ZoneOffset.UTC
+                ),
+                StepsRecord(
+                    count = 150,
+                    startTime = Instant.ofEpochMilli(12_340L),
+                    startZoneOffset = ZoneOffset.UTC,
+                    endTime = Instant.ofEpochMilli(56_780L),
+                    endZoneOffset = ZoneOffset.UTC
+                ),
+            )
+        ).recordIdsList
+
+        val initialRecords = healthConnectClient.readRecords(
+            ReadRecordsRequest(
+                StepsRecord::class,
+                TimeRangeFilter.none()
+            )
+        ).records
+
+        healthConnectClient.deleteRecords(
+            StepsRecord::class,
+            TimeRangeFilter.before(Instant.ofEpochMilli(10_000L))
+        )
+
+        assertThat(
+            healthConnectClient.readRecords(
+                ReadRecordsRequest(
+                    StepsRecord::class,
+                    TimeRangeFilter.none()
+                )
+            ).records
+        ).containsExactly(initialRecords[1])
+    }
+
+    @Test
     fun updateRecords() = runTest {
         val id = healthConnectClient.insertRecords(
             listOf(
@@ -268,7 +366,7 @@
             )
         )
 
-        val insertResponse = healthConnectClient.insertRecords(
+        val insertedRecordId = healthConnectClient.insertRecords(
             listOf(
                 StepsRecord(
                     count = 100,
@@ -278,13 +376,11 @@
                     endZoneOffset = ZoneOffset.UTC
                 )
             )
-        )
-
-        // TODO(b/262240293): delete a record to test DeletionChange conversion
+        ).recordIdsList[0]
 
         val record = healthConnectClient.readRecord(
             StepsRecord::class,
-            insertResponse.recordIdsList[0]
+            insertedRecordId
         ).record
 
         assertThat(healthConnectClient.getChanges(token).changes).containsExactly(
@@ -292,5 +388,35 @@
                 record
             )
         )
+
+        healthConnectClient.deleteRecords(StepsRecord::class, TimeRangeFilter.none())
+
+        assertThat(healthConnectClient.getChanges(token).changes).containsExactly(
+            DeletionChange(
+                insertedRecordId
+            )
+        )
+    }
+
+    @Test
+    fun filterGrantedPermissions_throwUOE() = runTest {
+        assertFailsWith<UnsupportedOperationException> {
+            healthConnectClient.permissionController.filterGrantedPermissions(
+                setOf(HealthPermission.READ_ACTIVE_CALORIES_BURNED)
+            )
+        }
+    }
+
+    @Test
+    fun getGrantedPermission_throwUOE() = runTest {
+        assertFailsWith<UnsupportedOperationException> {
+            healthConnectClient.permissionController.getGrantedPermissions(
+                setOf(
+                    HealthPermission.createReadPermission(
+                        StepsRecord::class,
+                    )
+                )
+            )
+        }
     }
 }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt
index 9db6647..5814903 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientUpsideDownImpl.kt
@@ -21,6 +21,7 @@
 import android.healthconnect.HealthConnectException
 import android.healthconnect.HealthConnectManager
 import android.healthconnect.ReadRecordsRequestUsingIds
+import android.healthconnect.RecordIdFilter
 import android.os.Build
 import android.os.RemoteException
 import androidx.annotation.RequiresApi
@@ -36,6 +37,7 @@
 import androidx.health.connect.client.impl.platform.records.toPlatformReadRecordsRequestUsingFilters
 import androidx.health.connect.client.impl.platform.records.toPlatformRecord
 import androidx.health.connect.client.impl.platform.records.toPlatformRecordClass
+import androidx.health.connect.client.impl.platform.records.toPlatformTimeRangeFilter
 import androidx.health.connect.client.impl.platform.records.toSdkRecord
 import androidx.health.connect.client.impl.platform.response.toKtResponse
 import androidx.health.connect.client.impl.platform.time.SystemDefaultTimeSource
@@ -83,8 +85,7 @@
 
     override suspend fun insertRecords(records: List<Record>): InsertRecordsResponse {
         val response = wrapPlatformException {
-            suspendCancellableCoroutine<android.healthconnect.InsertRecordsResponse> { continuation
-                ->
+            suspendCancellableCoroutine { continuation ->
                 healthConnectManager.insertRecords(
                     records.map { it.toPlatformRecord() },
                     Runnable::run,
@@ -97,8 +98,7 @@
 
     override suspend fun updateRecords(records: List<Record>) {
         wrapPlatformException {
-            suspendCancellableCoroutine<Void> { continuation
-                ->
+            suspendCancellableCoroutine { continuation ->
                 healthConnectManager.updateRecords(
                     records.map { it.toPlatformRecord() },
                     Runnable::run,
@@ -113,14 +113,46 @@
         recordIdsList: List<String>,
         clientRecordIdsList: List<String>
     ) {
-        throw UnsupportedOperationException("Method not supported yet")
+        wrapPlatformException {
+            suspendCancellableCoroutine { continuation ->
+                healthConnectManager.deleteRecords(
+                    buildList {
+                        recordIdsList.forEach {
+                            add(
+                                RecordIdFilter.Builder(
+                                    recordType.toPlatformRecordClass()
+                                ).setId(it).build()
+                            )
+                        }
+                        clientRecordIdsList.forEach {
+                            add(
+                                RecordIdFilter.Builder(
+                                    recordType.toPlatformRecordClass()
+                                ).setClientRecordId(it).build()
+                            )
+                        }
+                    },
+                    Runnable::run,
+                    continuation.asOutcomeReceiver()
+                )
+            }
+        }
     }
 
     override suspend fun deleteRecords(
         recordType: KClass<out Record>,
         timeRangeFilter: TimeRangeFilter
     ) {
-        throw UnsupportedOperationException("Method not supported yet")
+        wrapPlatformException {
+            suspendCancellableCoroutine { continuation ->
+                healthConnectManager.deleteRecords(
+                    recordType.toPlatformRecordClass(),
+                    timeRangeFilter.toPlatformTimeRangeFilter(timeSource),
+                    Runnable::run,
+                    continuation.asOutcomeReceiver()
+                )
+            }
+        }
     }
 
     @Suppress("UNCHECKED_CAST") // Safe to cast as the type should match
@@ -129,8 +161,7 @@
         recordId: String
     ): ReadRecordResponse<T> {
         val response = wrapPlatformException {
-            suspendCancellableCoroutine { continuation
-                ->
+            suspendCancellableCoroutine { continuation ->
                 healthConnectManager.readRecords(
                     ReadRecordsRequestUsingIds
                         .Builder(recordType.toPlatformRecordClass())
@@ -151,8 +182,7 @@
         request: ReadRecordsRequest<T>
     ): ReadRecordsResponse<T> {
         val response = wrapPlatformException {
-            suspendCancellableCoroutine { continuation
-                ->
+            suspendCancellableCoroutine { continuation ->
                 healthConnectManager.readRecords(
                     request.toPlatformReadRecordsRequestUsingFilters(timeSource),
                     Runnable::run,
@@ -239,7 +269,7 @@
         throw UnsupportedOperationException("Method not supported yet")
     }
 
-    internal suspend fun <T> wrapPlatformException(function: suspend () -> T): T {
+    private suspend fun <T> wrapPlatformException(function: suspend () -> T): T {
         return try {
             function()
         } catch (e: HealthConnectException) {
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeConfig.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeConfig.kt
index 55cd47f..e9e378b 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeConfig.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeConfig.kt
@@ -21,6 +21,8 @@
 /**
  * Configuration attributes for a specific exercise type that may be modified after the exercise has
  * started. This should not be instantiated outside the health.services.client.data library.
+ * Developers should create instances of [ExerciseTypeConfig] using the constructor of available
+ * subclasses, depending on their needs. Currently available types are: [GolfExerciseTypeConfig].
  */
 abstract class ExerciseTypeConfig internal constructor() {
   internal abstract fun toProto(): DataProto.ExerciseTypeConfig
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
index 46f12ac..b37673c 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
@@ -427,12 +427,14 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void navigateBetweenRowsAndVideoUsingDPAD1() throws Throwable {
         navigateBetweenRowsAndVideoUsingDPADInternal(DetailsSupportFragmentWithVideo1.class);
     }
 
     @FlakyTest(bugId = 228336699)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void navigateBetweenRowsAndVideoUsingDPAD2() throws Throwable {
         navigateBetweenRowsAndVideoUsingDPADInternal(DetailsSupportFragmentWithVideo2.class);
     }
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/wizard/GuidedStepAttributesTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/wizard/GuidedStepAttributesTest.java
index 715a4e1..bfb79b2 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/wizard/GuidedStepAttributesTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/wizard/GuidedStepAttributesTest.java
@@ -27,6 +27,7 @@
 import androidx.leanback.widget.GuidedAction;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 
@@ -384,6 +385,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testCheckedActions() throws Throwable {
 
         Intent intent = new Intent();
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/ControlBarTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/ControlBarTest.java
index 87a16c1..514e31a 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/ControlBarTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/ControlBarTest.java
@@ -28,6 +28,7 @@
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -41,6 +42,7 @@
 public class ControlBarTest {
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void defaultFocus() {
         Context context = ApplicationProvider.getApplicationContext();
         final ControlBar bar = new ControlBar(context, null);
@@ -62,6 +64,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void persistFocus() {
         Context context = ApplicationProvider.getApplicationContext();
         final LinearLayout rootView = new LinearLayout(context);
@@ -104,6 +107,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void getFocusables() {
         Context context = ApplicationProvider.getApplicationContext();
         final LinearLayout rootView = new LinearLayout(context);
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/PlaybackTransportRowPresenterTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/PlaybackTransportRowPresenterTest.java
index 8cd1b1b..7da8bab 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/PlaybackTransportRowPresenterTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/PlaybackTransportRowPresenterTest.java
@@ -40,6 +40,7 @@
 import androidx.leanback.media.PlayerAdapter;
 import androidx.leanback.widget.PlaybackSeekDataProvider.ResultCallback;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.Before;
@@ -269,6 +270,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void navigateProgressUpToPrimary() {
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -287,6 +289,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void navigateProgressDownToSecondary() {
         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -318,6 +321,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekAndConfirm() {
         when(mImpl.isPrepared()).thenReturn(true);
         when(mImpl.getCurrentPosition()).thenReturn(0L);
@@ -346,6 +350,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void playSeekToZero() {
         when(mImpl.isPrepared()).thenReturn(true);
         when(mImpl.getCurrentPosition()).thenReturn(0L);
@@ -388,6 +393,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void playSeekAndCancel() {
         when(mImpl.isPrepared()).thenReturn(true);
         when(mImpl.getCurrentPosition()).thenReturn(0L);
@@ -430,6 +436,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekHoldKeyDown() {
         when(mImpl.isPrepared()).thenReturn(true);
         when(mImpl.getCurrentPosition()).thenReturn(4489L);
@@ -456,6 +463,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekAndCancel() {
         when(mImpl.isPrepared()).thenReturn(true);
         when(mImpl.getCurrentPosition()).thenReturn(0L);
@@ -484,6 +492,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekUpBetweenTwoKeyPosition() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(10000L, 101));
@@ -508,6 +517,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekDownBetweenTwoKeyPosition() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(10000L, 101));
@@ -533,6 +543,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekDownOutOfKeyPositions() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(1000L, 10000L, 101));
@@ -562,6 +573,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekDownAheadOfKeyPositions() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(1000L, 10000L, 101));
@@ -589,6 +601,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekUpAheadOfKeyPositions() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(1000L, 10000L, 101));
@@ -616,6 +629,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekUpOutOfKeyPositions() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(10000L, 101));
@@ -649,6 +663,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekUpAfterKeyPositions() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(10000L, 101));
@@ -675,6 +690,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void seekDownAfterKeyPositions() {
         PlaybackSeekProviderSample provider = Mockito.spy(
                 new PlaybackSeekProviderSample(10000L, 101));
@@ -701,6 +717,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void thumbLoadedInCallback() {
         when(mImpl.isPrepared()).thenReturn(true);
         when(mImpl.getCurrentPosition()).thenReturn(0L);
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/picker/TimePickerTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/picker/TimePickerTest.java
index ce591e1..3670c3a 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/picker/TimePickerTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/picker/TimePickerTest.java
@@ -30,6 +30,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 
@@ -436,6 +437,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testInitiallyActiveTimePicker()
             throws Throwable {
         Intent intent = new Intent();
diff --git a/lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.kt b/lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.kt
index 0f1aee2..dbf4021 100644
--- a/lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.kt
+++ b/lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.kt
@@ -202,7 +202,7 @@
     override fun onInactive() {
         super.onInactive()
         val s = subscriber.getAndSet(null)
-        s.cancelSubscription()
+        s?.cancelSubscription()
     }
 
     inner class LiveDataSubscriber : AtomicReference<Subscription>(), Subscriber<T> {
diff --git a/lifecycle/lifecycle-runtime-compose/api/current.txt b/lifecycle/lifecycle-runtime-compose/api/current.txt
index aab4af7..c80fa83 100644
--- a/lifecycle/lifecycle-runtime-compose/api/current.txt
+++ b/lifecycle/lifecycle-runtime-compose/api/current.txt
@@ -2,6 +2,10 @@
 package androidx.lifecycle.compose {
 
   public final class FlowExtKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
   }
 
 }
diff --git a/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_current.txt
index 5bebc62..c80fa83 100644
--- a/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_current.txt
@@ -1,14 +1,11 @@
 // Signature format: 4.0
 package androidx.lifecycle.compose {
 
-  @kotlin.RequiresOptIn(message="This is an experimental Lifecycle Compose API.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExperimentalLifecycleComposeApi {
-  }
-
   public final class FlowExtKt {
-    method @androidx.compose.runtime.Composable @androidx.lifecycle.compose.ExperimentalLifecycleComposeApi public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
-    method @androidx.compose.runtime.Composable @androidx.lifecycle.compose.ExperimentalLifecycleComposeApi public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
-    method @androidx.compose.runtime.Composable @androidx.lifecycle.compose.ExperimentalLifecycleComposeApi public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
-    method @androidx.compose.runtime.Composable @androidx.lifecycle.compose.ExperimentalLifecycleComposeApi public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
   }
 
 }
diff --git a/lifecycle/lifecycle-runtime-compose/api/restricted_current.txt b/lifecycle/lifecycle-runtime-compose/api/restricted_current.txt
index aab4af7..c80fa83 100644
--- a/lifecycle/lifecycle-runtime-compose/api/restricted_current.txt
+++ b/lifecycle/lifecycle-runtime-compose/api/restricted_current.txt
@@ -2,6 +2,10 @@
 package androidx.lifecycle.compose {
 
   public final class FlowExtKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
   }
 
 }
diff --git a/lifecycle/lifecycle-runtime-compose/samples/src/main/java/androidx/lifecycle/compose/samples/LifecycleComposeSamples.kt b/lifecycle/lifecycle-runtime-compose/samples/src/main/java/androidx/lifecycle/compose/samples/LifecycleComposeSamples.kt
index 3486a82..473c732 100644
--- a/lifecycle/lifecycle-runtime-compose/samples/src/main/java/androidx/lifecycle/compose/samples/LifecycleComposeSamples.kt
+++ b/lifecycle/lifecycle-runtime-compose/samples/src/main/java/androidx/lifecycle/compose/samples/LifecycleComposeSamples.kt
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-@file:OptIn(ExperimentalLifecycleComposeApi::class)
-
 package androidx.lifecycle.compose.samples
 
 import androidx.annotation.Sampled
@@ -23,7 +21,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
-import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.MutableStateFlow
diff --git a/lifecycle/lifecycle-runtime-compose/src/androidTest/java/androidx/lifecycle/compose/CollectAsStateWithLifecycleTests.kt b/lifecycle/lifecycle-runtime-compose/src/androidTest/java/androidx/lifecycle/compose/CollectAsStateWithLifecycleTests.kt
index 928b2af..54b6553c 100644
--- a/lifecycle/lifecycle-runtime-compose/src/androidTest/java/androidx/lifecycle/compose/CollectAsStateWithLifecycleTests.kt
+++ b/lifecycle/lifecycle-runtime-compose/src/androidTest/java/androidx/lifecycle/compose/CollectAsStateWithLifecycleTests.kt
@@ -28,7 +28,6 @@
 import org.junit.Rule
 import org.junit.Test
 
-@OptIn(ExperimentalLifecycleComposeApi::class)
 class CollectAsStateWithLifecycleTests {
 
     @get:Rule
diff --git a/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/ExperimentalLifecycleComposeApi.kt b/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/ExperimentalLifecycleComposeApi.kt
deleted file mode 100644
index 3f54e9a..0000000
--- a/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/ExperimentalLifecycleComposeApi.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.lifecycle.compose
-
-@RequiresOptIn(message = "This is an experimental Lifecycle Compose API.")
-@Target(
-    AnnotationTarget.CLASS,
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY,
-    AnnotationTarget.FIELD,
-    AnnotationTarget.PROPERTY_GETTER,
-)
-@Retention(AnnotationRetention.BINARY)
-annotation class ExperimentalLifecycleComposeApi
diff --git a/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/FlowExt.kt b/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/FlowExt.kt
index bec92b8..7ee6398 100644
--- a/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/FlowExt.kt
+++ b/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/FlowExt.kt
@@ -53,7 +53,6 @@
  * state again.
  * @param context [CoroutineContext] to use for collecting.
  */
-@ExperimentalLifecycleComposeApi
 @Composable
 fun <T> StateFlow<T>.collectAsStateWithLifecycle(
     lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
@@ -88,7 +87,6 @@
  * state again.
  * @param context [CoroutineContext] to use for collecting.
  */
-@ExperimentalLifecycleComposeApi
 @Composable
 fun <T> StateFlow<T>.collectAsStateWithLifecycle(
     lifecycle: Lifecycle,
@@ -126,7 +124,6 @@
  * state again.
  * @param context [CoroutineContext] to use for collecting.
  */
-@ExperimentalLifecycleComposeApi
 @Composable
 fun <T> Flow<T>.collectAsStateWithLifecycle(
     initialValue: T,
@@ -163,7 +160,6 @@
  * state again.
  * @param context [CoroutineContext] to use for collecting.
  */
-@ExperimentalLifecycleComposeApi
 @Composable
 fun <T> Flow<T>.collectAsStateWithLifecycle(
     initialValue: T,
diff --git a/media/media/api/api_lint.ignore b/media/media/api/api_lint.ignore
index 223ac6a..d098ab4 100644
--- a/media/media/api/api_lint.ignore
+++ b/media/media/api/api_lint.ignore
@@ -67,6 +67,12 @@
     Intent action constant name must be ACTION_FOO: CUSTOM_ACTION_DOWNLOAD
 IntentName: android.support.v4.media.MediaBrowserCompat#CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE:
     Intent action constant name must be ACTION_FOO: CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE
+IntentName: androidx.media.utils.MediaConstants#BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT:
+    Intent action constant name must be ACTION_FOO: BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT
+IntentName: androidx.media.utils.MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST:
+    Intent action constant name must be ACTION_FOO: BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+IntentName: androidx.media.utils.MediaConstants#DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST:
+    Intent action constant name must be ACTION_FOO: DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
 
 
 InterfaceConstant: androidx.media.MediaBrowserServiceCompat#SERVICE_INTERFACE:
diff --git a/media/media/api/current.txt b/media/media/api/current.txt
index 000d8df..0f1bb9d 100644
--- a/media/media/api/current.txt
+++ b/media/media/api/current.txt
@@ -712,10 +712,12 @@
 package androidx.media.utils {
 
   public final class MediaConstants {
+    field public static final String BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT = "androidx.media.MediaBrowserCompat.CUSTOM_BROWSER_ACTION_LIMIT";
     field public static final String BROWSER_ROOT_HINTS_KEY_MEDIA_ART_SIZE_PIXELS = "android.media.extras.MEDIA_ART_SIZE_HINT_PIXELS";
     field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_LIMIT";
     field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_SUPPORTED_FLAGS";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT = "androidx.media.BrowserRoot.Extras.APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT";
+    field public static final String BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST = "android.media.extra.CUSTOM_BROWSER_ACTION_ROOT_LIST";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_FAVORITES_MEDIA_ITEM = "androidx.media.BrowserRoot.Extras.FAVORITES_MEDIA_ITEM";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED = "android.media.browse.SEARCH_SUPPORTED";
     field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE = "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
@@ -724,6 +726,7 @@
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE = "android.media.browse.CONTENT_STYLE_GROUP_TITLE_HINT";
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT";
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM = "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
+    field public static final String DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST = "android.media.extra.CUSTOM_BROWSER_ACTION_ID_LIST";
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2; // 0x2
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED = 0; // 0x0
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED = 1; // 0x1
@@ -731,6 +734,15 @@
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM = 3; // 0x3
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM = 2; // 0x2
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM = 1; // 0x1
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_EXTRAS = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_EXTRAS";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ICON_URI = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ICON_URI";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ID = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ID";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_LABEL = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_LABEL";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM";
     field public static final String METADATA_KEY_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
     field public static final String METADATA_KEY_IS_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
     field public static final String METADATA_KEY_IS_EXPLICIT = "android.media.IS_EXPLICIT";
diff --git a/media/media/api/public_plus_experimental_current.txt b/media/media/api/public_plus_experimental_current.txt
index 000d8df..0f1bb9d 100644
--- a/media/media/api/public_plus_experimental_current.txt
+++ b/media/media/api/public_plus_experimental_current.txt
@@ -712,10 +712,12 @@
 package androidx.media.utils {
 
   public final class MediaConstants {
+    field public static final String BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT = "androidx.media.MediaBrowserCompat.CUSTOM_BROWSER_ACTION_LIMIT";
     field public static final String BROWSER_ROOT_HINTS_KEY_MEDIA_ART_SIZE_PIXELS = "android.media.extras.MEDIA_ART_SIZE_HINT_PIXELS";
     field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_LIMIT";
     field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_SUPPORTED_FLAGS";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT = "androidx.media.BrowserRoot.Extras.APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT";
+    field public static final String BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST = "android.media.extra.CUSTOM_BROWSER_ACTION_ROOT_LIST";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_FAVORITES_MEDIA_ITEM = "androidx.media.BrowserRoot.Extras.FAVORITES_MEDIA_ITEM";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED = "android.media.browse.SEARCH_SUPPORTED";
     field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE = "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
@@ -724,6 +726,7 @@
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE = "android.media.browse.CONTENT_STYLE_GROUP_TITLE_HINT";
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT";
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM = "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
+    field public static final String DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST = "android.media.extra.CUSTOM_BROWSER_ACTION_ID_LIST";
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2; // 0x2
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED = 0; // 0x0
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED = 1; // 0x1
@@ -731,6 +734,15 @@
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM = 3; // 0x3
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM = 2; // 0x2
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM = 1; // 0x1
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_EXTRAS = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_EXTRAS";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ICON_URI = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ICON_URI";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ID = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ID";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_LABEL = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_LABEL";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM";
     field public static final String METADATA_KEY_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
     field public static final String METADATA_KEY_IS_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
     field public static final String METADATA_KEY_IS_EXPLICIT = "android.media.IS_EXPLICIT";
diff --git a/media/media/api/restricted_current.txt b/media/media/api/restricted_current.txt
index 8e6efd2..fe59f23 100644
--- a/media/media/api/restricted_current.txt
+++ b/media/media/api/restricted_current.txt
@@ -750,10 +750,12 @@
 package androidx.media.utils {
 
   public final class MediaConstants {
+    field public static final String BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT = "androidx.media.MediaBrowserCompat.CUSTOM_BROWSER_ACTION_LIMIT";
     field public static final String BROWSER_ROOT_HINTS_KEY_MEDIA_ART_SIZE_PIXELS = "android.media.extras.MEDIA_ART_SIZE_HINT_PIXELS";
     field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_LIMIT";
     field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_SUPPORTED_FLAGS";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT = "androidx.media.BrowserRoot.Extras.APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT";
+    field public static final String BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST = "android.media.extra.CUSTOM_BROWSER_ACTION_ROOT_LIST";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_FAVORITES_MEDIA_ITEM = "androidx.media.BrowserRoot.Extras.FAVORITES_MEDIA_ITEM";
     field public static final String BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED = "android.media.browse.SEARCH_SUPPORTED";
     field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE = "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
@@ -762,6 +764,7 @@
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE = "android.media.browse.CONTENT_STYLE_GROUP_TITLE_HINT";
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT";
     field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM = "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
+    field public static final String DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST = "android.media.extra.CUSTOM_BROWSER_ACTION_ID_LIST";
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2; // 0x2
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED = 0; // 0x0
     field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED = 1; // 0x1
@@ -769,6 +772,15 @@
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM = 3; // 0x3
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM = 2; // 0x2
     field public static final int DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM = 1; // 0x1
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_EXTRAS = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_EXTRAS";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ICON_URI = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ICON_URI";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ID = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ID";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_LABEL = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_LABEL";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM";
+    field public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM = "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM";
     field public static final String METADATA_KEY_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
     field public static final String METADATA_KEY_IS_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
     field public static final String METADATA_KEY_IS_EXPLICIT = "android.media.IS_EXPLICIT";
diff --git a/media/media/src/main/java/androidx/media/utils/MediaConstants.java b/media/media/src/main/java/androidx/media/utils/MediaConstants.java
index 3602a83..ebbc9e4 100644
--- a/media/media/src/main/java/androidx/media/utils/MediaConstants.java
+++ b/media/media/src/main/java/androidx/media/utils/MediaConstants.java
@@ -39,6 +39,8 @@
 import androidx.annotation.RestrictTo;
 import androidx.media.MediaBrowserServiceCompat;
 
+import java.util.ArrayList;
+
 /** Media constants for sharing constants between media provider and consumer apps */
 public final class MediaConstants {
     /**
@@ -529,8 +531,287 @@
     public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE =
             "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
 
+
     /**
-     * Bundle key used for the media id in {@link PlaybackStateCompat playback state} extras. It's
+     * {@link Bundle} key used to store supported custom browser actions for
+     * {@link MediaBrowserCompat media browsers} that support custom browser actions.
+     *
+     * <p>The browser indicates support for custom browser actions by including the key
+     * {@link MediaConstants#BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT} with a
+     * non-zero value in the root hints bundle passed to
+     * {@link MediaBrowserServiceCompat#onGetRoot}.
+     *
+     * <p>Use this key to add an {@link ArrayList} to the {@link Bundle} passed in
+     * {@link MediaBrowserServiceCompat.BrowserRoot}. {@link MediaBrowserServiceCompat} should add
+     * this bundle to the {@link MediaBrowserServiceCompat.BrowserRoot} when
+     * {@link MediaBrowserServiceCompat#onGetRoot(String, int, Bundle)} is called.
+     * Use {@link Bundle#putParcelableArrayList(String, ArrayList)} with a list
+     * of bundles, each defining a custom browser action, to set supported custom browser actions.
+     *
+     * <p>TYPE: arraylist, an ArrayList of {@link Bundle}s, with each bundle defining a browse
+     * custom action.
+     *
+     * <p>A custom browser action is defined by an
+     * {@linkplain MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_ID action ID}, an
+     * {@linkplain MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_LABEL action label},
+     * an {@linkplain MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_ICON_URI action icon
+     * URI}, and optionally an
+     * {@linkplain MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_EXTRAS action extras
+     * bundle}.
+     *
+     * <p>Custom browser action example:
+     * <ul>
+     *   <li>Action ID: "com.example.audioapp.download"
+     *     <ul>
+     *       <li>Key: {@link MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_ID}
+     *     </ul>
+     *   </li>
+     *     <li>Action label: "Download Song"
+     *     <ul>
+     *       <li>Key: {@link MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_LABEL}
+     *       <li>Localized String label for action
+     *     </ul>
+     *   </li>
+     *     <li>Action Icon URI: "content://com.example.public/download"
+     *     <ul>
+     *       <li>Key: {@link MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_ICON_URI}
+     *       <li>Tintable vector drawable
+     *     </ul>
+     *   </li>
+     *     <li>Action extras: {bundle}
+     *     <ul>
+     *       <li>Key: {@link MediaConstants#EXTRA_KEY_CUSTOM_BROWSER_ACTION_EXTRAS}
+     *       <li>Bundle extras
+     *     </ul>
+     *   </li>
+     * </ul>
+     */
+    public static final String BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST =
+            "android.media.extra.CUSTOM_BROWSER_ACTION_ROOT_LIST";
+
+    /**
+     * {@link Bundle} key used to define a string list of custom browser actions for a
+     * {@link MediaBrowserCompat.MediaItem}. e.g. "download","favorite","add to queue"
+     *
+     * <p>Supported {@link MediaBrowserCompat media browsers} use this {@link Bundle} key
+     * to build a list of custom browser actions for each {@link MediaBrowserCompat.MediaItem}.
+     *
+     * <p>This key is sent through {@link MediaDescriptionCompat#getExtras()} to the
+     * {@link MediaBrowserCompat} to indicate supported custom browser actions for the corresponding
+     * {@link MediaBrowserCompat.MediaItem}.
+     * <p>Use {@linkplain Bundle#putStringArrayList(String, ArrayList) a string array list} with a
+     * list of custom browser action IDs. Set this bundle in the
+     * {@link MediaBrowserCompat.MediaItem} using
+     * {@link MediaDescriptionCompat.Builder#setExtras(Bundle)} to set the supported browse custom
+     * actions for the {@link MediaBrowserCompat.MediaItem}.
+     *
+     * <p>Each value action in this list must be an action ID defined in
+     * {@linkplain MediaBrowserServiceCompat.BrowserRoot browser root} with {@link Bundle} key
+     * {@link MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST}.
+     *
+     * <p> TYPE: ArrayList<String>, list of String custom browser action IDs.
+     *
+     * @see MediaDescriptionCompat#getExtras()
+     * @see MediaDescriptionCompat.Builder#setExtras(Bundle)
+     * @see MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+     */
+    public static final String DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST =
+            "android.media.extra.CUSTOM_BROWSER_ACTION_ID_LIST";
+
+    /**
+     * {@link Bundle} key used to define the ID for a custom browser action.
+     *
+     * <p>TYPE: String, String ID for a custom browser action.
+     *
+     * @see MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+     * @see MediaConstants#DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ID =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ID";
+
+    /**
+     * {@link Bundle} key used to define the label for a custom browser action. Label is a localized
+     * string that labels the action for the user.
+     *
+     * <p>TYPE: String, String label for a custom browser action. This must be localized.
+     *
+     * @see MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+     * @see MediaConstants#DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_LABEL =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_LABEL";
+    /**
+     * {@link Bundle} key used to define the icon URI for a custom browser action.
+     *
+     * <p>TYPE: String, String content provider URI for a tintable vector drawable icon.
+     *
+     * @see MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+     * @see MediaConstants#DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_ICON_URI =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_ICON_URI";
+    /**
+     * {@link Bundle} key used to define an extras bundle for a custom browser action.
+     *
+     * <p>Use {@link Bundle#putBundle(String, Bundle)} on the custom browser action bundle to add
+     * this extras bundle to the custom browser action.
+     *
+     * <p>TYPE: Bundle.
+     *
+     * @see MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+     * @see MediaConstants#DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_EXTRAS =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_EXTRAS";
+    /**
+     * {@link Bundle} key used to define the total number of actions allowed per item. Passed to
+     * {@link MediaBrowserServiceCompat} using
+     * {@link MediaBrowserServiceCompat#onGetRoot(String, int, Bundle)} in root hints bundle.
+     *
+     * <p>Presence and non-zero value of this key in the root hints indicates that custom browse
+     * actions feature is supported. Actions beyond this limit will be truncated.
+     *
+     * <p>TYPE: int, number of actions each item is limited to.
+     *
+     * @see MediaBrowserServiceCompat#onGetRoot(String, int, Bundle)
+     * @see MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
+     * @see MediaConstants#DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
+     */
+    public static final String BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT =
+            "androidx.media.MediaBrowserCompat.CUSTOM_BROWSER_ACTION_LIMIT";
+
+    /**
+     * {@link Bundle} key used to define the ID of the {@link MediaBrowserCompat.MediaItem}
+     * associated with the invoked action.
+     *
+     * <p>A {@link MediaBrowserCompat} that supports custom browser actions can set this key
+     * in the parameter extra bundle when using
+     * {@link MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)}.
+     *
+     * <p>A {@link MediaBrowserServiceCompat} that supports custom browser actions should override
+     * {@link MediaBrowserServiceCompat#onCustomAction(
+     * String, Bundle, MediaBrowserServiceCompat.Result)} to receive extras bundle set by
+     * {@link MediaBrowserCompat media browsers}.
+     *
+     * <p>TYPE: string, string ID of the {@link MediaBrowserCompat.MediaItem} on which the custom
+     * action was invoked.
+     *
+     * @see
+     * MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)
+     * @see
+     * MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID";
+    /**
+     * {@link Bundle} key set in custom browser action extra bundle or
+     * {@link MediaBrowserServiceCompat.Result} to indicate which browse node should be displayed
+     * next.
+     *
+     * <p>A {@link MediaBrowserServiceCompat} that supports custom browser actions can set this key
+     * in the {@link MediaBrowserServiceCompat.Result} passed in
+     * {@link MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)}.
+     *
+     * If this key is present in a {@link MediaBrowserCompat.CustomActionCallback} data
+     * {@link Bundle} the {@link MediaBrowserCompat} will update the current browse root when
+     * {@link MediaBrowserCompat.CustomActionCallback#onProgressUpdate(String, Bundle, Bundle)} or
+     * {@link MediaBrowserCompat.CustomActionCallback#onResult(String, Bundle, Bundle)} is called by
+     * the {@link MediaBrowserServiceCompat}.
+     *
+     * <p>TYPE: string, string {@link MediaBrowserCompat.MediaItem} ID to set as new browse node.
+     *
+     * @see
+     * MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)
+     * @see MediaBrowserCompat.CustomActionCallback
+     * @see
+     * MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE";
+
+    /**
+     * {@link Bundle} key set in custom browser action extra bundle or
+     * {@link MediaBrowserServiceCompat.Result} to show the playing item.
+     *
+     * <p>A {@link MediaBrowserServiceCompat} that supports custom browser actions can set this key
+     * in the
+     * {@link MediaBrowserServiceCompat.Result} passed in
+     * {@link MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)}.
+     *
+     * <p>If this key is present in {@link MediaBrowserCompat.CustomActionCallback}
+     * {@link MediaBrowserServiceCompat.Result}, the currently playing item will be shown
+     * when result is handled by {@link MediaBrowserCompat}.
+     *
+     * <P>TYPE: string, string {@link MediaBrowserCompat.MediaItem} ID of item to show, or if no
+     * value is set then show currently playing
+     * {@link MediaBrowserCompat.MediaItem}
+     *
+     * @see
+     * MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)
+     * @see MediaBrowserCompat.CustomActionCallback
+     * @see
+     * MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM";
+
+    /**
+     * {@link Bundle} key set in custom browser action extra bundle or
+     * {@link MediaBrowserServiceCompat.Result} to refresh a
+     * {@link MediaBrowserCompat.MediaItem} in the browse tree.
+     *
+     * <p>A {@link MediaBrowserServiceCompat} that supports custom browser actions can set this key
+     * in the {@link MediaBrowserServiceCompat.Result} passed in
+     * {@link MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)}.
+     *
+     * <p>A {@link MediaBrowserCompat} that supports custom browser actions will refresh
+     * the items custom browser action IDs by using
+     * {@link MediaBrowserCompat#getItem(String, MediaBrowserCompat.ItemCallback)}.
+     * A {@link MediaBrowserServiceCompat} that supports custom browser actions  must implement
+     * {@link MediaBrowserServiceCompat#onLoadItem(String, MediaBrowserServiceCompat.Result)} in
+     * order to refresh actions in an item.
+     *
+     * The key in the action result bundle will trigger the item refresh
+     * when the {@link MediaBrowserCompat.CustomActionCallback} is called, which is passed
+     * to the {@link MediaBrowserServiceCompat} using
+     * {@link MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)}
+     *
+     * <p>TYPE: string, string {@link MediaBrowserCompat.MediaItem} ID to refresh.
+     *
+     * @see
+     * MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)
+     * @see MediaBrowserCompat.CustomActionCallback
+     * @see
+     * MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM";
+    /**
+     * {@link Bundle} key set in custom browser action extra bundle or
+     * {@link MediaBrowserServiceCompat.Result} to set a message for user.
+     *
+     * <p>A {@link MediaBrowserServiceCompat} that supports custom browser actions can set this key
+     * in the {@link MediaBrowserServiceCompat.Result} passed in
+     * {@link MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)}.
+     *
+     * The key in the action result bundle will trigger the message
+     * handling when the {@link MediaBrowserCompat.CustomActionCallback} is called, which is passed
+     * to the {@link MediaBrowserServiceCompat} using
+     * {@link MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)}
+     *
+     * <p>TYPE: string, localized message string to show user.
+     *
+     * @see
+     * MediaBrowserCompat#sendCustomAction(String, Bundle, MediaBrowserCompat.CustomActionCallback)
+     * @see MediaBrowserCompat.CustomActionCallback
+     * @see
+     * MediaBrowserServiceCompat#onCustomAction(String, Bundle, MediaBrowserServiceCompat.Result)
+     */
+    public static final String EXTRA_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE =
+            "androidx.media.utils.extra.KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE";
+
+    /**
+     * Bundle key used for the media ID in {@link PlaybackStateCompat playback state} extras. It's
      * for associating the playback state with the media being played so the value is expected to be
      * same with {@link MediaMetadataCompat#METADATA_KEY_MEDIA_ID media id} of the current metadata.
      *
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
index 8bf6a2c..642e80f 100644
--- 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
@@ -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="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>
+    <string name="default_notification_channel_name" msgid="7213672915724563695">"Trenutno svira"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Pusti"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Pauziraj"</string>
+    <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Pređi na prethodnu stavku"</string>
+    <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Pređi na sledeću stavku"</string>
 </resources>
diff --git a/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt b/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt
index 38f2292..d6096c6 100644
--- a/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt
+++ b/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt
@@ -451,7 +451,7 @@
                 classSrcDatabase1,
                 classSrcEntity1,
                 classGenDatabase1,
-                classGenDao1
+                classGenDao1,
             )
             assertUnchangedFiles(
                 classSrcDatabase2,
diff --git a/room/room-compiler-processing-testing/build.gradle b/room/room-compiler-processing-testing/build.gradle
index 84229ea..2d1f1e7c 100644
--- a/room/room-compiler-processing-testing/build.gradle
+++ b/room/room-compiler-processing-testing/build.gradle
@@ -50,6 +50,9 @@
     property("kspVersion", libs.versions.ksp.get())
 }
 
+// Remove upon updating to version 8.0 of lint plugin, b/253219347
+tasks.named("compileKotlin").configure { it.dependsOn(writeTestPropsTask) }
+
 java {
     sourceSets {
         main {
diff --git a/samples/MediaRoutingDemo/build.gradle b/samples/MediaRoutingDemo/build.gradle
index 2f4f188..9f763ae 100644
--- a/samples/MediaRoutingDemo/build.gradle
+++ b/samples/MediaRoutingDemo/build.gradle
@@ -6,6 +6,7 @@
 dependencies {
     implementation(project(":appcompat:appcompat"))
     implementation(project(":mediarouter:mediarouter"))
+    implementation(project(":recyclerview:recyclerview"))
     implementation("androidx.concurrent:concurrent-futures:1.1.0")
 }
 
diff --git a/samples/MediaRoutingDemo/src/main/AndroidManifest.xml b/samples/MediaRoutingDemo/src/main/AndroidManifest.xml
index d934be6..f98ad81 100644
--- a/samples/MediaRoutingDemo/src/main/AndroidManifest.xml
+++ b/samples/MediaRoutingDemo/src/main/AndroidManifest.xml
@@ -26,14 +26,14 @@
         android:hardwareAccelerated="true"
         android:icon="@drawable/app_sample_code"
         android:label="@string/activity_sample_code"
-        android:supportsRtl="true">
+        android:supportsRtl="true"
+        android:theme="@style/Theme.SampleMediaRouter">
 
         <activity
             android:name=".activities.MainActivity"
             android:configChanges="orientation|screenSize"
             android:exported="true"
-            android:label="@string/sample_media_router_activity_dark"
-            android:theme="@style/Theme.SampleMediaRouter">
+            android:label="@string/sample_media_router_activity_dark">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="com.example.androidx.SAMPLE_CODE" />
@@ -43,10 +43,10 @@
         </activity>
 
         <activity
-            android:name=".activities.RouteSettingsActivity"
+            android:name=".activities.SettingsActivity"
+            android:configChanges="orientation|screenSize"
             android:exported="true"
-            android:label="@string/sample_media_route_settings_activity"
-            android:theme="@style/Theme.AppCompat.Light">
+            android:label="@string/sample_media_router_activity_dark">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
@@ -69,11 +69,12 @@
         <service
             android:name=".services.SampleDynamicGroupMediaRouteProviderService"
             android:label="@string/sample_media_route_provider_service"
-            android:exported="true"
-            android:process=":dynamic_mrp">
+            android:exported="true">
+
             <intent-filter>
                 <action android:name="android.media.MediaRouteProviderService" />
                 <action android:name="android.media.MediaRoute2ProviderService" />
+                <action android:name="com.example.androidx.mediarouting.BIND_LOCAL" />
             </intent-filter>
         </service>
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
new file mode 100644
index 0000000..25932b8
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.mediarouting;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.example.androidx.mediarouting.data.RouteItem;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Holds the data needed to control the provider for the routes dynamically. */
+public final class RoutesManager {
+
+    private boolean mDynamicRoutingEnabled;
+    private final Map<String, RouteItem> mRouteItems;
+    private static RoutesManager sInstance;
+
+    private RoutesManager() {
+        this.mDynamicRoutingEnabled = true;
+        this.mRouteItems = new HashMap<>();
+    }
+
+    /** Singleton method. */
+    @NonNull
+    public static RoutesManager getInstance() {
+        synchronized (RoutesManager.class) {
+            if (sInstance == null) {
+                sInstance = new RoutesManager();
+            }
+        }
+        return sInstance;
+    }
+
+    @NonNull
+    public List<RouteItem> getRouteItems() {
+        return new ArrayList<>(mRouteItems.values());
+    }
+
+    public boolean isDynamicRoutingEnabled() {
+        return mDynamicRoutingEnabled;
+    }
+
+    public void setDynamicRoutingEnabled(boolean dynamicRoutingEnabled) {
+        this.mDynamicRoutingEnabled = dynamicRoutingEnabled;
+    }
+
+    /**
+     * Deletes the route with the passed id.
+     *
+     * @param id of the route to be deleted.
+     */
+    public void deleteRouteWithId(@NonNull String id) {
+        mRouteItems.remove(id);
+    }
+
+    /**
+     * Gets the route with the passed id or null if not exists.
+     *
+     * @param id of the route to search for.
+     * @return the route with the passed id or null if not exists.
+     */
+    @Nullable
+    public RouteItem getRouteWithId(@NonNull String id) {
+        return mRouteItems.get(id);
+    }
+
+    /** Adds the given route to the manager, replacing any existing route with a matching id. */
+    public void addOrUpdateRoute(@NonNull RouteItem routeItem) {
+        mRouteItems.put(routeItem.getId(), routeItem);
+    }
+}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
index a7f76af..2f4f362 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
@@ -77,13 +77,8 @@
 import java.io.File;
 
 /**
- * <h3>Media Router Support Activity</h3>
- *
- * <p>
- * This demonstrates how to use the {@link MediaRouter} API to build an
- * application that allows the user to send content to various rendering
- * targets.
- * </p>
+ * Demonstrates how to use the {@link MediaRouter} API to build an application that allows the user
+ * to send content to various rendering targets.
  */
 public class MainActivity extends AppCompatActivity {
     private static final String TAG = "MainActivity";
@@ -517,6 +512,15 @@
         return true;
     }
 
+    @Override
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+        if (item.getItemId() == R.id.settings_menu_item) {
+            startActivity(new Intent(this, SettingsActivity.class));
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
     void updateStatusFromSessionManager() {
         if (mPlayer != null && mSessionManager != null) {
             mSessionManager.updateStatus();
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteSettingsActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteSettingsActivity.java
deleted file mode 100644
index 69f3e76..0000000
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteSettingsActivity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.androidx.mediarouting.activities;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.example.androidx.mediarouting.providers.SampleMediaRouteProvider;
-
-/**
- * This activity is a no-op settings activity for the
- * {@link SampleMediaRouteProvider}.
- */
-public class RouteSettingsActivity extends AppCompatActivity {
-
-}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
new file mode 100644
index 0000000..9c40caa
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.mediarouting.activities;
+
+import android.app.AlertDialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
+import android.widget.Switch;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.mediarouter.media.MediaRouter;
+import androidx.mediarouter.media.MediaRouterParams;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.androidx.mediarouting.R;
+import com.example.androidx.mediarouting.RoutesManager;
+import com.example.androidx.mediarouting.services.SampleDynamicGroupMediaRouteProviderService;
+import com.example.androidx.mediarouting.ui.RoutesAdapter;
+
+/**
+ * Allows the user to control dialog types, enabling or disabling Dynamic Groups, enabling or
+ * disabling transfer to local and customize the routes exposed by {@link
+ * SampleDynamicGroupMediaRouteProviderService}.
+ */
+public final class SettingsActivity extends AppCompatActivity {
+    private MediaRouter mMediaRouter;
+    private RoutesManager mRoutesManager;
+    private RoutesAdapter mRoutesAdapter;
+    private RoutesAdapter.RouteItemListener mRouteItemListener;
+    private SampleDynamicGroupMediaRouteProviderService mService;
+    private ServiceConnection mConnection;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_settings);
+
+        mMediaRouter = MediaRouter.getInstance(this);
+
+        mRoutesManager = RoutesManager.getInstance();
+
+        mConnection = new ProviderServiceConnection();
+
+        setUpDynamicGroupsEnabledSwitch();
+        setUpTransferToLocalSwitch();
+        setUpDialogTypeDropDownList();
+
+        mRouteItemListener =
+                new RoutesAdapter.RouteItemListener() {
+                    @Override
+                    public void onRouteEditClick(@NonNull String routeId) {
+                        // TODO: Navigate to a new editing screen in a different CL
+                    }
+
+                    @Override
+                    public void onRouteDeleteClick(@NonNull String routeId) {
+                        new AlertDialog.Builder(SettingsActivity.this)
+                                .setTitle("Delete this route?")
+                                .setMessage("Are you sure you want to delete this route?")
+                                .setPositiveButton(android.R.string.cancel, null)
+                                .setNegativeButton(
+                                        android.R.string.ok,
+                                        (dialogInterface, i) -> {
+                                            mRoutesManager.deleteRouteWithId(routeId);
+                                            mService.reloadRoutes();
+                                            mRoutesAdapter.updateRoutes(
+                                                    mRoutesManager.getRouteItems());
+                                        })
+                                .show();
+                    }
+                };
+
+        RecyclerView routeList = findViewById(R.id.routes_recycler_view);
+        routeList.setLayoutManager(new LinearLayoutManager(/* context */ this));
+        mRoutesAdapter = new RoutesAdapter(mRoutesManager.getRouteItems(), mRouteItemListener);
+        routeList.setAdapter(mRoutesAdapter);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        // Bind to SampleDynamicGroupMediaRouteProviderService
+        Intent intent = new Intent(this, SampleDynamicGroupMediaRouteProviderService.class);
+        intent.setAction(SampleDynamicGroupMediaRouteProviderService.ACTION_BIND_LOCAL);
+        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mRoutesAdapter.updateRoutes(mRoutesManager.getRouteItems());
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        unbindService(mConnection);
+    }
+
+    private void setUpDynamicGroupsEnabledSwitch() {
+        Switch dynamicRoutingEnabled = findViewById(R.id.dynamic_routing_switch);
+        dynamicRoutingEnabled.setChecked(mRoutesManager.isDynamicRoutingEnabled());
+        dynamicRoutingEnabled.setOnCheckedChangeListener(
+                (compoundButton, b) -> {
+                    mRoutesManager.setDynamicRoutingEnabled(b);
+                    mService.reloadDynamicRoutesEnabled();
+                });
+    }
+
+    private void setUpTransferToLocalSwitch() {
+        Switch showThisPhoneSwitch = findViewById(R.id.show_this_phone_switch);
+        showThisPhoneSwitch.setChecked(mMediaRouter.getRouterParams().isTransferToLocalEnabled());
+        showThisPhoneSwitch.setOnCheckedChangeListener(
+                (compoundButton, b) -> {
+                    MediaRouterParams.Builder builder =
+                            new MediaRouterParams.Builder(mMediaRouter.getRouterParams());
+                    builder.setTransferToLocalEnabled(b);
+                    mMediaRouter.setRouterParams(builder.build());
+                });
+    }
+
+    private void setUpDialogTypeDropDownList() {
+        Spinner spinner = findViewById(R.id.dialog_spinner);
+        spinner.setOnItemSelectedListener(
+                new AdapterView.OnItemSelectedListener() {
+                    @Override
+                    public void onItemSelected(
+                            AdapterView<?> adapterView, View view, int i, long l) {
+                        MediaRouterParams.Builder builder =
+                                new MediaRouterParams.Builder(mMediaRouter.getRouterParams());
+                        if (i == 0) {
+                            builder.setDialogType(MediaRouterParams.DIALOG_TYPE_DEFAULT)
+                                    .setOutputSwitcherEnabled(false);
+                            mMediaRouter.setRouterParams(builder.build());
+                        } else if (i == 1) {
+                            builder.setDialogType(MediaRouterParams.DIALOG_TYPE_DYNAMIC_GROUP)
+                                    .setOutputSwitcherEnabled(false);
+                            mMediaRouter.setRouterParams(builder.build());
+                        } else if (i == 2) {
+                            builder.setOutputSwitcherEnabled(true);
+                            mMediaRouter.setRouterParams(builder.build());
+                        }
+                    }
+
+                    @Override
+                    public void onNothingSelected(AdapterView<?> adapterView) {}
+                });
+
+        // Create an ArrayAdapter using the string array and a default spinner layout
+        ArrayAdapter<CharSequence> adapter =
+                ArrayAdapter.createFromResource(
+                        this, R.array.dialog_types_array, android.R.layout.simple_spinner_item);
+        // Specify the layout to use when the list of choices appears
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        // Apply the adapter to the spinner
+        spinner.setAdapter(adapter);
+        if (mMediaRouter.getRouterParams().isOutputSwitcherEnabled()) {
+            spinner.setSelection(2);
+        } else if (mMediaRouter.getRouterParams().getDialogType()
+                == MediaRouterParams.DIALOG_TYPE_DYNAMIC_GROUP) {
+            spinner.setSelection(1);
+        }
+    }
+
+    private class ProviderServiceConnection implements ServiceConnection {
+
+        @Override
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            SampleDynamicGroupMediaRouteProviderService.LocalBinder binder =
+                    (SampleDynamicGroupMediaRouteProviderService.LocalBinder) service;
+            mService = binder.getService();
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName arg0) {
+            mService = null;
+        }
+    }
+}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
new file mode 100644
index 0000000..7e80d86
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.mediarouting.data;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/** RouteItem helps keep track of the current app controlled routes. */
+public final class RouteItem {
+
+    private String mId;
+    private String mName;
+    private String mDescription;
+    private ControlFilter mControlFilter;
+    private PlaybackStream mPlaybackStream;
+    private PlaybackType mPlaybackType;
+    private boolean mCanDisconnect;
+    private VolumeHandling mVolumeHandling;
+    private int mVolume;
+    private int mVolumeMax;
+    private DeviceType mDeviceType;
+    private List<String> mGroupMemberIds;
+
+    public RouteItem() {
+        this.mId = UUID.randomUUID().toString();
+        this.mName = "";
+        this.mDescription = "";
+        this.mControlFilter = ControlFilter.BASIC;
+        this.mPlaybackStream = PlaybackStream.MUSIC;
+        this.mPlaybackType = PlaybackType.REMOTE;
+        this.mVolumeHandling = VolumeHandling.FIXED;
+        this.mVolume = 5;
+        this.mVolumeMax = 25;
+        this.mDeviceType = DeviceType.UNKNOWN;
+        this.mCanDisconnect = false;
+        this.mGroupMemberIds = new ArrayList<>();
+    }
+
+    public enum ControlFilter {
+        BASIC,
+        QUEUE,
+        SESSION
+    }
+
+    public enum PlaybackStream {
+        ACCESSIBILITY,
+        ALARM,
+        DTMF,
+        MUSIC,
+        NOTIFICATION,
+        RING,
+        SYSTEM,
+        VOICE_CALL
+    }
+
+    public enum PlaybackType {
+        LOCAL,
+        REMOTE
+    }
+
+    public enum VolumeHandling {
+        FIXED,
+        VARIABLE
+    }
+
+    public enum DeviceType {
+        TV,
+        SPEAKER,
+        BLUETOOTH,
+        UNKNOWN
+    }
+
+    @NonNull
+    public String getId() {
+        return mId;
+    }
+
+    public void setId(@NonNull String id) {
+        mId = id;
+    }
+
+    @NonNull
+    public String getName() {
+        return mName;
+    }
+
+    public void setName(@NonNull String name) {
+        mName = name;
+    }
+
+    @NonNull
+    public String getDescription() {
+        return mDescription;
+    }
+
+    public void setDescription(@NonNull String description) {
+        mDescription = description;
+    }
+
+    @NonNull
+    public ControlFilter getControlFilter() {
+        return mControlFilter;
+    }
+
+    public void setControlFilter(@NonNull ControlFilter controlFilter) {
+        mControlFilter = controlFilter;
+    }
+
+    @NonNull
+    public PlaybackStream getPlaybackStream() {
+        return mPlaybackStream;
+    }
+
+    public void setPlaybackStream(@NonNull PlaybackStream playbackStream) {
+        mPlaybackStream = playbackStream;
+    }
+
+    @NonNull
+    public PlaybackType getPlaybackType() {
+        return mPlaybackType;
+    }
+
+    public void setPlaybackType(@NonNull PlaybackType playbackType) {
+        mPlaybackType = playbackType;
+    }
+
+    public boolean isCanDisconnect() {
+        return mCanDisconnect;
+    }
+
+    public void setCanDisconnect(boolean canDisconnect) {
+        mCanDisconnect = canDisconnect;
+    }
+
+    @NonNull
+    public VolumeHandling getVolumeHandling() {
+        return mVolumeHandling;
+    }
+
+    public void setVolumeHandling(@NonNull VolumeHandling volumeHandling) {
+        mVolumeHandling = volumeHandling;
+    }
+
+    public int getVolume() {
+        return mVolume;
+    }
+
+    public void setVolume(int volume) {
+        mVolume = volume;
+    }
+
+    public int getVolumeMax() {
+        return mVolumeMax;
+    }
+
+    public void setVolumeMax(int volumeMax) {
+        mVolumeMax = volumeMax;
+    }
+
+    @NonNull
+    public DeviceType getDeviceType() {
+        return mDeviceType;
+    }
+
+    public void setDeviceType(@NonNull DeviceType deviceType) {
+        mDeviceType = deviceType;
+    }
+
+    @NonNull
+    public List<String> getGroupMemberIds() {
+        return mGroupMemberIds;
+    }
+
+    public void setGroupMemberIds(@NonNull List<String> groupMemberIds) {
+        mGroupMemberIds = groupMemberIds;
+    }
+}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
index a56861f..baf3cfec 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
@@ -19,8 +19,8 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.IntentSender;
-import android.content.res.Resources;
 import android.media.AudioManager;
 import android.media.MediaRouter;
 import android.util.Log;
@@ -34,12 +34,14 @@
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 
-import com.example.androidx.mediarouting.R;
-import com.example.androidx.mediarouting.activities.RouteSettingsActivity;
+import com.example.androidx.mediarouting.RoutesManager;
+import com.example.androidx.mediarouting.activities.SettingsActivity;
+import com.example.androidx.mediarouting.data.RouteItem;
 import com.example.androidx.mediarouting.services.SampleDynamicGroupMediaRouteProviderService;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -53,9 +55,6 @@
 public final class SampleDynamicGroupMediaRouteProvider extends SampleMediaRouteProvider {
     private static final String TAG = "SampleDynamicGroupMrp";
     static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
-    private static final String FIXED_VOLUME_ROUTE_ID = "fixed";
-    private static final String VARIABLE_VOLUME_BASIC_ROUTE_ID = "variable_basic";
     private static final String STATIC_GROUP_ROUTE_ID = "static_group";
     private static final int MAX_GROUPABLE_TV_COUNT = 1;
 
@@ -102,14 +101,6 @@
         return controller;
     }
 
-    private String generateUniqueId() {
-        String routeId;
-        do {
-            routeId = UUID.randomUUID().toString();
-        } while (mRouteDescriptors.containsKey(routeId));
-        return routeId;
-    }
-
     @Nullable
     @Override
     public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@@ -130,135 +121,140 @@
             memberIds.addAll(initialRoute.getGroupMemberIds());
         }
 
-        String groupId = generateUniqueId();
+        String groupId = UUID.randomUUID().toString();
         mDynamicRouteController = new SampleDynamicGroupRouteController(groupId, memberIds);
 
         return mDynamicRouteController;
     }
 
+    /** Reload the provider routes. */
+    public void reloadRoutes() {
+        initializeRoutes();
+        publishRoutes();
+    }
+
+    /** Reload the isDynamicRouteEnabled flag. */
+    public void reloadDynamicRoutesEnabled() {
+        boolean isDynamicRoutesEnabled = RoutesManager.getInstance().isDynamicRoutingEnabled();
+        MediaRouteProviderDescriptor providerDescriptor =
+                new MediaRouteProviderDescriptor.Builder(getDescriptor())
+                        .setSupportsDynamicGroupRoute(isDynamicRoutesEnabled)
+                        .build();
+        setDescriptor(providerDescriptor);
+    }
+
     @Override
     protected void initializeRoutes() {
-        Resources r = getContext().getResources();
+        mVolumes = new ArrayMap<>();
+        mRouteDescriptors = new HashMap<>();
         Intent settingsIntent = new Intent(Intent.ACTION_MAIN);
-        settingsIntent.setClass(getContext(), RouteSettingsActivity.class)
+        settingsIntent
+                .setClass(getContext(), SettingsActivity.class)
                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         IntentSender is = PendingIntent.getActivity(getContext(), 99, settingsIntent,
                 PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE).getIntentSender();
 
-        mVolumes.put(VARIABLE_VOLUME_BASIC_ROUTE_ID + "1", VOLUME_DEFAULT);
-        mVolumes.put(VARIABLE_VOLUME_BASIC_ROUTE_ID + "2", VOLUME_DEFAULT);
-        mVolumes.put(VARIABLE_VOLUME_BASIC_ROUTE_ID + "3", VOLUME_DEFAULT);
-        mVolumes.put(VARIABLE_VOLUME_BASIC_ROUTE_ID + "4", VOLUME_DEFAULT);
-        mVolumes.put(FIXED_VOLUME_ROUTE_ID, VOLUME_DEFAULT);
-        mVolumes.put(STATIC_GROUP_ROUTE_ID, VOLUME_DEFAULT);
-
-        MediaRouteDescriptor routeDescriptor1 = new MediaRouteDescriptor.Builder(
-                VARIABLE_VOLUME_BASIC_ROUTE_ID + "1",
-                r.getString(R.string.dg_tv_route_name1))
-                .setDescription(r.getString(R.string.sample_route_description))
-                .addControlFilters(CONTROL_FILTERS_BASIC)
-                .setDeviceType(MediaRouter.RouteInfo.DEVICE_TYPE_TV)
-                .setPlaybackStream(AudioManager.STREAM_MUSIC)
-                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
-                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
-                .setVolumeMax(VOLUME_MAX)
-                .setVolume(VOLUME_DEFAULT)
-                .setCanDisconnect(true)
-                .setSettingsActivity(is)
-                .build();
-
-        MediaRouteDescriptor routeDescriptor2 = new MediaRouteDescriptor.Builder(
-                VARIABLE_VOLUME_BASIC_ROUTE_ID + "2",
-                r.getString(R.string.dg_tv_route_name2))
-                .setDescription(r.getString(R.string.sample_route_description))
-                .addControlFilters(CONTROL_FILTERS_BASIC)
-                .setDeviceType(MediaRouter.RouteInfo.DEVICE_TYPE_TV)
-                .setPlaybackStream(AudioManager.STREAM_MUSIC)
-                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
-                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
-                .setVolumeMax(VOLUME_MAX)
-                .setVolume(VOLUME_DEFAULT)
-                .setCanDisconnect(true)
-                .setSettingsActivity(is)
-                .build();
-
-        MediaRouteDescriptor routeDescriptor3 = new MediaRouteDescriptor.Builder(
-                VARIABLE_VOLUME_BASIC_ROUTE_ID + "3",
-                r.getString(R.string.dg_speaker_route_name3))
-                .setDescription(r.getString(R.string.sample_route_description))
-                .addControlFilters(CONTROL_FILTERS_BASIC)
-                .setDeviceType(MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER)
-                .setPlaybackStream(AudioManager.STREAM_MUSIC)
-                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
-                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
-                .setVolumeMax(VOLUME_MAX)
-                .setVolume(VOLUME_DEFAULT)
-                .setCanDisconnect(true)
-                .setSettingsActivity(is)
-                .build();
-
-        MediaRouteDescriptor routeDescriptor4 = new MediaRouteDescriptor.Builder(
-                VARIABLE_VOLUME_BASIC_ROUTE_ID + "4",
-                r.getString(R.string.dg_speaker_route_name4))
-                .setDescription(r.getString(R.string.sample_route_description))
-                .addControlFilters(CONTROL_FILTERS_BASIC)
-                .setDeviceType(MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER)
-                .setPlaybackStream(AudioManager.STREAM_MUSIC)
-                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
-                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
-                .setVolumeMax(VOLUME_MAX)
-                .setVolume(VOLUME_DEFAULT)
-                .setCanDisconnect(true)
-                .setSettingsActivity(is)
-                .build();
-
-        MediaRouteDescriptor routeDescriptor5 = new MediaRouteDescriptor.Builder(
-                FIXED_VOLUME_ROUTE_ID,
-                r.getString(R.string.dg_not_unselectable_route_name5))
-                .setDescription(r.getString(R.string.sample_route_description))
-                .addControlFilters(CONTROL_FILTERS_BASIC)
-                .setPlaybackStream(AudioManager.STREAM_MUSIC)
-                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
-                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED)
-                .setVolumeMax(VOLUME_MAX)
-                .setVolume(VOLUME_MAX)
-                .setCanDisconnect(true)
-                .setSettingsActivity(is)
-                .build();
-
-        MediaRouteDescriptor routeDescriptor6 = new MediaRouteDescriptor.Builder(
-                STATIC_GROUP_ROUTE_ID,
-                r.getString(R.string.dg_static_group_route_name6))
-                .setDescription(r.getString(R.string.sample_route_description))
-                .addControlFilters(CONTROL_FILTERS_BASIC)
-                .addGroupMemberId(routeDescriptor1.getId())
-                .addGroupMemberId(routeDescriptor3.getId())
-                .setPlaybackStream(AudioManager.STREAM_MUSIC)
-                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
-                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED)
-                .setVolumeMax(VOLUME_MAX)
-                .setVolume(VOLUME_MAX)
-                .setCanDisconnect(true)
-                .setSettingsActivity(is)
-                .build();
-
-        mRouteDescriptors.put(routeDescriptor1.getId(), routeDescriptor1);
-        mRouteDescriptors.put(routeDescriptor2.getId(), routeDescriptor2);
-        mRouteDescriptors.put(routeDescriptor3.getId(), routeDescriptor3);
-        mRouteDescriptors.put(routeDescriptor4.getId(), routeDescriptor4);
-        mRouteDescriptors.put(routeDescriptor5.getId(), routeDescriptor5);
-        mRouteDescriptors.put(routeDescriptor6.getId(), routeDescriptor6);
+        List<RouteItem> routeItems = RoutesManager.getInstance().getRouteItems();
+        for (RouteItem routeItem : routeItems) {
+            MediaRouteDescriptor routeDescriptor = buildRouteDescriptor(routeItem, is);
+            mVolumes.put(routeItem.getId(), routeItem.getVolume());
+            mRouteDescriptors.put(routeItem.getId(), routeDescriptor);
+        }
     }
 
     @Override
     protected void publishRoutes() {
-        MediaRouteProviderDescriptor providerDescriptor = new MediaRouteProviderDescriptor.Builder()
-                .setSupportsDynamicGroupRoute(true)
-                .addRoutes(mRouteDescriptors.values())
-                .build();
+        MediaRouteProviderDescriptor providerDescriptor =
+                new MediaRouteProviderDescriptor.Builder()
+                        .setSupportsDynamicGroupRoute(true)
+                        .addRoutes(mRouteDescriptors.values())
+                        .build();
         setDescriptor(providerDescriptor);
     }
 
+    private MediaRouteDescriptor buildRouteDescriptor(RouteItem routeItem, IntentSender is) {
+        return new MediaRouteDescriptor.Builder(routeItem.getId(), routeItem.getName())
+                .setDescription(routeItem.getDescription())
+                .addControlFilters(getControlFilters(routeItem.getControlFilter()))
+                .setPlaybackStream(getPlaybackStream(routeItem.getPlaybackStream()))
+                .setPlaybackType(getPlaybackType(routeItem.getPlaybackType()))
+                .setVolumeHandling(getVolumeHandling(routeItem.getVolumeHandling()))
+                .setDeviceType(getDeviceType(routeItem.getDeviceType()))
+                .setVolumeMax(routeItem.getVolumeMax())
+                .setVolume(routeItem.getVolume())
+                .setCanDisconnect(routeItem.isCanDisconnect())
+                .setSettingsActivity(is)
+                .build();
+    }
+
+    private int getPlaybackStream(RouteItem.PlaybackStream playBackStream) {
+        switch (playBackStream) {
+            case ACCESSIBILITY:
+                return AudioManager.STREAM_ACCESSIBILITY;
+            case ALARM:
+                return AudioManager.STREAM_ALARM;
+            case DTMF:
+                return AudioManager.STREAM_DTMF;
+            case MUSIC:
+                return AudioManager.STREAM_MUSIC;
+            case NOTIFICATION:
+                return AudioManager.STREAM_NOTIFICATION;
+            case RING:
+                return AudioManager.STREAM_RING;
+            case SYSTEM:
+                return AudioManager.STREAM_SYSTEM;
+            case VOICE_CALL:
+                return AudioManager.STREAM_VOICE_CALL;
+        }
+        return AudioManager.STREAM_MUSIC;
+    }
+
+    private int getPlaybackType(RouteItem.PlaybackType playBackType) {
+        switch (playBackType) {
+            case LOCAL:
+                return MediaRouter.RouteInfo.PLAYBACK_TYPE_LOCAL;
+            case REMOTE:
+                return MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE;
+        }
+        return MediaRouter.RouteInfo.PLAYBACK_TYPE_LOCAL;
+    }
+
+    private int getVolumeHandling(RouteItem.VolumeHandling volumeHandling) {
+        switch (volumeHandling) {
+            case FIXED:
+                return MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
+            case VARIABLE:
+                return MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE;
+        }
+        return MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
+    }
+
+    private List<IntentFilter> getControlFilters(RouteItem.ControlFilter controlFilter) {
+        switch (controlFilter) {
+            case BASIC:
+                return CONTROL_FILTERS_BASIC;
+            case QUEUE:
+                return CONTROL_FILTERS_QUEUING;
+            case SESSION:
+                return CONTROL_FILTERS_SESSION;
+        }
+        return new ArrayList<>();
+    }
+
+    private int getDeviceType(RouteItem.DeviceType deviceType) {
+        switch (deviceType) {
+            case SPEAKER:
+                return MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER;
+            case BLUETOOTH:
+                return MediaRouter.RouteInfo.DEVICE_TYPE_BLUETOOTH;
+            case TV:
+                return MediaRouter.RouteInfo.DEVICE_TYPE_TV;
+            case UNKNOWN:
+                return MediaRouter.RouteInfo.DEVICE_TYPE_UNKNOWN;
+        }
+        return MediaRouter.RouteInfo.DEVICE_TYPE_UNKNOWN;
+    }
+
     final class SampleDynamicGroupRouteController
             extends MediaRouteProvider.DynamicGroupRouteController {
         private final String mRouteId;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
index d5c1def..b10fabb 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
@@ -45,7 +45,7 @@
 import androidx.mediarouter.media.MediaSessionStatus;
 
 import com.example.androidx.mediarouting.R;
-import com.example.androidx.mediarouting.activities.RouteSettingsActivity;
+import com.example.androidx.mediarouting.activities.SettingsActivity;
 import com.example.androidx.mediarouting.data.PlaylistItem;
 import com.example.androidx.mediarouting.player.Player;
 import com.example.androidx.mediarouting.services.SampleMediaRouteProviderService;
@@ -53,6 +53,7 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -94,9 +95,9 @@
     public static final String EXTRA_SNAPSHOT =
             "com.example.androidx.media.extra.SNAPSHOT";
 
-    protected static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
-    protected static final ArrayList<IntentFilter> CONTROL_FILTERS_QUEUING;
-    protected static final ArrayList<IntentFilter> CONTROL_FILTERS_SESSION;
+    protected static final List<IntentFilter> CONTROL_FILTERS_BASIC;
+    protected static final List<IntentFilter> CONTROL_FILTERS_QUEUING;
+    protected static final List<IntentFilter> CONTROL_FILTERS_SESSION;
 
     static {
         IntentFilter f1 = new IntentFilter();
@@ -181,7 +182,8 @@
     protected void initializeRoutes() {
         Resources r = getContext().getResources();
         Intent settingsIntent = new Intent(Intent.ACTION_MAIN);
-        settingsIntent.setClass(getContext(), RouteSettingsActivity.class)
+        settingsIntent
+                .setClass(getContext(), SettingsActivity.class)
                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         int pendingIntentFlagMutable = Build.VERSION.SDK_INT >= 31 ? PendingIntent.FLAG_MUTABLE : 0;
         IntentSender is = PendingIntent.getActivity(getContext(), 99, settingsIntent,
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
index 2fc2ba7..658c256 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
@@ -16,7 +16,12 @@
 
 package com.example.androidx.mediarouting.services;
 
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaRouteProvider;
 import androidx.mediarouter.media.MediaRouteProviderService;
 
@@ -29,9 +34,46 @@
  * @see SampleDynamicGroupMediaRouteProvider
  */
 public class SampleDynamicGroupMediaRouteProviderService extends MediaRouteProviderService {
+
+    public static final String ACTION_BIND_LOCAL = "com.example.androidx.mediarouting.BIND_LOCAL";
+
+    private SampleDynamicGroupMediaRouteProvider mDynamicGroupMediaRouteProvider;
+
     @NonNull
     @Override
     public MediaRouteProvider onCreateMediaRouteProvider() {
-        return new SampleDynamicGroupMediaRouteProvider(this);
+        mDynamicGroupMediaRouteProvider = new SampleDynamicGroupMediaRouteProvider(this);
+        return mDynamicGroupMediaRouteProvider;
+    }
+
+    @Nullable
+    @Override
+    public IBinder onBind(@NonNull Intent intent) {
+        if (intent != null && ACTION_BIND_LOCAL.equals(intent.getAction())) {
+            return new LocalBinder();
+        } else {
+            return super.onBind(intent);
+        }
+    }
+
+    /** Reload all routes provided by this service. */
+    public void reloadRoutes() {
+        mDynamicGroupMediaRouteProvider.reloadRoutes();
+    }
+
+    /** Reload the flag for isDynamicRouteEnabled. */
+    public void reloadDynamicRoutesEnabled() {
+        mDynamicGroupMediaRouteProvider.reloadDynamicRoutesEnabled();
+    }
+
+    /**
+     * Allows getting a direct reference to {@link SampleDynamicGroupMediaRouteProviderService} from
+     * bindings within the same process.
+     */
+    public class LocalBinder extends Binder {
+        @NonNull
+        public SampleDynamicGroupMediaRouteProviderService getService() {
+            return SampleDynamicGroupMediaRouteProviderService.this;
+        }
     }
 }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
new file mode 100644
index 0000000..bec91d6
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.mediarouting.ui;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.androidx.mediarouting.R;
+import com.example.androidx.mediarouting.data.RouteItem;
+
+import java.util.List;
+
+/** {@link RecyclerView.Adapter} for showing routes in the settings screen */
+public final class RoutesAdapter extends RecyclerView.Adapter<RoutesAdapter.RouteViewHolder> {
+
+    private List<RouteItem> mRouteItems;
+    private final RouteItemListener mRouteItemListener;
+
+    public RoutesAdapter(
+            @NonNull List<RouteItem> routeItems, @NonNull RouteItemListener routeItemListener) {
+        this.mRouteItems = routeItems;
+        this.mRouteItemListener = routeItemListener;
+    }
+
+    @NonNull
+    @Override
+    public RouteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view =
+                LayoutInflater.from(parent.getContext())
+                        .inflate(R.layout.route_item, parent, false);
+        return new RouteViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RouteViewHolder holder, int position) {
+        holder.bind(mRouteItems.get(position), mRouteItemListener);
+    }
+
+    @Override
+    public int getItemCount() {
+        return mRouteItems.size();
+    }
+
+    /**
+     * Updates the list of routes with new list.
+     *
+     * @param routeItems to replace the existing list in the adapter.
+     */
+    public void updateRoutes(@NonNull List<RouteItem> routeItems) {
+        this.mRouteItems = routeItems;
+        notifyDataSetChanged();
+    }
+
+    /** ViewHolder for the route item */
+    static class RouteViewHolder extends RecyclerView.ViewHolder {
+
+        private final TextView mNameTextView;
+        private final TextView mDescriptionTextView;
+        private final ImageButton mEditButton;
+        private final ImageButton mDeleteButton;
+
+        RouteViewHolder(@NonNull View itemView) {
+            super(itemView);
+            mNameTextView = itemView.findViewById(R.id.name_textview);
+            mDescriptionTextView = itemView.findViewById(R.id.description_textview);
+            mEditButton = itemView.findViewById(R.id.edit_button);
+            mDeleteButton = itemView.findViewById(R.id.delete_button);
+        }
+
+        void bind(RouteItem routeItem, RouteItemListener routeItemListener) {
+            mNameTextView.setText(routeItem.getName());
+            mDescriptionTextView.setText(routeItem.getDescription());
+
+            mEditButton.setOnClickListener(
+                    view -> {
+                        routeItemListener.onRouteEditClick(routeItem.getId());
+                    });
+
+            mDeleteButton.setOnClickListener(
+                    view -> routeItemListener.onRouteDeleteClick(routeItem.getId()));
+        }
+    }
+
+    /** Listener to pass action callbacks to the route item viewholder */
+    public interface RouteItemListener {
+        /**
+         * Called when route's edit button is clicked
+         *
+         * @param routeId whose edit button is clicked
+         */
+        void onRouteEditClick(@NonNull String routeId);
+
+        /**
+         * Called when route's delete button is clicked
+         *
+         * @param routeId whose delete button is clicked
+         */
+        void onRouteDeleteClick(@NonNull String routeId);
+    }
+}
diff --git a/samples/MediaRoutingDemo/src/main/res/drawable/ic_delete.xml b/samples/MediaRoutingDemo/src/main/res/drawable/ic_delete.xml
new file mode 100644
index 0000000..b22b7fd
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/res/drawable/ic_delete.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
+</vector>
diff --git a/samples/MediaRoutingDemo/src/main/res/drawable/ic_edit.xml b/samples/MediaRoutingDemo/src/main/res/drawable/ic_edit.xml
new file mode 100644
index 0000000..89f261b
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/res/drawable/ic_edit.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
+</vector>
diff --git a/samples/MediaRoutingDemo/src/main/res/layout/activity_settings.xml b/samples/MediaRoutingDemo/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..9fb6965
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="50dp"
+                android:layout_margin="12dp"
+                android:padding="4dp">
+
+                <Switch
+                    android:id="@+id/show_this_phone_switch"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentEnd="true"
+                    android:layout_alignParentRight="true"
+                    android:layout_centerVertical="true" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentLeft="true"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:gravity="center"
+                    android:text="Transfer to local Enabled" />
+
+            </RelativeLayout>
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="50dp"
+                android:layout_margin="12dp"
+                android:padding="4dp">
+
+                <Switch
+                    android:id="@+id/dynamic_routing_switch"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentEnd="true"
+                    android:layout_alignParentRight="true"
+                    android:layout_centerVertical="true" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentLeft="true"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:gravity="center"
+                    android:text="Enable dynamic routing (For next routes only)" />
+
+            </RelativeLayout>
+
+            <RelativeLayout
+                android:layout_width="match_parent"
+                android:layout_height="50dp"
+                android:layout_margin="12dp"
+                android:padding="4dp">
+
+                <Spinner
+                    android:id="@+id/dialog_spinner"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentEnd="true"
+                    android:layout_alignParentRight="true"
+                    android:layout_centerVertical="true" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentLeft="true"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:gravity="center"
+                    android:text="Dialog Type" />
+
+            </RelativeLayout>
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/routes_recycler_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+        </LinearLayout>
+
+    </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/MediaRoutingDemo/src/main/res/layout/route_item.xml b/samples/MediaRoutingDemo/src/main/res/layout/route_item.xml
new file mode 100644
index 0000000..4e1c191
--- /dev/null
+++ b/samples/MediaRoutingDemo/src/main/res/layout/route_item.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Layout for list item in routes list view. Displays ImageButtons
+     instead to the right of the item for edit and delete. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/name_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="left"
+            android:layout_margin="8dp"
+            android:gravity="left"
+            android:textAppearance="?android:attr/textAppearanceLarge" />
+
+        <TextView
+            android:id="@+id/description_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="left"
+            android:layout_margin="8dp"
+            android:gravity="left"
+            android:textAppearance="?android:attr/textAppearanceLarge" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:orientation="horizontal">
+
+        <ImageButton
+            android:id="@+id/edit_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"
+            app:srcCompat="@drawable/ic_edit" />
+
+        <ImageButton
+            android:id="@+id/delete_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"
+            app:srcCompat="@drawable/ic_delete" />
+
+    </LinearLayout>
+
+</RelativeLayout>
diff --git a/samples/MediaRoutingDemo/src/main/res/menu/sample_media_router_menu.xml b/samples/MediaRoutingDemo/src/main/res/menu/sample_media_router_menu.xml
index 53861a1..aef85a3 100644
--- a/samples/MediaRoutingDemo/src/main/res/menu/sample_media_router_menu.xml
+++ b/samples/MediaRoutingDemo/src/main/res/menu/sample_media_router_menu.xml
@@ -20,4 +20,8 @@
         android:title="@string/media_route_menu_title"
         app:showAsAction="always"
         app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"/>
+
+    <item android:id="@+id/settings_menu_item"
+        android:title="@string/settings_menu_item"
+        app:showAsAction="withText" />
 </menu>
diff --git a/samples/MediaRoutingDemo/src/main/res/values/arrays.xml b/samples/MediaRoutingDemo/src/main/res/values/arrays.xml
index 08345f0..77b7c7d 100644
--- a/samples/MediaRoutingDemo/src/main/res/values/arrays.xml
+++ b/samples/MediaRoutingDemo/src/main/res/values/arrays.xml
@@ -38,4 +38,10 @@
         <item>video/mp4</item>
         <item>audio/mp3</item>
     </string-array>
+
+    <string-array name="dialog_types_array">
+        <item>Default</item>
+        <item>Dynamic</item>
+        <item>Output Switcher</item>
+    </string-array>
 </resources>
diff --git a/samples/MediaRoutingDemo/src/main/res/values/strings.xml b/samples/MediaRoutingDemo/src/main/res/values/strings.xml
index 664c28a..34c1df3 100644
--- a/samples/MediaRoutingDemo/src/main/res/values/strings.xml
+++ b/samples/MediaRoutingDemo/src/main/res/values/strings.xml
@@ -29,6 +29,8 @@
     <string name="sample_media_router_text">This activity demonstrates how to
             use MediaRouter from the support library.  Select a route from the action bar.</string>
     <string name="media_route_menu_title">Play on...</string>
+    <string name="settings_menu_item">Settings</string>
+
     <string name="sample_media_route_settings_activity">Sample route settings</string>
 
     <string name="use_default_media_control">Use default media control</string>
diff --git a/settings.gradle b/settings.gradle
index e8e5ddc..67383f8e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -23,7 +23,7 @@
     repos.addMavenRepositories(repositories)
 
     dependencies {
-        classpath("com.gradle:gradle-enterprise-gradle-plugin:3.10.2")
+        classpath("com.gradle:gradle-enterprise-gradle-plugin:3.12.2")
         classpath("com.gradle:common-custom-user-data-gradle-plugin:1.7.2")
         classpath("androidx.build.gradle.gcpbuildcache:gcpbuildcache:1.0.0-alpha06")
     }
diff --git a/slice/slice-core/src/main/res/values-b+sr+Latn/strings.xml b/slice/slice-core/src/main/res/values-b+sr+Latn/strings.xml
index 6c88d06..7edadbf 100644
--- a/slice/slice-core/src/main/res/values-b+sr+Latn/strings.xml
+++ b/slice/slice-core/src/main/res/values-b+sr+Latn/strings.xml
@@ -17,10 +17,10 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_slices_permission_request" msgid="4431189529265983653">"Апликација <xliff:g id="APP_0">%1$s</xliff:g> жели да приказује фрагменте из апликације <xliff:g id="APP_2">%2$s</xliff:g>"</string>
-    <string name="abc_slice_permission_title" msgid="4776010267128891014">"Желите ли да дозволите апликацији <xliff:g id="APP_0">%1$s</xliff:g> да приказује фрагменте из апликације <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
-    <string name="abc_slice_permission_text_1" msgid="9108592981418900836">"– Може да чита податке из апликације <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="abc_slice_permission_text_2" msgid="7135705417979137589">"– Може да обавља радње у апликацији <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="abc_slice_permission_allow" msgid="6374752258872407887">"Дозволи"</string>
-    <string name="abc_slice_permission_deny" msgid="576316744017426251">"Одбиј"</string>
+    <string name="abc_slices_permission_request" msgid="4431189529265983653">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi da prikazuje fragmente iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
+    <string name="abc_slice_permission_title" msgid="4776010267128891014">"Želite li da dozvolite aplikaciji <xliff:g id="APP_0">%1$s</xliff:g> da prikazuje fragmente iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
+    <string name="abc_slice_permission_text_1" msgid="9108592981418900836">"– Može da čita podatke iz aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="abc_slice_permission_text_2" msgid="7135705417979137589">"– Može da obavlja radnje u aplikaciji <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="abc_slice_permission_allow" msgid="6374752258872407887">"Dozvoli"</string>
+    <string name="abc_slice_permission_deny" msgid="576316744017426251">"Odbij"</string>
 </resources>
diff --git a/slice/slice-view/src/androidTest/java/androidx/slice/SliceViewManagerTest.java b/slice/slice-view/src/androidTest/java/androidx/slice/SliceViewManagerTest.java
index 0b841d5..38784fa 100644
--- a/slice/slice-view/src/androidTest/java/androidx/slice/SliceViewManagerTest.java
+++ b/slice/slice-view/src/androidTest/java/androidx/slice/SliceViewManagerTest.java
@@ -112,6 +112,7 @@
 
     @FlakyTest(bugId = 239964752)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testPinList() {
         Uri uri = new Uri.Builder()
                 .scheme(ContentResolver.SCHEME_CONTENT)
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java
index cf8e50b..fdfd994 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/MultiWindowTest.java
@@ -98,7 +98,7 @@
     }
 
     @Test
-    @SdkSuppress(minSdkVersion = 31)
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testMultiWindow_splitScreen() {
         // Launch two split-screen activities with different IDs.
         launchTestActivity(SplitScreenTestActivity.class,
@@ -127,7 +127,7 @@
     }
 
     @Test
-    @SdkSuppress(minSdkVersion = 31)
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testMultiWindow_click() {
         // Launch two split-screen activities with buttons.
         launchTestActivity(UiDeviceTestClickActivity.class);
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
index 52be93b..c23d695 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
@@ -453,6 +453,7 @@
 
     @FlakyTest(bugId = 259299647)
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testWaitForWindowUpdate() {
         launchTestActivity(WaitTestActivity.class);
 
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/FontPaddingTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/FontPaddingTest.kt
index c827fbd..550fb6f 100644
--- a/text/text/src/androidTest/java/androidx/compose/ui/text/android/FontPaddingTest.kt
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/FontPaddingTest.kt
@@ -20,6 +20,7 @@
 import android.text.TextPaint
 import androidx.core.content.res.ResourcesCompat
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.testutils.fonts.R
@@ -179,6 +180,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun tallTypefaceTextIsTwiceTheHeightOfLatinTypefaceTextMultiLine() {
         val latinLayout = TextLayout(latinTextMultiLine, typeface = latinTypeface)
         val tallLayout = TextLayout(tallTextMultiLine, typeface = tallTypeface)
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/TextTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/TextTest.kt
index 8d05cf1..06bf851 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/TextTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/TextTest.kt
@@ -65,18 +65,14 @@
     fun validateGreaterMinLinesResultsGreaterSize() {
         var size1: Int = 0
         var size2: Int = 0
-        val minLines1 = 1
-        val minLines2 = 2
-        val maxLines1 = 3
-        val maxLines2 = 3
 
         rule.setContent {
             CompositionLocalProvider(LocalContentColor provides Color.Blue) {
                 Column(Modifier.background(Color.White)) {
                     Text(
                         "Lorem ipsum",
-                        minLines = minLines1,
-                        maxLines = maxLines1,
+                        minLines = 1,
+                        maxLines = 3,
                         onTextLayout = {
                             size1 = it.size.height
                         }
@@ -84,8 +80,8 @@
 
                     Text(
                         "Lorem ipsum",
-                        minLines = minLines2,
-                        maxLines = maxLines2,
+                        minLines = 2,
+                        maxLines = 3,
                         onTextLayout = {
                             size2 = it.size.height
                         }
diff --git a/wear/protolayout/protolayout-expression/api/current.txt b/wear/protolayout/protolayout-expression/api/current.txt
index a8a9010..62c253c 100644
--- a/wear/protolayout/protolayout-expression/api/current.txt
+++ b/wear/protolayout/protolayout-expression/api/current.txt
@@ -1,6 +1,67 @@
 // Signature format: 4.0
 package androidx.wear.protolayout.expression {
 
+  public final class AnimationParameterBuilders {
+    field public static final int REPEAT_MODE_RESTART = 1; // 0x1
+    field public static final int REPEAT_MODE_REVERSE = 2; // 0x2
+    field public static final int REPEAT_MODE_UNKNOWN = 0; // 0x0
+  }
+
+  public static final class AnimationParameterBuilders.AnimationSpec {
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing? getEasing();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable? getRepeatable();
+  }
+
+  public static final class AnimationParameterBuilders.AnimationSpec.Builder {
+    ctor public AnimationParameterBuilders.AnimationSpec.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setDelayMillis(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setDurationMillis(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setEasing(androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setInfiniteRepeatable(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setRepeatable(androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable);
+  }
+
+  public static final class AnimationParameterBuilders.CubicBezierEasing implements androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing {
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+  }
+
+  public static final class AnimationParameterBuilders.CubicBezierEasing.Builder {
+    ctor public AnimationParameterBuilders.CubicBezierEasing.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setX1(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setX2(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setY1(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setY2(float);
+  }
+
+  public static interface AnimationParameterBuilders.Easing {
+  }
+
+  public static class AnimationParameterBuilders.EasingFunctions {
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_LINEAR_IN_EASING;
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_SLOW_IN_EASING;
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing LINEAR_OUT_SLOW_IN_EASING;
+  }
+
+  public static final class AnimationParameterBuilders.Repeatable {
+    method public int getIterations();
+    method public int getRepeatMode();
+    method public boolean hasInfiniteIteration();
+  }
+
+  public static final class AnimationParameterBuilders.Repeatable.Builder {
+    ctor public AnimationParameterBuilders.Repeatable.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setIterations(@IntRange(from=1) int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setRepeatMode(int);
+  }
+
   public class ConditionScopes {
   }
 
@@ -27,11 +88,23 @@
   }
 
   public static interface DynamicBuilders.DynamicColor extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor constant(@ColorInt int);
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromState(String);
   }
 
   public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate();
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 asInt();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat constant(float);
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
diff --git a/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt b/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt
index 412b595..4b4ade8 100644
--- a/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt
+++ b/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt
@@ -1,6 +1,67 @@
 // Signature format: 4.0
 package androidx.wear.protolayout.expression {
 
+  public final class AnimationParameterBuilders {
+    field public static final int REPEAT_MODE_RESTART = 1; // 0x1
+    field public static final int REPEAT_MODE_REVERSE = 2; // 0x2
+    field public static final int REPEAT_MODE_UNKNOWN = 0; // 0x0
+  }
+
+  public static final class AnimationParameterBuilders.AnimationSpec {
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing? getEasing();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable? getRepeatable();
+  }
+
+  public static final class AnimationParameterBuilders.AnimationSpec.Builder {
+    ctor public AnimationParameterBuilders.AnimationSpec.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setDelayMillis(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setDurationMillis(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setEasing(androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setInfiniteRepeatable(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setRepeatable(androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable);
+  }
+
+  public static final class AnimationParameterBuilders.CubicBezierEasing implements androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing {
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+  }
+
+  public static final class AnimationParameterBuilders.CubicBezierEasing.Builder {
+    ctor public AnimationParameterBuilders.CubicBezierEasing.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setX1(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setX2(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setY1(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setY2(float);
+  }
+
+  public static interface AnimationParameterBuilders.Easing {
+  }
+
+  public static class AnimationParameterBuilders.EasingFunctions {
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_LINEAR_IN_EASING;
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_SLOW_IN_EASING;
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing LINEAR_OUT_SLOW_IN_EASING;
+  }
+
+  public static final class AnimationParameterBuilders.Repeatable {
+    method public int getIterations();
+    method public int getRepeatMode();
+    method public boolean hasInfiniteIteration();
+  }
+
+  public static final class AnimationParameterBuilders.Repeatable.Builder {
+    ctor public AnimationParameterBuilders.Repeatable.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setIterations(@IntRange(from=1) int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setRepeatMode(int);
+  }
+
   public class ConditionScopes {
   }
 
@@ -27,11 +88,23 @@
   }
 
   public static interface DynamicBuilders.DynamicColor extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor constant(@ColorInt int);
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromState(String);
   }
 
   public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate();
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 asInt();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat constant(float);
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
diff --git a/wear/protolayout/protolayout-expression/api/restricted_current.txt b/wear/protolayout/protolayout-expression/api/restricted_current.txt
index a8a9010..62c253c 100644
--- a/wear/protolayout/protolayout-expression/api/restricted_current.txt
+++ b/wear/protolayout/protolayout-expression/api/restricted_current.txt
@@ -1,6 +1,67 @@
 // Signature format: 4.0
 package androidx.wear.protolayout.expression {
 
+  public final class AnimationParameterBuilders {
+    field public static final int REPEAT_MODE_RESTART = 1; // 0x1
+    field public static final int REPEAT_MODE_REVERSE = 2; // 0x2
+    field public static final int REPEAT_MODE_UNKNOWN = 0; // 0x0
+  }
+
+  public static final class AnimationParameterBuilders.AnimationSpec {
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing? getEasing();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable? getRepeatable();
+  }
+
+  public static final class AnimationParameterBuilders.AnimationSpec.Builder {
+    ctor public AnimationParameterBuilders.AnimationSpec.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setDelayMillis(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setDurationMillis(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setEasing(androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setInfiniteRepeatable(int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec.Builder setRepeatable(androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable);
+  }
+
+  public static final class AnimationParameterBuilders.CubicBezierEasing implements androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing {
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+  }
+
+  public static final class AnimationParameterBuilders.CubicBezierEasing.Builder {
+    ctor public AnimationParameterBuilders.CubicBezierEasing.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setX1(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setX2(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setY1(float);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.CubicBezierEasing.Builder setY2(float);
+  }
+
+  public static interface AnimationParameterBuilders.Easing {
+  }
+
+  public static class AnimationParameterBuilders.EasingFunctions {
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_LINEAR_IN_EASING;
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing FAST_OUT_SLOW_IN_EASING;
+    field public static final androidx.wear.protolayout.expression.AnimationParameterBuilders.Easing LINEAR_OUT_SLOW_IN_EASING;
+  }
+
+  public static final class AnimationParameterBuilders.Repeatable {
+    method public int getIterations();
+    method public int getRepeatMode();
+    method public boolean hasInfiniteIteration();
+  }
+
+  public static final class AnimationParameterBuilders.Repeatable.Builder {
+    ctor public AnimationParameterBuilders.Repeatable.Builder();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable build();
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setIterations(@IntRange(from=1) int);
+    method public androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable.Builder setRepeatMode(int);
+  }
+
   public class ConditionScopes {
   }
 
@@ -27,11 +88,23 @@
   }
 
   public static interface DynamicBuilders.DynamicColor extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(@ColorInt int, @ColorInt int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor animate();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor constant(@ColorInt int);
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor fromState(String);
   }
 
   public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate();
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 asInt();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat constant(float);
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicString format();
diff --git a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/AnimationParameterBuilders.java b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/AnimationParameterBuilders.java
index ef5c3cc..2fb42f3 100644
--- a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/AnimationParameterBuilders.java
+++ b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/AnimationParameterBuilders.java
@@ -18,8 +18,8 @@
 
 import static androidx.wear.protolayout.expression.Preconditions.checkNotNull;
 
-import android.annotation.SuppressLint;
 import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -29,9 +29,52 @@
 import java.lang.annotation.RetentionPolicy;
 
 /** Builders for parameters that can be used to customize an animation. */
-final class AnimationParameterBuilders {
+public final class AnimationParameterBuilders {
   private AnimationParameterBuilders() {}
 
+  /** Prebuilt easing functions with cubic polynomial easing. */
+  public static class EasingFunctions {
+    private static CubicBezierEasing buildCubicBezierEasing(
+        float x1, float y1, float x2, float y2) {
+      return new CubicBezierEasing.Builder().setX1(x1).setY1(y1).setX2(x2).setY2(y2).build();
+    }
+
+    private EasingFunctions() {}
+
+    /**
+     * Elements that begin and end at rest use this standard easing. They speed up quickly and slow
+     * down gradually, in order to emphasize the end of the transition.
+     *
+     * <p>Standard easing puts subtle attention at the end of an animation, by giving more time to
+     * deceleration than acceleration. It is the most common form of easing.
+     *
+     * <p>This is equivalent to the Compose {@code FastOutSlowInEasing}.
+     */
+    @NonNull
+    public static final Easing FAST_OUT_SLOW_IN_EASING =
+        buildCubicBezierEasing(0.4f, 0.0f, 0.2f, 1.0f);
+
+    /**
+     * Incoming elements are animated using deceleration easing, which starts a transition at peak
+     * velocity (the fastest point of an element’s movement) and ends at rest.
+     *
+     * <p>This is equivalent to the Compose {@code LinearOutSlowInEasing}.
+     */
+    @NonNull
+    public static final Easing LINEAR_OUT_SLOW_IN_EASING =
+        buildCubicBezierEasing(0.0f, 0.0f, 0.2f, 1.0f);
+
+    /**
+     * Elements exiting a screen use acceleration easing, where they start at rest and end at peak
+     * velocity.
+     *
+     * <p>This is equivalent to the Compose {@code FastOutLinearInEasing}.
+     */
+    @NonNull
+    public static final Easing FAST_OUT_LINEAR_IN_EASING =
+        buildCubicBezierEasing(0.4f, 0.0f, 1.0f, 1.0f);
+  }
+
   /**
    * The repeat mode to specify how animation will behave when repeated.
    *
@@ -69,7 +112,6 @@
    *
    * @since 1.2
    */
-  @ProtoLayoutExperimental
   public static final class AnimationSpec {
     private final AnimationParameterProto.AnimationSpec mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -80,8 +122,7 @@
     }
 
     /**
-     * Gets the duration of the animation in milliseconds. If not set, defaults to 300ms. Intended
-     * for testing purposes only.
+     * Gets the duration of the animation in milliseconds.
      *
      * @since 1.2
      */
@@ -90,8 +131,7 @@
     }
 
     /**
-     * Gets the delay to start the animation in milliseconds. If not set, defaults to 0. Intended
-     * for testing purposes only.
+     * Gets the delay to start the animation in milliseconds.
      *
      * @since 1.2
      */
@@ -100,8 +140,7 @@
     }
 
     /**
-     * Gets the easing to be used for adjusting an animation’s fraction. If not set, defaults to
-     * Linear Interpolator. Intended for testing purposes only.
+     * Gets the easing to be used for adjusting an animation’s fraction.
      *
      * @since 1.2
      */
@@ -116,7 +155,7 @@
 
     /**
      * Gets the repeatable mode to be used for specifying repetition parameters for the animation.
-     * If not set, animation won't be repeated. Intended for testing purposes only.
+     * If not set, animation won't be repeated.
      *
      * @since 1.2
      */
@@ -223,6 +262,15 @@
         return this;
       }
 
+      /** Sets the animation to repeat indefinitely with the given repeat mode. */
+      @NonNull
+      @SuppressWarnings("MissingGetterMatchingBuilder")
+      public Builder setInfiniteRepeatable(@RepeatMode int mode) {
+        Repeatable repeatable =
+                new Repeatable.Builder().setRepeatMode(mode).build();
+        return this.setRepeatable(repeatable);
+      }
+
       /** Builds an instance from accumulated values. */
       @NonNull
       public AnimationSpec build() {
@@ -238,7 +286,6 @@
    *
    * @since 1.2
    */
-  @ProtoLayoutExperimental
   public interface Easing {
     /**
      * Get the protocol buffer representation of this object.
@@ -258,8 +305,11 @@
     @Nullable
     Fingerprint getFingerprint();
 
-    /** Builder to create {@link Easing} objects. */
-    @SuppressLint("StaticFinalBuilder")
+    /** Builder to create {@link Easing} objects.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
     interface Builder {
 
       /** Builds an instance with values accumulated in this Builder. */
@@ -269,7 +319,6 @@
   }
 
   @NonNull
-  @ProtoLayoutExperimental
   static Easing easingFromProto(@NonNull AnimationParameterProto.Easing proto) {
     if (proto.hasCubicBezier()) {
       return CubicBezierEasing.fromProto(proto.getCubicBezier());
@@ -283,7 +332,6 @@
    *
    * @since 1.2
    */
-  @ProtoLayoutExperimental
   public static final class CubicBezierEasing implements Easing {
     private final AnimationParameterProto.CubicBezierEasing mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -296,8 +344,7 @@
 
     /**
      * Gets the x coordinate of the first control point. The line through the point (0, 0) and the
-     * first control point is tangent to the easing at the point (0, 0). Intended for testing
-     * purposes only.
+     * first control point is tangent to the easing at the point (0, 0).
      *
      * @since 1.2
      */
@@ -307,8 +354,7 @@
 
     /**
      * Gets the y coordinate of the first control point. The line through the point (0, 0) and the
-     * first control point is tangent to the easing at the point (0, 0). Intended for testing
-     * purposes only.
+     * first control point is tangent to the easing at the point (0, 0).
      *
      * @since 1.2
      */
@@ -318,8 +364,7 @@
 
     /**
      * Gets the x coordinate of the second control point. The line through the point (1, 1) and the
-     * second control point is tangent to the easing at the point (1, 1). Intended for testing
-     * purposes only.
+     * second control point is tangent to the easing at the point (1, 1).
      *
      * @since 1.2
      */
@@ -329,8 +374,7 @@
 
     /**
      * Gets the y coordinate of the second control point. The line through the point (1, 1) and the
-     * second control point is tangent to the easing at the point (1, 1). Intended for testing
-     * purposes only.
+     * second control point is tangent to the easing at the point (1, 1).
      *
      * @since 1.2
      */
@@ -360,7 +404,6 @@
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
-    @ProtoLayoutExperimental
     public AnimationParameterProto.Easing toEasingProto() {
       return AnimationParameterProto.Easing.newBuilder().setCubicBezier(mImpl).build();
     }
@@ -438,7 +481,6 @@
    *
    * @since 1.2
    */
-  @ProtoLayoutExperimental
   public static final class Repeatable {
     private final AnimationParameterProto.Repeatable mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -449,18 +491,24 @@
     }
 
     /**
-     * Gets the number specifying how many times animation will be repeated. If not set, defaults to
-     * 0, i.e. repeat infinitely. Intended for testing purposes only.
+     * Gets the number specifying how many times animation will be repeated. this method can only be
+     * called if {@link #hasInfiniteIteration()} is false.
      *
+     * @throws IllegalStateException if {@link #hasInfiniteIteration()} is true.
      * @since 1.2
      */
     public int getIterations() {
+      if (hasInfiniteIteration()) {
+        throw new IllegalStateException("Repeatable has infinite iteration.");
+      }
       return mImpl.getIterations();
     }
 
+    /** Returns true if the animation has indefinite repeat. */
+    public boolean hasInfiniteIteration() { return isInfiniteIteration(mImpl.getIterations()); }
+
     /**
-     * Gets the repeat mode to specify how animation will behave when repeated. If not set, defaults
-     * to restart. Intended for testing purposes only.
+     * Gets the repeat mode to specify how animation will behave when repeated.
      *
      * @since 1.2
      */
@@ -490,6 +538,10 @@
       return mImpl;
     }
 
+    static boolean isInfiniteIteration(int iteration){
+      return iteration < 1;
+    }
+
     /** Builder for {@link Repeatable} */
     public static final class Builder {
       private final AnimationParameterProto.Repeatable.Builder mImpl =
@@ -500,12 +552,12 @@
 
       /**
        * Sets the number specifying how many times animation will be repeated. If not set, defaults
-       * to 0, i.e. repeat infinitely.
+       * to repeating infinitely.
        *
        * @since 1.2
        */
       @NonNull
-      public Builder setIterations(int iterations) {
+      public Builder setIterations(@IntRange(from = 1) int iterations) {
         mImpl.setIterations(iterations);
         mFingerprint.recordPropertyUpdate(1, iterations);
         return this;
diff --git a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java
index f3c5ea0..01a67cd 100644
--- a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java
+++ b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java
@@ -1722,6 +1722,85 @@
     }
 
     /**
+     * Creates a {@link DynamicFloat} which will animate over the range of floats from {@code start}
+     * to {@code end}.
+     *
+     * @param start The start value of the range.
+     * @param end The end value of the range.
+     */
+    @NonNull
+    static DynamicFloat animate(float start, float end) {
+      return new AnimatableFixedFloat.Builder().setFromValue(start).setToValue(end).build();
+    }
+
+    /**
+     * Creates a {@link DynamicFloat} which will animate over the range of floats from {@code start}
+     * to {@code end} with the given animation parameters.
+     *
+     * @param start The start value of the range.
+     * @param end The end value of the range.
+     * @param spec The animation parameters.
+     */
+    @NonNull
+    static DynamicFloat animate(float start, float end, @NonNull AnimationSpec spec) {
+      return new AnimatableFixedFloat.Builder()
+          .setFromValue(start)
+          .setToValue(end)
+          .setSpec(spec)
+          .build();
+    }
+
+    /**
+     * Creates a {@link DynamicFloat} that is bound to the value of an item of the State. Every time
+     * the state value changes, this {@link DynamicFloat} will animate from its current value to the
+     * new value (from the state).
+     *
+     * @param stateKey The key to a {@link StateEntryValue} with a float value from the providers
+     *     state.
+     */
+    @NonNull
+    static DynamicFloat animate(@NonNull String stateKey) {
+      return new AnimatableDynamicFloat.Builder().setInput(fromState(stateKey)).build();
+    }
+
+    /**
+     * Creates a {@link DynamicFloat} that is bound to the value of an item of the State. Every time
+     * the state value changes, this {@link DynamicFloat} will animate from its current value to the
+     * new value (from the state).
+     *
+     * @param stateKey The key to a {@link StateEntryValue} with a float value from the providers
+     *     state.
+     * @param spec The animation parameters.
+     */
+    @NonNull
+    static DynamicFloat animate(@NonNull String stateKey, @NonNull AnimationSpec spec) {
+      return new AnimatableDynamicFloat.Builder()
+          .setInput(fromState(stateKey))
+          .setSpec(spec)
+          .build();
+    }
+
+    /**
+     * Returns a {@link DynamicFloat} that is bound to the value of this {@link DynamicFloat} and
+     * every time its value is changing, it animates from its current value to the new value.
+     *
+     * @param spec The animation parameters.
+     */
+    @NonNull
+    default DynamicFloat animate(@NonNull AnimationSpec spec) {
+      return new AnimatableDynamicFloat.Builder().setInput(this).setSpec(spec).build();
+    }
+
+    /**
+     * Returns a {@link DynamicFloat} that is bound to the value of this {@link DynamicFloat} and
+     * every time its value is changing, it animates from its current value to the new value.
+     */
+    @NonNull
+    default DynamicFloat animate() {
+      return new AnimatableDynamicFloat.Builder().setInput(this).build();
+    }
+
+    /**
      * Returns a {@link DynamicInt32} which holds the largest integer value that is smaller than or
      * equal to this {@link DynamicFloat}, i.e. {@code int result = (int) Math.floor(this)}
      */
@@ -2645,6 +2724,86 @@
     }
 
     /**
+     * Creates a {@link DynamicColor} which will animate over the range of colors from {@code start}
+     * to {@code end}.
+     *
+     * @param start The start value of the range.
+     * @param end The end value of the range.
+     */
+    @NonNull
+    static DynamicColor animate(@ColorInt int start, @ColorInt int end) {
+      return new AnimatableFixedColor.Builder().setFromArgb(start).setToArgb(end).build();
+    }
+
+    /**
+     * Creates a {@link DynamicColor} which will animate over the range of colors from {@code start}
+     * to {@code end} with the given animation parameters.
+     *
+     * @param start The start value of the range.
+     * @param end The end value of the range.
+     * @param spec The animation parameters.
+     */
+    @NonNull
+    static DynamicColor animate(
+        @ColorInt int start, @ColorInt int end, @NonNull AnimationSpec spec) {
+      return new AnimatableFixedColor.Builder()
+          .setFromArgb(start)
+          .setToArgb(end)
+          .setSpec(spec)
+          .build();
+    }
+
+    /**
+     * Creates a {@link DynamicColor} that is bound to the value of an item of the State. Every time
+     * the state value changes, this {@link DynamicColor} will animate from its current value to the
+     * new value (from the state).
+     *
+     * @param stateKey The key to a {@link StateEntryValue} with a color value from the providers
+     *     state.
+     */
+    @NonNull
+    static DynamicColor animate(@NonNull String stateKey) {
+      return new AnimatableDynamicColor.Builder().setInput(fromState(stateKey)).build();
+    }
+
+    /**
+     * Creates a {@link DynamicColor} that is bound to the value of an item of the State. Every time
+     * the state value changes, this {@link DynamicColor} will animate from its current value to the
+     * new value (from the state).
+     *
+     * @param stateKey The key to a {@link StateEntryValue} with a color value from the providers
+     *     state.
+     * @param spec The animation parameters.
+     */
+    @NonNull
+    static DynamicColor animate(@NonNull String stateKey, @NonNull AnimationSpec spec) {
+      return new AnimatableDynamicColor.Builder()
+          .setInput(fromState(stateKey))
+          .setSpec(spec)
+          .build();
+    }
+
+    /**
+     * Returns a {@link DynamicColor} that is bound to the value of this {@link DynamicColor} and
+     * every time its value is changing, it animates from its current value to the new value.
+     *
+     * @param spec The animation parameters.
+     */
+    @NonNull
+    default DynamicColor animate(@NonNull AnimationSpec spec) {
+      return new AnimatableDynamicColor.Builder().setInput(this).setSpec(spec).build();
+    }
+
+    /**
+     * Returns a {@link DynamicColor} that is bound to the value of this {@link DynamicColor} and
+     * every time its value is changing, it animates from its current value to the new value.
+     */
+    @NonNull
+    default DynamicColor animate() {
+      return new AnimatableDynamicColor.Builder().setInput(this).build();
+    }
+
+    /**
      * Get the fingerprint for this object or null if unknown.
      *
      * @hide
diff --git a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java
index 61fbead..aa4887a 100644
--- a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java
+++ b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java
@@ -16,10 +16,14 @@
 
 package androidx.wear.protolayout.expression;
 
+import static androidx.wear.protolayout.expression.AnimationParameterBuilders.REPEAT_MODE_REVERSE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import androidx.annotation.ColorInt;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor;
+import androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec;
+import androidx.wear.protolayout.expression.AnimationParameterBuilders.Repeatable;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -29,6 +33,9 @@
 public final class DynamicColorTest {
     private static final String STATE_KEY = "state-key";
     private static final @ColorInt int CONSTANT_VALUE = 0xff00ff00;
+    private static final AnimationSpec SPEC = new AnimationSpec.Builder().setDelayMillis(1)
+            .setDurationMillis(2).setRepeatable(new Repeatable.Builder()
+                    .setRepeatMode(REPEAT_MODE_REVERSE).setIterations(10).build()).build();
 
     @Test
     public void constantColor() {
@@ -45,4 +52,37 @@
         assertThat(stateColor.toDynamicColorProto().getStateSource().getSourceKey()).isEqualTo(
                 STATE_KEY);
     }
+
+    @Test
+    public void rangeAnimatedColor() {
+        int startColor = 0xff00ff00;
+        int endColor = 0xff00ffff;
+
+        DynamicColor animatedColor = DynamicColor.animate(startColor, endColor);
+        DynamicColor animatedColorWithSpec = DynamicColor.animate(startColor, endColor, SPEC);
+
+        assertThat(animatedColor.toDynamicColorProto().getAnimatableFixed().hasSpec()).isFalse();
+        assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getFromArgb())
+                .isEqualTo(startColor);
+        assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getToArgb())
+                .isEqualTo(endColor);
+        assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getSpec())
+                .isEqualTo(SPEC.toProto());
+    }
+
+    @Test
+    public void stateAnimatedColor() {
+        DynamicColor stateColor = DynamicColor.fromState(STATE_KEY);
+
+        DynamicColor animatedColor = DynamicColor.animate(STATE_KEY);
+        DynamicColor animatedColorWithSpec = DynamicColor.animate(STATE_KEY, SPEC);
+
+        assertThat(animatedColor.toDynamicColorProto().getAnimatableDynamic().hasSpec()).isFalse();
+        assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableDynamic().getInput())
+                .isEqualTo(stateColor.toDynamicColorProto());
+        assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableDynamic().getSpec())
+                .isEqualTo(SPEC.toProto());
+        assertThat(animatedColor.toDynamicColorProto())
+                .isEqualTo(stateColor.animate().toDynamicColorProto());
+    }
 }
diff --git a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java
index 9751dab..c5f583a 100644
--- a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java
+++ b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java
@@ -16,6 +16,8 @@
 
 package androidx.wear.protolayout.expression;
 
+import static androidx.wear.protolayout.expression.AnimationParameterBuilders.REPEAT_MODE_REVERSE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat;
@@ -31,10 +33,10 @@
 public final class DynamicFloatTest {
     private static final String STATE_KEY = "state-key";
     private static final float CONSTANT_VALUE = 42.42f;
-    private static final boolean DEFAULT_GROUPING = false;
-    private static final int DEFAULT_MAX_FRACTION_DIGITS = 3;
-    private static final int DEFAULT_MIN_FRACTION_DIGITS = 0;
-    private static final int DEFAULT_MIN_INTEGER_DIGIT = 1;
+    private static final AnimationParameterBuilders.AnimationSpec
+            SPEC = new AnimationParameterBuilders.AnimationSpec.Builder().setDelayMillis(1)
+            .setDurationMillis(2).setRepeatable(new AnimationParameterBuilders.Repeatable.Builder()
+                    .setRepeatMode(REPEAT_MODE_REVERSE).setIterations(10).build()).build();
 
     @Test
     public void constantFloat() {
@@ -98,4 +100,38 @@
         assertThat(floatFormatOp.getMinFractionDigits()).isEqualTo(minFractionDigits);
         assertThat(floatFormatOp.getMinIntegerDigits()).isEqualTo(minIntegerDigits);
     }
+
+    @Test
+    public void rangeAnimatedFloat() {
+        float startFloat = 100f;
+        float endFloat = 200f;
+
+        DynamicFloat animatedFloat = DynamicFloat.animate(startFloat,
+                endFloat);
+        DynamicFloat animatedFloatWithSpec = DynamicFloat.animate(startFloat, endFloat, SPEC);
+
+        assertThat(animatedFloat.toDynamicFloatProto().getAnimatableFixed().hasSpec()).isFalse();
+        assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getFromValue())
+                .isEqualTo(startFloat);
+        assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getToValue())
+                .isEqualTo(endFloat);
+        assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getSpec())
+                .isEqualTo(SPEC.toProto());
+    }
+
+    @Test
+    public void stateAnimatedFloat() {
+        DynamicFloat stateFloat = DynamicFloat.fromState(STATE_KEY);
+
+        DynamicFloat animatedColor = DynamicFloat.animate(STATE_KEY);
+        DynamicFloat animatedColorWithSpec = DynamicFloat.animate(STATE_KEY, SPEC);
+
+        assertThat(animatedColor.toDynamicFloatProto().getAnimatableDynamic().hasSpec()).isFalse();
+        assertThat(animatedColorWithSpec.toDynamicFloatProto().getAnimatableDynamic().getInput())
+                .isEqualTo(stateFloat.toDynamicFloatProto());
+        assertThat(animatedColorWithSpec.toDynamicFloatProto().getAnimatableDynamic().getSpec())
+                .isEqualTo(SPEC.toProto());
+        assertThat(animatedColor.toDynamicFloatProto())
+                .isEqualTo(stateFloat.animate().toDynamicFloatProto());
+    }
 }
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt
index 742a935..24d49ce 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt
@@ -221,7 +221,7 @@
     }
 
     @Test
-    @Suppress("Deprecation") // userStyleSettings
+    @Suppress("Deprecation", "NewApi") // userStyleSettings
     public fun staticSchemaAndComplicationsRead() {
         val service = TestXmlWatchFaceService(
             ApplicationProvider.getApplicationContext<Context>(),
@@ -248,7 +248,7 @@
 
             assertThat(
                 watchFaceImpl.complicationSlotsManager.complicationSlots.size
-            ).isEqualTo(4)
+            ).isEqualTo(5)
 
             val slotA = watchFaceImpl.complicationSlotsManager.complicationSlots[10]!!
             assertThat(slotA.boundsType).isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
@@ -319,6 +319,40 @@
             assertThat(slotC.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
                 .isEqualTo(ComplicationType.NOT_CONFIGURED)
 
+            val slotD = watchFaceImpl.complicationSlotsManager.complicationSlots[40]!!
+            assertThat(slotD.supportedTypes).containsExactly(
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.SMALL_IMAGE
+            ).inOrder()
+            assertThat(slotD.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
+                ComponentName("com.package", "com.app.example1"))
+            assertThat(slotD.defaultDataSourcePolicy.primaryDataSourceDefaultType)
+                .isEqualTo(ComplicationType.SHORT_TEXT)
+            assertThat(slotD.defaultDataSourcePolicy.secondaryDataSource).isEqualTo(
+                ComponentName("com.package", "com.app.example2"))
+            assertThat(slotD.defaultDataSourcePolicy.secondaryDataSourceDefaultType)
+                .isEqualTo(ComplicationType.SMALL_IMAGE)
+            assertThat(slotD.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
+                SystemDataSources.DATA_SOURCE_WATCH_BATTERY
+            )
+            assertThat(slotD.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
+                .isEqualTo(ComplicationType.RANGED_VALUE)
+
+            val slotE = watchFaceImpl.complicationSlotsManager.complicationSlots[50]!!
+            assertThat(slotE.supportedTypes).containsExactly(
+                ComplicationType.GOAL_PROGRESS, ComplicationType.WEIGHTED_ELEMENTS
+            ).inOrder()
+            assertThat(slotE.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
+                ComponentName("com.package", "com.app"))
+            assertThat(slotE.defaultDataSourcePolicy.primaryDataSourceDefaultType)
+                .isEqualTo(ComplicationType.GOAL_PROGRESS)
+            assertThat(slotE.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
+                SystemDataSources.DATA_SOURCE_WATCH_BATTERY
+            )
+            assertThat(slotE.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
+                .isEqualTo(ComplicationType.WEIGHTED_ELEMENTS)
+
             val earlyInitDetails = wrapper.deferredEarlyInitDetails.await()
             val flavors = earlyInitDetails.userStyleFlavors
 
@@ -370,16 +404,6 @@
                     "primary(ComponentInfo{com.package/com.app}, SHORT_TEXT), " +
                     "secondary(null, null), " +
                     "system(16, SHORT_TEXT)]}]")
-            val slotD = watchFaceImpl.complicationSlotsManager.complicationSlots[40]!!
-            assertThat(slotD.supportedTypes).containsExactly(
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.SMALL_IMAGE
-            ).inOrder()
-            assertThat(slotD.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app.example1"))
-            assertThat(slotD.defaultDataSourcePolicy.secondaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app.example2"))
         }
     }
 }
diff --git a/wear/watchface/watchface/src/androidTest/res/values/integers.xml b/wear/watchface/watchface/src/androidTest/res/values/integers.xml
index 3c247b6..089d489 100644
--- a/wear/watchface/watchface/src/androidTest/res/values/integers.xml
+++ b/wear/watchface/watchface/src/androidTest/res/values/integers.xml
@@ -19,4 +19,5 @@
     <integer name="complication_slot_20">20</integer>
     <integer name="complication_slot_30">30</integer>
     <integer name="complication_slot_40">40</integer>
+    <integer name="complication_slot_50">50</integer>
 </resources>
\ No newline at end of file
diff --git a/wear/watchface/watchface/src/androidTest/res/values/strings.xml b/wear/watchface/watchface/src/androidTest/res/values/strings.xml
index b213c4d..d70c1f7 100644
--- a/wear/watchface/watchface/src/androidTest/res/values/strings.xml
+++ b/wear/watchface/watchface/src/androidTest/res/values/strings.xml
@@ -22,6 +22,7 @@
     <string name="complication_screen_reader_name_two"
         translatable="false">Complication two.</string>
     <string name="complication_name_three" translatable="false">Three</string>
+    <string name="complication_name_five" translatable="false">Five</string>
     <string name="flavor_id_0" translatable="false">flavor1</string>
     <string name="setting_time_style" translatable="false">TimeStyle</string>
     <string name="option_time_style_minimal" translatable="false">minimal</string>
diff --git a/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml b/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml
index 637ccfb..80d3b44 100644
--- a/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml
+++ b/wear/watchface/watchface/src/androidTest/res/xml/xml_watchface.xml
@@ -87,6 +87,17 @@
         app:systemDataSourceFallbackDefaultType="RANGED_VALUE">
         <ComplicationSlotBounds app:left="3" app:top="70" app:right="7" app:bottom="90"/>
     </ComplicationSlot>
+    <ComplicationSlot
+        app:slotId="@integer/complication_slot_50"
+        app:name="@string/complication_name_five"
+        app:boundsType="ROUND_RECT"
+        app:supportedTypes="GOAL_PROGRESS|WEIGHTED_ELEMENTS"
+        app:primaryDataSource="com.package/com.app"
+        app:primaryDataSourceDefaultType="GOAL_PROGRESS"
+        app:systemDataSourceFallback="DATA_SOURCE_WATCH_BATTERY"
+        app:systemDataSourceFallbackDefaultType="WEIGHTED_ELEMENTS">
+        <ComplicationSlotBounds app:left="1" app:top="20" app:right="3" app:bottom="40"/>
+    </ComplicationSlot>
     <UserStyleFlavors>
         <UserStyleFlavor app:id="@string/flavor_id_0">
             <StyleOption app:id="@string/setting_time_style"
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt
index 09a0f9f..7005988 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt
@@ -123,6 +123,7 @@
         val boundingArc: BoundingArc?
     ) {
         companion object {
+            @Suppress("NewApi")
             private val typesMap by lazy(LazyThreadSafetyMode.NONE) {
                 mapOf(
                     "SHORT_TEXT" to ComplicationType.SHORT_TEXT,
@@ -130,7 +131,9 @@
                     "RANGED_VALUE" to ComplicationType.RANGED_VALUE,
                     "MONOCHROMATIC_IMAGE" to ComplicationType.MONOCHROMATIC_IMAGE,
                     "SMALL_IMAGE" to ComplicationType.SMALL_IMAGE,
-                    "PHOTO_IMAGE" to ComplicationType.PHOTO_IMAGE
+                    "PHOTO_IMAGE" to ComplicationType.PHOTO_IMAGE,
+                    "GOAL_PROGRESS" to ComplicationType.GOAL_PROGRESS,
+                    "WEIGHTED_ELEMENTS" to ComplicationType.WEIGHTED_ELEMENTS
                 )
             }
 
diff --git a/wear/watchface/watchface/src/main/res/values/attrs.xml b/wear/watchface/watchface/src/main/res/values/attrs.xml
index 061e65f..3e8d8b2 100644
--- a/wear/watchface/watchface/src/main/res/values/attrs.xml
+++ b/wear/watchface/watchface/src/main/res/values/attrs.xml
@@ -43,6 +43,8 @@
         <enum name="MONOCHROMATIC_IMAGE" value="6" />
         <enum name="SMALL_IMAGE" value="7" />
         <enum name="PHOTO_IMAGE" value="8" />
+        <enum name="GOAL_PROGRESS" value="13" />
+        <enum name="WEIGHTED_ELEMENTS" value="14" />
     </attr>
 
     <!-- Optional. Second of two non-system data source ComponentNames to be tried in turn. -->
@@ -58,6 +60,8 @@
         <enum name="MONOCHROMATIC_IMAGE" value="6" />
         <enum name="SMALL_IMAGE" value="7" />
         <enum name="PHOTO_IMAGE" value="8" />
+        <enum name="GOAL_PROGRESS" value="13" />
+        <enum name="WEIGHTED_ELEMENTS" value="14" />
     </attr>
 
     <!-- Required. Fallback in case none of the non-system data sources could be used.
@@ -88,6 +92,8 @@
         <enum name="MONOCHROMATIC_IMAGE" value="6" />
         <enum name="SMALL_IMAGE" value="7" />
         <enum name="PHOTO_IMAGE" value="8" />
+        <enum name="GOAL_PROGRESS" value="13" />
+        <enum name="WEIGHTED_ELEMENTS" value="14" />
     </attr>
 
     <!-- A ComplicationSlot may have a single ComplicationSlotBounds child node without a
diff --git a/window/extensions/core/core/api/current.txt b/window/extensions/core/core/api/current.txt
index c56a051..c1191a1 100644
--- a/window/extensions/core/core/api/current.txt
+++ b/window/extensions/core/core/api/current.txt
@@ -1,16 +1,16 @@
 // Signature format: 4.0
 package androidx.window.extensions.core.util.function {
 
-  public fun interface Consumer<T> {
-    method public void accept(T t);
+  @java.lang.FunctionalInterface public interface Consumer<T> {
+    method public void accept(T!);
   }
 
-  public fun interface Function<T, R> {
-    method public R apply(T t);
+  @java.lang.FunctionalInterface public interface Function<T, R> {
+    method public R! apply(T!);
   }
 
-  public fun interface Predicate<T> {
-    method public boolean test(T t);
+  @java.lang.FunctionalInterface public interface Predicate<T> {
+    method public boolean test(T!);
   }
 
 }
diff --git a/window/extensions/core/core/api/public_plus_experimental_current.txt b/window/extensions/core/core/api/public_plus_experimental_current.txt
index c56a051..c1191a1 100644
--- a/window/extensions/core/core/api/public_plus_experimental_current.txt
+++ b/window/extensions/core/core/api/public_plus_experimental_current.txt
@@ -1,16 +1,16 @@
 // Signature format: 4.0
 package androidx.window.extensions.core.util.function {
 
-  public fun interface Consumer<T> {
-    method public void accept(T t);
+  @java.lang.FunctionalInterface public interface Consumer<T> {
+    method public void accept(T!);
   }
 
-  public fun interface Function<T, R> {
-    method public R apply(T t);
+  @java.lang.FunctionalInterface public interface Function<T, R> {
+    method public R! apply(T!);
   }
 
-  public fun interface Predicate<T> {
-    method public boolean test(T t);
+  @java.lang.FunctionalInterface public interface Predicate<T> {
+    method public boolean test(T!);
   }
 
 }
diff --git a/window/extensions/core/core/api/restricted_current.txt b/window/extensions/core/core/api/restricted_current.txt
index c56a051..c1191a1 100644
--- a/window/extensions/core/core/api/restricted_current.txt
+++ b/window/extensions/core/core/api/restricted_current.txt
@@ -1,16 +1,16 @@
 // Signature format: 4.0
 package androidx.window.extensions.core.util.function {
 
-  public fun interface Consumer<T> {
-    method public void accept(T t);
+  @java.lang.FunctionalInterface public interface Consumer<T> {
+    method public void accept(T!);
   }
 
-  public fun interface Function<T, R> {
-    method public R apply(T t);
+  @java.lang.FunctionalInterface public interface Function<T, R> {
+    method public R! apply(T!);
   }
 
-  public fun interface Predicate<T> {
-    method public boolean test(T t);
+  @java.lang.FunctionalInterface public interface Predicate<T> {
+    method public boolean test(T!);
   }
 
 }
diff --git a/window/extensions/core/core/build.gradle b/window/extensions/core/core/build.gradle
index 32c1f9e..a1d7e3b 100644
--- a/window/extensions/core/core/build.gradle
+++ b/window/extensions/core/core/build.gradle
@@ -21,7 +21,6 @@
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
-    id("org.jetbrains.kotlin.android")
 }
 
 dependencies {
diff --git a/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Consumer.kt b/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Consumer.java
similarity index 76%
rename from window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Consumer.kt
rename to window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Consumer.java
index 35b081a..8fee672 100644
--- a/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Consumer.kt
+++ b/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Consumer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 The Android Open Source Project
+ * Copyright 2023 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,22 +14,23 @@
  * limitations under the License.
  */
 
-package androidx.window.extensions.core.util.function
+package androidx.window.extensions.core.util.function;
 
 /**
  * Represents a function that accepts an argument and produces no result.
  * It is used internally to avoid using Java 8 functional interface that leads to desugaring and
  * Proguard shrinking.
  *
- * @param T: the type of the input of the function
+ * @param <T>: the type of the input of the function
  *
  * @see java.util.function.Consumer
  */
-fun interface Consumer<in T : Any> {
+@FunctionalInterface
+public interface Consumer<T> {
     /**
      * Performs the operation on the given argument
      *
-     * @param t: the input argument
+     * @param t the input argument
      */
-    fun accept(t: T)
-}
\ No newline at end of file
+    void accept(T t);
+}
diff --git a/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Function.kt b/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Function.java
similarity index 76%
rename from window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Function.kt
rename to window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Function.java
index 8bf58d0..4bc7bcb 100644
--- a/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Function.kt
+++ b/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Function.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 The Android Open Source Project
+ * Copyright 2023 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,24 +14,25 @@
  * limitations under the License.
  */
 
-package androidx.window.extensions.core.util.function
+package androidx.window.extensions.core.util.function;
 
 /**
  * Represents a function that accepts an argument and produces a result.
  * It is used internally to avoid using Java 8 functional interface that leads to desugaring and
  * Proguard shrinking.
  *
- * @param T: the type of the input of the function
- * @param R: the type of the output of the function
+ * @param <T>: the type of the input of the function
+ * @param <R>: the type of the output of the function
  *
  * @see java.util.function.Function
  */
-fun interface Function<in T : Any, out R : Any> {
+@FunctionalInterface
+public interface Function<T, R> {
     /**
      * Applies this function to the given argument.
      *
      * @param t the function argument
      * @return the function result
      */
-    fun apply(t: T): R
-}
\ No newline at end of file
+    R apply(T t);
+}
diff --git a/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Predicate.kt b/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Predicate.java
similarity index 73%
rename from window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Predicate.kt
rename to window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Predicate.java
index 02fc0ea..4942523 100644
--- a/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Predicate.kt
+++ b/window/extensions/core/core/src/main/java/androidx/window/extensions/core/util/function/Predicate.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 The Android Open Source Project
+ * Copyright 2023 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,23 +14,24 @@
  * limitations under the License.
  */
 
-package androidx.window.extensions.core.util.function
+package androidx.window.extensions.core.util.function;
 
 /**
  * Represents a predicate boolean-valued function of one argument.
  * It is used internally to avoid using Java 8 functional interface that leads to desugaring and
  * Proguard shrinking.
  *
- * @param T the type of the input to the predicate
+ * @param <T> the type of the input to the predicate
  *
  * @see java.util.function.Predicate
  */
-fun interface Predicate<in T : Any> {
+@FunctionalInterface
+public interface Predicate<T> {
     /**
      * Tests the predicate against a given argument.
      *
      * @param t the input of the predicate
-     * @return `true` if the input matches the [Predicate], otherwise, `false`
+     * @return {@code true} if the input matches the {@code Predicate}, otherwise, {@code false}
      */
-    fun test(t: T): Boolean
-}
\ No newline at end of file
+    boolean test(T t);
+}
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
index 1036820..4d9b724c 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
@@ -1598,6 +1598,7 @@
     @Test
     @LargeTest
     @SuppressWarnings("unchecked")
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testCancelAllWork_updatesLastCancelAllTimeLiveData() throws InterruptedException {
         PreferenceUtils preferenceUtils = new PreferenceUtils(mWorkManagerImpl.getWorkDatabase());
         preferenceUtils.setLastCancelAllTimeMillis(0L);
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/AlarmsTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/AlarmsTest.java
index 164a3ef..b9442eef 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/AlarmsTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/AlarmsTest.java
@@ -28,6 +28,7 @@
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 import androidx.work.DatabaseTest;
 import androidx.work.OneTimeWorkRequest;
@@ -49,6 +50,7 @@
     private final long mTriggerAt = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1);
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testSetAlarm_noPreExistingAlarms() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWork(work);
@@ -60,6 +62,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testSetAlarm_withPreExistingAlarms() {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
         insertWork(work);
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
index 619d14b..e1edd07 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
@@ -46,6 +46,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.testutils.RepeatRule;
 import androidx.work.Configuration;
 import androidx.work.Constraints;
@@ -202,6 +203,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testSchedule() throws InterruptedException {
         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
                 .setLastEnqueueTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS)