From 70c00f604330fd6ca71f40b31c8a616ef2146599 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Thu, 18 Apr 2024 17:25:19 +0200 Subject: [PATCH 01/10] [resources] Add functions to retrieve bytes from drawable or font resources. --- .../compose/resources/FontResources.kt | 20 ++++++++++++++++++- .../compose/resources/ImageResources.kt | 18 ++++++++++++++++- .../compose/resources/ComposeResourceTest.kt | 16 +++++++++++++++ .../jetbrains/compose/resources/TestUtils.kt | 5 +++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt index 1493218d58..1923c46719 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt @@ -2,6 +2,7 @@ package org.jetbrains.compose.resources import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable +import androidx.compose.runtime.getValue import androidx.compose.ui.text.font.* /** @@ -32,4 +33,21 @@ expect fun Font( resource: FontResource, weight: FontWeight = FontWeight.Normal, style: FontStyle = FontStyle.Normal -): Font \ No newline at end of file +): Font + +/** + * Retrieves an ByteArray using the specified font resource. + * + * @param resource The font resource to be used. + * @return The ByteArray loaded from the resource. + */ +@ExperimentalResourceApi +@Composable +fun getFontResourceBytes(resource: FontResource): ByteArray { + val resourceReader = LocalResourceReader.current + val bytes by rememberResourceState(resource, resourceReader, { ByteArray(0) }) { env -> + val item = resource.getResourceItemByEnvironment(env) + resourceReader.read(item.path) + } + return bytes +} \ No newline at end of file diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt index cdb9d85224..9efbcc8bd1 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt @@ -95,7 +95,6 @@ internal expect fun SvgElement.toSvgPainter(density: Density): Painter private val emptySvgPainter: Painter by lazy { BitmapPainter(emptyImageBitmap) } -@OptIn(ExperimentalResourceApi::class) @Composable private fun svgPainter(resource: DrawableResource): Painter { val resourceReader = LocalResourceReader.current @@ -110,6 +109,23 @@ private fun svgPainter(resource: DrawableResource): Painter { return svgPainter } +/** + * Retrieves an ByteArray using the specified drawable resource. + * + * @param resource The drawable resource to be used. + * @return The ByteArray loaded from the resource. + */ +@ExperimentalResourceApi +@Composable +fun getDrawableResourceBytes(resource: DrawableResource): ByteArray { + val resourceReader = LocalResourceReader.current + val bytes by rememberResourceState(resource, resourceReader, { ByteArray(0) }) { env -> + val item = resource.getResourceItemByEnvironment(env) + resourceReader.read(item.path) + } + return bytes +} + internal expect fun ByteArray.toImageBitmap(): ImageBitmap internal expect fun ByteArray.toXmlElement(): Element internal expect fun ByteArray.toSvgElement(): SvgElement diff --git a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt index d12ececcda..65cdd920b2 100644 --- a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt +++ b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt @@ -304,4 +304,20 @@ class ComposeResourceTest { assertTrue(uri1.endsWith("/1.png")) assertTrue(uri2.endsWith("/2.png")) } + + @OptIn(ExperimentalResourceApi::class) + @Test + fun testGetResourceBytes() = runComposeUiTest { + var imageBytes = ByteArray(0) + var fontBytes = ByteArray(0) + setContent { + CompositionLocalProvider(LocalComposeEnvironment provides TestComposeEnvironment) { + imageBytes = getDrawableResourceBytes(TestDrawableResource("1.png")) + fontBytes = getFontResourceBytes(TestFontResource("font_awesome.otf")) + } + } + waitForIdle() + assertEquals(946, imageBytes.size) + assertEquals(134808, fontBytes.size) + } } diff --git a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/TestUtils.kt b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/TestUtils.kt index e260331f78..42f5b4f02c 100644 --- a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/TestUtils.kt +++ b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/TestUtils.kt @@ -40,6 +40,11 @@ internal fun TestDrawableResource(path: String) = DrawableResource( setOf(ResourceItem(emptySet(), path, -1, -1)) ) +internal fun TestFontResource(path: String) = FontResource( + path, + setOf(ResourceItem(emptySet(), path, -1, -1)) +) + internal fun parsePluralSamples(samples: String): List { return samples.split(',').flatMap { val range = it.trim() From cd2646029a573ad1ab3c2dd26462910d013d85c0 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Fri, 19 Apr 2024 17:45:56 +0200 Subject: [PATCH 02/10] [resources] Add optional environment parameter to non-compose resource loading functions and function to get current compose environment --- .../compose/resources/FontResources.kt | 21 +++++----- .../compose/resources/ImageResources.kt | 21 +++++----- .../resources/PluralStringResources.kt | 39 +++++++++++++++++++ .../compose/resources/ResourceEnvironment.kt | 24 +++++++++--- .../compose/resources/StringArrayResources.kt | 14 +++++++ .../compose/resources/StringResources.kt | 33 ++++++++++++++++ .../compose/resources/ComposeResourceTest.kt | 25 +++++++----- 7 files changed, 140 insertions(+), 37 deletions(-) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt index 1923c46719..fb29378bf7 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt @@ -36,18 +36,17 @@ expect fun Font( ): Font /** - * Retrieves an ByteArray using the specified font resource. + * Retrieves the byte array of the font resource. * - * @param resource The font resource to be used. - * @return The ByteArray loaded from the resource. + * @param environment The optional resource environment. + * @param resource The font resource. + * @return The byte array representing the font resource. */ @ExperimentalResourceApi -@Composable -fun getFontResourceBytes(resource: FontResource): ByteArray { - val resourceReader = LocalResourceReader.current - val bytes by rememberResourceState(resource, resourceReader, { ByteArray(0) }) { env -> - val item = resource.getResourceItemByEnvironment(env) - resourceReader.read(item.path) - } - return bytes +suspend fun getFontResourceBytes( + environment: ResourceEnvironment = getResourceEnvironment(), + resource: FontResource +): ByteArray { + val resourceItem = resource.getResourceItemByEnvironment(environment) + return DefaultResourceReader.read(resourceItem.path) } \ No newline at end of file diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt index 9efbcc8bd1..920cf8c8a2 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt @@ -110,20 +110,19 @@ private fun svgPainter(resource: DrawableResource): Painter { } /** - * Retrieves an ByteArray using the specified drawable resource. + * Retrieves the byte array of the drawable resource. * - * @param resource The drawable resource to be used. - * @return The ByteArray loaded from the resource. + * @param environment The optional resource environment. + * @param resource The drawable resource. + * @return The byte array representing the drawable resource. */ @ExperimentalResourceApi -@Composable -fun getDrawableResourceBytes(resource: DrawableResource): ByteArray { - val resourceReader = LocalResourceReader.current - val bytes by rememberResourceState(resource, resourceReader, { ByteArray(0) }) { env -> - val item = resource.getResourceItemByEnvironment(env) - resourceReader.read(item.path) - } - return bytes +suspend fun getDrawableResourceBytes( + environment: ResourceEnvironment = getResourceEnvironment(), + resource: DrawableResource +): ByteArray { + val resourceItem = resource.getResourceItemByEnvironment(environment) + return DefaultResourceReader.read(resourceItem.path) } internal expect fun ByteArray.toImageBitmap(): ImageBitmap diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt index abe769000f..6b5ec089d6 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt @@ -45,6 +45,22 @@ fun pluralStringResource(resource: PluralStringResource, quantity: Int): String suspend fun getPluralString(resource: PluralStringResource, quantity: Int): String = loadPluralString(resource, quantity, DefaultResourceReader, getResourceEnvironment()) +/** + * Loads a string using the specified string resource. + * + * @param environment The resource environment. + * @param resource The string resource to be used. + * @param quantity The quantity of the pluralization to use. + * @return The loaded string resource. + * + * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. + */ +suspend fun getPluralString( + environment: ResourceEnvironment, + resource: PluralStringResource, + quantity: Int +): String = loadPluralString(resource, quantity, DefaultResourceReader, environment) + private suspend fun loadPluralString( resource: PluralStringResource, quantity: Int, @@ -102,6 +118,29 @@ suspend fun getPluralString(resource: PluralStringResource, quantity: Int, varar getResourceEnvironment(), ) +/** + * Loads a string using the specified string resource. + * + * @param environment The resource environment. + * @param resource The string resource to be used. + * @param quantity The quantity of the pluralization to use. + * @param formatArgs The arguments to be inserted into the formatted string. + * @return The loaded string resource. + * + * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. + */ +suspend fun getPluralString( + environment: ResourceEnvironment, + resource: PluralStringResource, + quantity: Int, + vararg formatArgs: Any +): String = loadPluralString( + resource, quantity, + formatArgs.map { it.toString() }, + DefaultResourceReader, + environment +) + private suspend fun loadPluralString( resource: PluralStringResource, quantity: Int, diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt index 51b37b8313..772d6b2382 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt @@ -5,11 +5,11 @@ import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.intl.Locale -internal data class ResourceEnvironment( - val language: LanguageQualifier, - val region: RegionQualifier, - val theme: ThemeQualifier, - val density: DensityQualifier +data class ResourceEnvironment internal constructor( + internal val language: LanguageQualifier, + internal val region: RegionQualifier, + internal val theme: ThemeQualifier, + internal val density: DensityQualifier ) internal interface ComposeEnvironment { @@ -39,6 +39,20 @@ internal val DefaultComposeEnvironment = object : ComposeEnvironment { //ComposeEnvironment provider will be overridden for tests internal val LocalComposeEnvironment = staticCompositionLocalOf { DefaultComposeEnvironment } +/** + * Returns an instance of [ResourceEnvironment]. + * + * The [ResourceEnvironment] class represents the environment for resources. + * + * @return An instance of [ResourceEnvironment] representing the current environment. + */ +@ExperimentalResourceApi +@Composable +fun rememberResourceEnvironment(): ResourceEnvironment { + val composeEnvironment = LocalComposeEnvironment.current + return composeEnvironment.rememberEnvironment() +} + internal expect fun getSystemEnvironment(): ResourceEnvironment //the function reference will be overridden for tests diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt index 6eb35147e8..6fd34f9eb0 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt @@ -48,6 +48,20 @@ fun stringArrayResource(resource: StringArrayResource): List { suspend fun getStringArray(resource: StringArrayResource): List = loadStringArray(resource, DefaultResourceReader, getResourceEnvironment()) +/** + * Loads a list of strings using the specified string array resource. + * + * @param environment The resource environment. + * @param resource The string array resource to be used. + * @return A list of strings representing the items in the string array. + * + * @throws IllegalStateException if the string array with the given ID is not found. + */ +suspend fun getStringArray( + environment: ResourceEnvironment, + resource: StringArrayResource +): List = loadStringArray(resource, DefaultResourceReader, environment) + private suspend fun loadStringArray( resource: StringArrayResource, resourceReader: ResourceReader, diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt index 9fcbc4c9b9..79ef9e7f24 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt @@ -41,6 +41,18 @@ fun stringResource(resource: StringResource): String { suspend fun getString(resource: StringResource): String = loadString(resource, DefaultResourceReader, getResourceEnvironment()) +/** + * Loads a string using the specified string resource. + * + * @param environment The resource environment. + * @param resource The string resource to be used. + * @return The loaded string resource. + * + * @throws IllegalArgumentException If the provided ID is not found in the resource file. + */ +suspend fun getString(environment: ResourceEnvironment, resource: StringResource): String = + loadString(resource, DefaultResourceReader, environment) + private suspend fun loadString( resource: StringResource, resourceReader: ResourceReader, @@ -86,6 +98,27 @@ suspend fun getString(resource: StringResource, vararg formatArgs: Any): String getResourceEnvironment() ) +/** + * Loads a formatted string using the specified string resource and arguments. + * + * @param environment The resource environment. + * @param resource The string resource to be used. + * @param formatArgs The arguments to be inserted into the formatted string. + * @return The formatted string resource. + * + * @throws IllegalArgumentException If the provided ID is not found in the resource file. + */ +suspend fun getString( + environment: ResourceEnvironment, + resource: StringResource, + vararg formatArgs: Any +): String = loadString( + resource, + formatArgs.map { it.toString() }, + DefaultResourceReader, + environment +) + private suspend fun loadString( resource: StringResource, args: List, diff --git a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt index 65cdd920b2..3a0cb15f28 100644 --- a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt +++ b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt @@ -6,7 +6,6 @@ import androidx.compose.runtime.* import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.runComposeUiTest import kotlinx.coroutines.test.runTest -import org.jetbrains.skiko.URIManager import kotlin.test.* @OptIn(ExperimentalTestApi::class, InternalResourceApi::class) @@ -307,17 +306,23 @@ class ComposeResourceTest { @OptIn(ExperimentalResourceApi::class) @Test - fun testGetResourceBytes() = runComposeUiTest { - var imageBytes = ByteArray(0) - var fontBytes = ByteArray(0) + fun testGetResourceBytes() = runTest { + val imageBytes = getDrawableResourceBytes(resource = TestDrawableResource("1.png")) + assertEquals(946, imageBytes.size) + val fontBytes = getFontResourceBytes(resource = TestFontResource("font_awesome.otf")) + assertEquals(134808, fontBytes.size) + } + + @OptIn(ExperimentalResourceApi::class) + @Test + fun testGetResourceEnvironment() = runComposeUiTest { + var environment: ResourceEnvironment? = null setContent { - CompositionLocalProvider(LocalComposeEnvironment provides TestComposeEnvironment) { - imageBytes = getDrawableResourceBytes(TestDrawableResource("1.png")) - fontBytes = getFontResourceBytes(TestFontResource("font_awesome.otf")) - } + environment = rememberResourceEnvironment() } waitForIdle() - assertEquals(946, imageBytes.size) - assertEquals(134808, fontBytes.size) + + val systemEnvironment = getSystemEnvironment() + assertEquals(systemEnvironment, environment) } } From 052066fb45e1f35efa9c310e1bd929cd3eb511e8 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 12:50:09 +0200 Subject: [PATCH 03/10] [resources] Add experimental getSystemResourceEnvironment function. --- .../org/jetbrains/compose/resources/FontResources.kt | 2 +- .../org/jetbrains/compose/resources/ImageResources.kt | 2 +- .../jetbrains/compose/resources/PluralStringResources.kt | 6 ++++-- .../jetbrains/compose/resources/ResourceEnvironment.kt | 8 ++++++-- .../jetbrains/compose/resources/StringArrayResources.kt | 3 ++- .../org/jetbrains/compose/resources/StringResources.kt | 6 ++++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt index fb29378bf7..528c3be0be 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt @@ -44,7 +44,7 @@ expect fun Font( */ @ExperimentalResourceApi suspend fun getFontResourceBytes( - environment: ResourceEnvironment = getResourceEnvironment(), + environment: ResourceEnvironment = getSystemResourceEnvironment(), resource: FontResource ): ByteArray { val resourceItem = resource.getResourceItemByEnvironment(environment) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt index 920cf8c8a2..84cb6b12c3 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt @@ -118,7 +118,7 @@ private fun svgPainter(resource: DrawableResource): Painter { */ @ExperimentalResourceApi suspend fun getDrawableResourceBytes( - environment: ResourceEnvironment = getResourceEnvironment(), + environment: ResourceEnvironment = getSystemResourceEnvironment(), resource: DrawableResource ): ByteArray { val resourceItem = resource.getResourceItemByEnvironment(environment) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt index 6b5ec089d6..a7936c7c0d 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt @@ -42,8 +42,9 @@ fun pluralStringResource(resource: PluralStringResource, quantity: Int): String * * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. */ +@OptIn(ExperimentalResourceApi::class) suspend fun getPluralString(resource: PluralStringResource, quantity: Int): String = - loadPluralString(resource, quantity, DefaultResourceReader, getResourceEnvironment()) + loadPluralString(resource, quantity, DefaultResourceReader, getSystemResourceEnvironment()) /** * Loads a string using the specified string resource. @@ -110,12 +111,13 @@ fun pluralStringResource(resource: PluralStringResource, quantity: Int, vararg f * * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. */ +@OptIn(ExperimentalResourceApi::class) suspend fun getPluralString(resource: PluralStringResource, quantity: Int, vararg formatArgs: Any): String = loadPluralString( resource, quantity, formatArgs.map { it.toString() }, DefaultResourceReader, - getResourceEnvironment(), + getSystemResourceEnvironment(), ) /** diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt index 772d6b2382..276ed20dc6 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt @@ -56,11 +56,15 @@ fun rememberResourceEnvironment(): ResourceEnvironment { internal expect fun getSystemEnvironment(): ResourceEnvironment //the function reference will be overridden for tests +//@TestOnly +internal var getResourceEnvironment = ::getSystemEnvironment + /** - * Provides the resource environment for non-composable access to string resources. + * Provides the resource environment for non-composable access to resources. * It is an expensive operation! Don't use it in composable functions with no cache! */ -internal var getResourceEnvironment = ::getSystemEnvironment +@ExperimentalResourceApi +fun getSystemResourceEnvironment(): ResourceEnvironment = getResourceEnvironment() @OptIn(InternalResourceApi::class) internal fun Resource.getResourceItemByEnvironment(environment: ResourceEnvironment): ResourceItem { diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt index 6fd34f9eb0..04a9cccef1 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt @@ -45,8 +45,9 @@ fun stringArrayResource(resource: StringArrayResource): List { * * @throws IllegalStateException if the string array with the given ID is not found. */ +@OptIn(ExperimentalResourceApi::class) suspend fun getStringArray(resource: StringArrayResource): List = - loadStringArray(resource, DefaultResourceReader, getResourceEnvironment()) + loadStringArray(resource, DefaultResourceReader, getSystemResourceEnvironment()) /** * Loads a list of strings using the specified string array resource. diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt index 79ef9e7f24..edf7dc03b6 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt @@ -38,8 +38,9 @@ fun stringResource(resource: StringResource): String { * * @throws IllegalArgumentException If the provided ID is not found in the resource file. */ +@OptIn(ExperimentalResourceApi::class) suspend fun getString(resource: StringResource): String = - loadString(resource, DefaultResourceReader, getResourceEnvironment()) + loadString(resource, DefaultResourceReader, getSystemResourceEnvironment()) /** * Loads a string using the specified string resource. @@ -91,11 +92,12 @@ fun stringResource(resource: StringResource, vararg formatArgs: Any): String { * * @throws IllegalArgumentException If the provided ID is not found in the resource file. */ +@OptIn(ExperimentalResourceApi::class) suspend fun getString(resource: StringResource, vararg formatArgs: Any): String = loadString( resource, formatArgs.map { it.toString() }, DefaultResourceReader, - getResourceEnvironment() + getSystemResourceEnvironment() ) /** From 69304467502947386d5ade0bf222a60bb12987a9 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 14:29:12 +0200 Subject: [PATCH 04/10] [resources] Update compose multiplatform version. --- components/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/gradle.properties b/components/gradle.properties index f44311c992..9b1f014bb7 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -8,7 +8,7 @@ android.useAndroidX=true #Versions kotlin.version=1.9.23 -compose.version=1.6.10-beta01 +compose.version=1.6.10-dev1596 agp.version=8.2.2 #Compose From a98d479952402495009d3c5607e5cfa2014a7ff9 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 14:30:13 +0200 Subject: [PATCH 05/10] [resources] Mark ResourceEnvironment as experimental and add a sample of usage. --- .../resources/demo/shared/build.gradle.kts | 5 -- .../compose/resources/demo/shared/FileRes.kt | 53 ++++++++++++++++++- components/resources/library/build.gradle.kts | 1 + .../resources/PluralStringResources.kt | 2 - .../compose/resources/ResourceEnvironment.kt | 1 + .../compose/resources/StringArrayResources.kt | 1 - .../compose/resources/StringResources.kt | 2 - 7 files changed, 54 insertions(+), 11 deletions(-) diff --git a/components/resources/demo/shared/build.gradle.kts b/components/resources/demo/shared/build.gradle.kts index cecd7b3f1d..5cb567bec0 100644 --- a/components/resources/demo/shared/build.gradle.kts +++ b/components/resources/demo/shared/build.gradle.kts @@ -52,11 +52,6 @@ kotlin { applyDefaultHierarchyTemplate() sourceSets { - all { - languageSettings { - optIn("org.jetbrains.compose.resources.ExperimentalResourceApi") - } - } val desktopMain by getting val wasmJsMain by getting diff --git a/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/FileRes.kt b/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/FileRes.kt index efe4b68737..fc40f20c2f 100644 --- a/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/FileRes.kt +++ b/components/resources/demo/shared/src/commonMain/kotlin/org/jetbrains/compose/resources/demo/shared/FileRes.kt @@ -9,11 +9,16 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import components.resources.demo.shared.generated.resources.Res +import components.resources.demo.shared.generated.resources.droid_icon +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.getDrawableResourceBytes +import org.jetbrains.compose.resources.rememberResourceEnvironment +@OptIn(ExperimentalResourceApi::class) @Composable fun FileRes(paddingValues: PaddingValues) { Column( - modifier = Modifier.padding(paddingValues) + modifier = Modifier.padding(paddingValues).verticalScroll(rememberScrollState()) ) { Text( modifier = Modifier.padding(16.dp), @@ -48,6 +53,34 @@ fun FileRes(paddingValues: PaddingValues) { Text(bytes.decodeToString()) """.trimIndent() ) + HorizontalDivider(modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp)) + OutlinedCard( + modifier = Modifier.padding(horizontal = 16.dp), + shape = RoundedCornerShape(4.dp), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer) + ) { + val composeEnv = rememberResourceEnvironment() + var bytes by remember { mutableStateOf(ByteArray(0)) } + LaunchedEffect(Unit) { + bytes = getDrawableResourceBytes(composeEnv, Res.drawable.droid_icon) + } + Text( + modifier = Modifier.padding(8.dp), + text = "droid_icon byte size = " + bytes.size, + color = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + Text( + modifier = Modifier.padding(16.dp), + text = """ + val composeEnv = rememberResourceEnvironment() + var bytes by remember { mutableStateOf(ByteArray(0)) } + LaunchedEffect(Unit) { + bytes = getDrawableResourceBytes(composeEnv, Res.drawable.droid_icon) + } + Text("droid_icon byte size = " + bytes.size) + """.trimIndent() + ) Text( modifier = Modifier.padding(16.dp), text = "File: 'files/platform-text.txt'", @@ -80,5 +113,23 @@ fun FileRes(paddingValues: PaddingValues) { Text(bytes.decodeToString()) """.trimIndent() ) + HorizontalDivider(modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp)) + OutlinedCard( + modifier = Modifier.padding(horizontal = 16.dp), + shape = RoundedCornerShape(4.dp), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer) + ) { + Text( + modifier = Modifier.padding(8.dp), + text = "File URI: " + Res.getUri("files/platform-text.txt"), + color = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + Text( + modifier = Modifier.padding(16.dp), + text = """ + Text("File URI: " + Res.getUri("files/platform-text.txt")) + """.trimIndent() + ) } } \ No newline at end of file diff --git a/components/resources/library/build.gradle.kts b/components/resources/library/build.gradle.kts index 6cb66172d9..b23ba687eb 100644 --- a/components/resources/library/build.gradle.kts +++ b/components/resources/library/build.gradle.kts @@ -53,6 +53,7 @@ kotlin { optIn("kotlinx.cinterop.ExperimentalForeignApi") optIn("kotlin.experimental.ExperimentalNativeApi") optIn("org.jetbrains.compose.resources.InternalResourceApi") + optIn("org.jetbrains.compose.resources.ExperimentalResourceApi") } } diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt index a7936c7c0d..75227432d6 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt @@ -42,7 +42,6 @@ fun pluralStringResource(resource: PluralStringResource, quantity: Int): String * * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. */ -@OptIn(ExperimentalResourceApi::class) suspend fun getPluralString(resource: PluralStringResource, quantity: Int): String = loadPluralString(resource, quantity, DefaultResourceReader, getSystemResourceEnvironment()) @@ -111,7 +110,6 @@ fun pluralStringResource(resource: PluralStringResource, quantity: Int, vararg f * * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. */ -@OptIn(ExperimentalResourceApi::class) suspend fun getPluralString(resource: PluralStringResource, quantity: Int, vararg formatArgs: Any): String = loadPluralString( resource, quantity, diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt index 276ed20dc6..3965a75797 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.intl.Locale +@ExperimentalResourceApi data class ResourceEnvironment internal constructor( internal val language: LanguageQualifier, internal val region: RegionQualifier, diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt index 04a9cccef1..c44ba23798 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt @@ -45,7 +45,6 @@ fun stringArrayResource(resource: StringArrayResource): List { * * @throws IllegalStateException if the string array with the given ID is not found. */ -@OptIn(ExperimentalResourceApi::class) suspend fun getStringArray(resource: StringArrayResource): List = loadStringArray(resource, DefaultResourceReader, getSystemResourceEnvironment()) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt index edf7dc03b6..91e62bdd1a 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt @@ -38,7 +38,6 @@ fun stringResource(resource: StringResource): String { * * @throws IllegalArgumentException If the provided ID is not found in the resource file. */ -@OptIn(ExperimentalResourceApi::class) suspend fun getString(resource: StringResource): String = loadString(resource, DefaultResourceReader, getSystemResourceEnvironment()) @@ -92,7 +91,6 @@ fun stringResource(resource: StringResource, vararg formatArgs: Any): String { * * @throws IllegalArgumentException If the provided ID is not found in the resource file. */ -@OptIn(ExperimentalResourceApi::class) suspend fun getString(resource: StringResource, vararg formatArgs: Any): String = loadString( resource, formatArgs.map { it.toString() }, From 031359e186ea46ee1135973d13d3bec771ffdffb Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 14:44:01 +0200 Subject: [PATCH 06/10] [resources] Delete macos native target from the demo app. Because resources are not supported on native message targets. --- components/README.md | 4 ---- .../resources/demo/shared/build.gradle.kts | 11 ----------- .../composeResources/files/platform-text.txt | 1 - .../shared/src/macosMain/kotlin/main.macos.kt | 17 ----------------- 4 files changed, 33 deletions(-) delete mode 100644 components/resources/demo/shared/src/macosMain/composeResources/files/platform-text.txt delete mode 100644 components/resources/demo/shared/src/macosMain/kotlin/main.macos.kt diff --git a/components/README.md b/components/README.md index 7c58b9785b..7ec4fc353c 100644 --- a/components/README.md +++ b/components/README.md @@ -13,10 +13,6 @@ in Android Studio or in AppCode with [installed CocoaPods](https://kotlinlang.or ### Run JS in browser with WebAssembly Skia via Gradle: `./gradlew :resources:demo:shared:jsBrowserDevelopmentRun` -### Run MacOS via Gradle: - - on Intel CPU: `./gradlew :resources:demo:shared:runDebugExecutableMacosX64` - - on Apple Silicon: `./gradlew :resources:demo:shared:runDebugExecutableMacosArm64` - # Tests Run script: ```bash diff --git a/components/resources/demo/shared/build.gradle.kts b/components/resources/demo/shared/build.gradle.kts index 5cb567bec0..cc87a66ef0 100644 --- a/components/resources/demo/shared/build.gradle.kts +++ b/components/resources/demo/shared/build.gradle.kts @@ -39,17 +39,6 @@ kotlin { binaries.executable() } - listOf( - macosX64(), - macosArm64() - ).forEach { macosTarget -> - macosTarget.binaries { - executable { - entryPoint = "main" - } - } - } - applyDefaultHierarchyTemplate() sourceSets { val desktopMain by getting diff --git a/components/resources/demo/shared/src/macosMain/composeResources/files/platform-text.txt b/components/resources/demo/shared/src/macosMain/composeResources/files/platform-text.txt deleted file mode 100644 index c0ab602c16..0000000000 --- a/components/resources/demo/shared/src/macosMain/composeResources/files/platform-text.txt +++ /dev/null @@ -1 +0,0 @@ -macOS platform \ No newline at end of file diff --git a/components/resources/demo/shared/src/macosMain/kotlin/main.macos.kt b/components/resources/demo/shared/src/macosMain/kotlin/main.macos.kt deleted file mode 100644 index 963d3badf7..0000000000 --- a/components/resources/demo/shared/src/macosMain/kotlin/main.macos.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.window.Window -import org.jetbrains.compose.resources.demo.shared.UseResources -import platform.AppKit.NSApp -import platform.AppKit.NSApplication - -fun main() { - NSApplication.sharedApplication() - Window("Resources demo") { - UseResources() - } - NSApp?.run() -} From 5d857dd203f3a8c1910f9c6a239e025ddbc1abdb Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 16:07:00 +0200 Subject: [PATCH 07/10] [resources] Mark new API as experimental. --- .../org/jetbrains/compose/resources/PluralStringResources.kt | 2 ++ .../org/jetbrains/compose/resources/StringArrayResources.kt | 1 + .../kotlin/org/jetbrains/compose/resources/StringResources.kt | 2 ++ 3 files changed, 5 insertions(+) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt index 75227432d6..27be9337f5 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/PluralStringResources.kt @@ -55,6 +55,7 @@ suspend fun getPluralString(resource: PluralStringResource, quantity: Int): Stri * * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. */ +@ExperimentalResourceApi suspend fun getPluralString( environment: ResourceEnvironment, resource: PluralStringResource, @@ -129,6 +130,7 @@ suspend fun getPluralString(resource: PluralStringResource, quantity: Int, varar * * @throws IllegalArgumentException If the provided ID or the pluralization is not found in the resource file. */ +@ExperimentalResourceApi suspend fun getPluralString( environment: ResourceEnvironment, resource: PluralStringResource, diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt index c44ba23798..e89aa5c600 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringArrayResources.kt @@ -57,6 +57,7 @@ suspend fun getStringArray(resource: StringArrayResource): List = * * @throws IllegalStateException if the string array with the given ID is not found. */ +@ExperimentalResourceApi suspend fun getStringArray( environment: ResourceEnvironment, resource: StringArrayResource diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt index 91e62bdd1a..3cce39b722 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/StringResources.kt @@ -50,6 +50,7 @@ suspend fun getString(resource: StringResource): String = * * @throws IllegalArgumentException If the provided ID is not found in the resource file. */ +@ExperimentalResourceApi suspend fun getString(environment: ResourceEnvironment, resource: StringResource): String = loadString(resource, DefaultResourceReader, environment) @@ -108,6 +109,7 @@ suspend fun getString(resource: StringResource, vararg formatArgs: Any): String * * @throws IllegalArgumentException If the provided ID is not found in the resource file. */ +@ExperimentalResourceApi suspend fun getString( environment: ResourceEnvironment, resource: StringResource, From 450b7e7974c10f4efaa5456fa2479fcdc2342177 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 17:48:44 +0200 Subject: [PATCH 08/10] [resources] Don't provide default environment for read bytes functions. --- .../kotlin/org/jetbrains/compose/resources/FontResources.kt | 4 ++-- .../kotlin/org/jetbrains/compose/resources/ImageResources.kt | 4 ++-- .../org/jetbrains/compose/resources/ComposeResourceTest.kt | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt index 528c3be0be..d7a4da3559 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt @@ -38,13 +38,13 @@ expect fun Font( /** * Retrieves the byte array of the font resource. * - * @param environment The optional resource environment. + * @param environment The resource environment. * @param resource The font resource. * @return The byte array representing the font resource. */ @ExperimentalResourceApi suspend fun getFontResourceBytes( - environment: ResourceEnvironment = getSystemResourceEnvironment(), + environment: ResourceEnvironment, resource: FontResource ): ByteArray { val resourceItem = resource.getResourceItemByEnvironment(environment) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt index 84cb6b12c3..e67c707050 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt @@ -112,13 +112,13 @@ private fun svgPainter(resource: DrawableResource): Painter { /** * Retrieves the byte array of the drawable resource. * - * @param environment The optional resource environment. + * @param environment The resource environment. * @param resource The drawable resource. * @return The byte array representing the drawable resource. */ @ExperimentalResourceApi suspend fun getDrawableResourceBytes( - environment: ResourceEnvironment = getSystemResourceEnvironment(), + environment: ResourceEnvironment, resource: DrawableResource ): ByteArray { val resourceItem = resource.getResourceItemByEnvironment(environment) diff --git a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt index 3a0cb15f28..6e191a944c 100644 --- a/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt +++ b/components/resources/library/src/commonTest/kotlin/org/jetbrains/compose/resources/ComposeResourceTest.kt @@ -307,9 +307,10 @@ class ComposeResourceTest { @OptIn(ExperimentalResourceApi::class) @Test fun testGetResourceBytes() = runTest { - val imageBytes = getDrawableResourceBytes(resource = TestDrawableResource("1.png")) + val env = getSystemEnvironment() + val imageBytes = getDrawableResourceBytes(env, TestDrawableResource("1.png")) assertEquals(946, imageBytes.size) - val fontBytes = getFontResourceBytes(resource = TestFontResource("font_awesome.otf")) + val fontBytes = getFontResourceBytes(env, TestFontResource("font_awesome.otf")) assertEquals(134808, fontBytes.size) } From c70b909f573eb9515052c40207bd605c2750e6f6 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 17:57:45 +0200 Subject: [PATCH 09/10] [resources] Update javadoc. --- .../kotlin/org/jetbrains/compose/resources/FontResources.kt | 2 +- .../kotlin/org/jetbrains/compose/resources/ImageResources.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt index d7a4da3559..b39b2db4e3 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/FontResources.kt @@ -38,7 +38,7 @@ expect fun Font( /** * Retrieves the byte array of the font resource. * - * @param environment The resource environment. + * @param environment The resource environment, which can be obtained from [rememberResourceEnvironment] or [getSystemResourceEnvironment]. * @param resource The font resource. * @return The byte array representing the font resource. */ diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt index e67c707050..8b26b6f5ad 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ImageResources.kt @@ -112,7 +112,7 @@ private fun svgPainter(resource: DrawableResource): Painter { /** * Retrieves the byte array of the drawable resource. * - * @param environment The resource environment. + * @param environment The resource environment, which can be obtained from [rememberResourceEnvironment] or [getSystemResourceEnvironment]. * @param resource The drawable resource. * @return The byte array representing the drawable resource. */ From b1edfbd666d26a3595a51d03ae25713734080fe4 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Tue, 23 Apr 2024 18:18:34 +0200 Subject: [PATCH 10/10] [resources] Don't use data class in public API. https://kotlinlang.org/docs/jvm-api-guidelines-backward-compatibility.html#don-t-use-data-classes-in-an-api --- .../compose/resources/ResourceEnvironment.kt | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt index 3965a75797..20ac17ca09 100644 --- a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/ResourceEnvironment.kt @@ -6,12 +6,34 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.intl.Locale @ExperimentalResourceApi -data class ResourceEnvironment internal constructor( +class ResourceEnvironment internal constructor( internal val language: LanguageQualifier, internal val region: RegionQualifier, internal val theme: ThemeQualifier, internal val density: DensityQualifier -) +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other == null || this::class != other::class) return false + + other as ResourceEnvironment + + if (language != other.language) return false + if (region != other.region) return false + if (theme != other.theme) return false + if (density != other.density) return false + + return true + } + + override fun hashCode(): Int { + var result = language.hashCode() + result = 31 * result + region.hashCode() + result = 31 * result + theme.hashCode() + result = 31 * result + density.hashCode() + return result + } +} internal interface ComposeEnvironment { @Composable