diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformCompositionLocals.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformCompositionLocals.kt index 03aad1a9eceb0..abf1910017d28 100644 --- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformCompositionLocals.kt +++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformCompositionLocals.kt @@ -24,7 +24,8 @@ internal actual fun ProvidePlatformCompositionLocals( content: @Composable () -> Unit ) { CompositionLocalProvider( - LocalLocalization provides defaultPlatformLocalization(), + // See https://issuetracker.google.com/issues/330036209 for why `arrayOf` is used. + values = arrayOf(LocalLocalization providesDefault defaultPlatformLocalization()), content = content ) } \ No newline at end of file diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt index 042577267a53c..1495c7d2fd122 100644 --- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt +++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt @@ -228,7 +228,7 @@ suspend fun awaitApplication( // This is also provided in `ProvidePlatformCompositionLocals`, but // for backwards compatibility we need to provide it in the // application scope too. - LocalLocalization provides defaultPlatformLocalization() + LocalLocalization providesDefault defaultPlatformLocalization() ) { applicationScope.content() } diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/PlatformLocalizationTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/PlatformLocalizationTest.kt index 5e3856a644034..39749dd02d881 100644 --- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/PlatformLocalizationTest.kt +++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/PlatformLocalizationTest.kt @@ -32,8 +32,11 @@ import androidx.compose.ui.test.ComposeUiTest import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import androidx.compose.ui.window.ApplicationScope +import androidx.compose.ui.window.Popup +import androidx.compose.ui.window.Window import androidx.compose.ui.window.runApplicationTest import kotlin.test.Test +import kotlin.test.assertEquals import kotlin.test.assertNotNull @OptIn(ExperimentalTestApi::class) @@ -86,10 +89,10 @@ class PlatformLocalizationTest { val textManager = object: TextContextMenu.TextManager { override val selectedText: AnnotatedString get() = AnnotatedString("") - override val cut = { println("Cutting") } - override val copy = { println("Copying") } - override val paste = { println("Pasting ")} - override val selectAll = { println("Selecting all") } + override val cut = { } + override val copy = { } + override val paste = { } + override val selectAll = { } } setContent { @@ -113,4 +116,63 @@ class PlatformLocalizationTest { onNodeWithText("Paste").assertDoesNotExist() onNodeWithText("Select All").assertDoesNotExist() } + + /** + * Verify that providing a [PlatformLocalization] in [LocalLocalization] in the application + * scope correctly overrides it in the window scope. + */ + @Test + fun canOverridePlatformLocalizationFromAppToWindowScope() = runApplicationTest { + val customLocalization = object : PlatformLocalization { + override val copy: String + get() = "My Copy" + override val cut: String + get() = "My Cut" + override val paste: String + get() = "My Paste" + override val selectAll: String + get() = "My Select All" + } + + lateinit var actualLocalization: PlatformLocalization + launchTestApplication { + CompositionLocalProvider(LocalLocalization provides customLocalization) { + Window(onCloseRequest = { }) { + actualLocalization = LocalLocalization.current + } + } + } + awaitIdle() + + assertEquals(customLocalization, actualLocalization) + } + + /** + * Verify that providing a [PlatformLocalization] in [LocalLocalization] in the window scope + * correctly overrides it in a [Popup]. + */ + @Test + fun canOverridePlatformLocalizationFromWindowToPopupScope() = runComposeUiTest { + val customLocalization = object : PlatformLocalization { + override val copy: String + get() = "My Copy" + override val cut: String + get() = "My Cut" + override val paste: String + get() = "My Paste" + override val selectAll: String + get() = "My Select All" + } + + lateinit var actualLocalization: PlatformLocalization + setContent { + CompositionLocalProvider(LocalLocalization provides customLocalization) { + Popup { + actualLocalization = LocalLocalization.current + } + } + } + + assertEquals(customLocalization, actualLocalization) + } } \ No newline at end of file