From 01ffc49e1850ecd2fb3bf4c62e2c6c45f68390e0 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Sun, 21 Mar 2021 01:33:14 +0530 Subject: [PATCH 1/6] common: add common stringValue api Signed-off-by: Aditya Wasan --- common/build.gradle.kts | 1 + .../msfjarvis/lobsters/utils/StringValue.kt | 25 +++++++++++++++++++ common/src/androidMain/res/values/strings.xml | 13 ++++++++++ .../msfjarvis/lobsters/utils/StringEnum.kt | 15 +++++++++++ .../msfjarvis/lobsters/utils/StringValue.kt | 6 +++++ .../msfjarvis/lobsters/utils/StringValue.kt | 23 +++++++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt create mode 100644 common/src/androidMain/res/values/strings.xml create mode 100644 common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt create mode 100644 common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt create mode 100644 common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 1e0a7e44..30a27b53 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -36,6 +36,7 @@ kotlin { val commonMain by getting { dependencies { implementation(compose.runtime) + implementation(compose.ui) } } diff --git a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt new file mode 100644 index 00000000..65745047 --- /dev/null +++ b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -0,0 +1,25 @@ +package dev.msfjarvis.lobsters.utils + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import dev.msfjarvis.lobsters.common.R + +private fun stringEnumMapper(stringEnum: StringEnum): Int { + return when (stringEnum) { + StringEnum.AddToSavedPosts -> R.string.add_to_saved_posts + StringEnum.AppName -> R.string.app_name + StringEnum.AvatarContentDescription -> R.string.avatar_content_description + StringEnum.HottestPosts -> R.string.hottest_posts + StringEnum.Loading -> R.string.loading + StringEnum.NoSavedPost -> R.string.no_saved_posts + StringEnum.OpenComments -> R.string.open_comments + StringEnum.RefreshPostsContentDescription -> R.string.refresh_posts_content_description + StringEnum.RemoveFromSavedPosts -> R.string.remove_from_saved_posts + StringEnum.SubmittedBy -> R.string.submitted_by + } +} + +@Composable +actual fun stringValue(enum: StringEnum, vararg formatArgs: Any): String { + return stringResource(stringEnumMapper(enum), formatArgs) +} diff --git a/common/src/androidMain/res/values/strings.xml b/common/src/androidMain/res/values/strings.xml new file mode 100644 index 00000000..75e20d9d --- /dev/null +++ b/common/src/androidMain/res/values/strings.xml @@ -0,0 +1,13 @@ + + Claw + Loading posts… + You don\'t have any saved posts + Hottest + Saved + submitted by %1$s + %1$s\'s avatar + Add to saved posts + Remove from saved posts + Refresh posts + Open comments + diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt new file mode 100644 index 00000000..9a5b5edf --- /dev/null +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt @@ -0,0 +1,15 @@ +package dev.msfjarvis.lobsters.utils + +enum class StringEnum { + AddToSavedPosts, + AppName, + AvatarContentDescription, + HottestPosts, + Loading, + NoSavedPost, + OpenComments, + RefreshPostsContentDescription, + RemoveFromSavedPosts, + SubmittedBy, + ; +} diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt new file mode 100644 index 00000000..a7834c8d --- /dev/null +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -0,0 +1,6 @@ +package dev.msfjarvis.lobsters.utils + +import androidx.compose.runtime.Composable + +@Composable +expect fun stringValue(enum: StringEnum, vararg formatArgs: Any): String \ No newline at end of file diff --git a/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt new file mode 100644 index 00000000..ebd94f86 --- /dev/null +++ b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -0,0 +1,23 @@ +package dev.msfjarvis.lobsters.utils + +import androidx.compose.runtime.Composable + +private fun stringEnumMapper(stringEnum: StringEnum): String { + return when (stringEnum) { + StringEnum.AddToSavedPosts -> "Add to saved posts" + StringEnum.AppName -> "Claw" + StringEnum.AvatarContentDescription -> "%1s's avatar" + StringEnum.HottestPosts -> "Hottest" + StringEnum.Loading -> "Loading posts…" + StringEnum.NoSavedPost -> "You don't have any saved posts" + StringEnum.OpenComments -> "Open comments" + StringEnum.RefreshPostsContentDescription -> "Refresh posts" + StringEnum.RemoveFromSavedPosts -> "Remove from saved posts" + StringEnum.SubmittedBy -> "submitted by %1s" + } +} + +@Composable +actual fun stringValue(enum: StringEnum, vararg formatArgs: Any): String { + return stringEnumMapper(enum).format(formatArgs) +} From b233129c32722b6079e546fc5bbda1fef6927ced Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Mon, 22 Mar 2021 23:49:52 +0530 Subject: [PATCH 2/6] common: include androidMain resources directory Signed-off-by: Harsh Shandilya --- common/build.gradle.kts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 30a27b53..c2fa264f 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -68,5 +68,8 @@ kotlin { } android { - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") + sourceSets["main"].apply { + manifest.srcFile("src/androidMain/AndroidManifest.xml") + res.srcDir("src/androidMain/res") + } } From 282da93630a35dbd92e5625971e9df001c92efdc Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Wed, 24 Mar 2021 00:25:47 +0530 Subject: [PATCH 3/6] build: enable androidResources for common module Signed-off-by: Aditya Wasan --- common/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index c2fa264f..ad258c60 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -68,6 +68,8 @@ kotlin { } android { + buildFeatures { androidResources = true } + sourceSets["main"].apply { manifest.srcFile("src/androidMain/AndroidManifest.xml") res.srcDir("src/androidMain/res") From 13b3abdcd427fcc2def3f49a697a291a6a31ee37 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Wed, 24 Mar 2021 01:05:43 +0530 Subject: [PATCH 4/6] ui: use stringValue to get resources inside app module This will not compile but still adding this so that we can revert the hack in-future and get it running correctly. Signed-off-by: Aditya Wasan --- .../msfjarvis/lobsters/ui/posts/LobstersItem.kt | 15 +++++++++------ .../dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt | 7 ++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt index a55b285d..622285a1 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt @@ -24,7 +24,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -37,6 +36,8 @@ import dev.msfjarvis.lobsters.data.local.SavedPost import dev.msfjarvis.lobsters.ui.theme.LobstersTheme import dev.msfjarvis.lobsters.ui.theme.titleColor import dev.msfjarvis.lobsters.util.IconResource +import dev.msfjarvis.lobsters.utils.StringEnum +import dev.msfjarvis.lobsters.utils.stringValue val TEST_POST = SavedPost( shortId = "zqyydb", @@ -141,8 +142,8 @@ fun SubmitterAvatar( ) { CoilImage( data = "${LobstersApi.BASE_URL}/$avatarUrl", - contentDescription = stringResource( - R.string.avatar_content_description, + contentDescription = stringValue( + StringEnum.AvatarContentDescription, name, ), fadeIn = true, @@ -159,7 +160,7 @@ fun SubmitterNameText( name: String, ) { Text( - text = stringResource(id = R.string.submitted_by, name), + text = stringValue(StringEnum.SubmittedBy, name), modifier = Modifier .padding(start = 4.dp), ) @@ -179,10 +180,12 @@ fun SaveButton( .then(modifier), ) { Crossfade(targetState = isSaved) { saved -> + // Using if (saved) ... else ... throws an IllegalArgumentException + val contentDescriptionEnum = if (saved) StringEnum.RemoveFromSavedPosts else StringEnum.AddToSavedPosts IconResource( resourceId = if (saved) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px, tint = MaterialTheme.colors.secondary, - contentDescription = stringResource(if (saved) R.string.remove_from_saved_posts else R.string.add_to_saved_posts), + contentDescription = stringValue(contentDescriptionEnum), ) } } @@ -202,7 +205,7 @@ fun CommentsButton( IconResource( resourceId = R.drawable.ic_insert_comment_24px, tint = MaterialTheme.colors.secondary, - contentDescription = stringResource(R.string.open_comments), + contentDescription = stringValue(StringEnum.OpenComments), ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt index 60570a82..6ec72ea0 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt @@ -15,13 +15,14 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import dev.msfjarvis.lobsters.R import dev.msfjarvis.lobsters.data.local.SavedPost import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher import dev.msfjarvis.lobsters.util.IconResource import dev.msfjarvis.lobsters.util.asZonedDateTime +import dev.msfjarvis.lobsters.utils.StringEnum +import dev.msfjarvis.lobsters.utils.stringValue import kotlinx.coroutines.flow.Flow @OptIn(ExperimentalFoundationApi::class) @@ -46,9 +47,9 @@ fun SavedPosts( R.drawable.ic_favorite_border_24px, tint = Color(0xFFD97373), modifier = Modifier.padding(16.dp), - contentDescription = stringResource(R.string.add_to_saved_posts), + contentDescription = stringValue(StringEnum.AddToSavedPosts), ) - Text(stringResource(R.string.no_saved_posts)) + Text(stringValue(StringEnum.NoSavedPost)) } } else { LazyColumn( From 44d220b74c595e27900fbe2fc07b1ef7da4956d5 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Wed, 24 Mar 2021 01:08:29 +0530 Subject: [PATCH 5/6] revertme: hack to make StringValue compile Currently compose does not support default values with actual/expect functions. When we use vararg it creates a default emptyArray if we do not provide an argument which causes the compose compiler to throw an ISE. We can revert this commit once https://youtrack.jetbrains.com/issue/KT-44499 is merged. Signed-off-by: Aditya Wasan --- .../msfjarvis/lobsters/utils/StringValue.kt | 19 +++++++++++++++++-- .../msfjarvis/lobsters/utils/StringValue.kt | 11 ++++++++++- .../msfjarvis/lobsters/utils/StringValue.kt | 19 +++++++++++++++++-- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index 65745047..698e9871 100644 --- a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -20,6 +20,21 @@ private fun stringEnumMapper(stringEnum: StringEnum): Int { } @Composable -actual fun stringValue(enum: StringEnum, vararg formatArgs: Any): String { - return stringResource(stringEnumMapper(enum), formatArgs) +actual fun stringValue(enum: StringEnum): String { + return stringResource(stringEnumMapper(enum)) } + +@Composable +actual fun stringValue(enum: StringEnum, arg1: Any): String { + return stringResource(stringEnumMapper(enum), arg1) +} + +@Composable +actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any): String { + return stringResource(stringEnumMapper(enum), arg1, arg2) +} + +@Composable +actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String { + return stringResource(stringEnumMapper(enum), arg1, arg2, arg3) +} \ No newline at end of file diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index a7834c8d..2c1d1567 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -3,4 +3,13 @@ package dev.msfjarvis.lobsters.utils import androidx.compose.runtime.Composable @Composable -expect fun stringValue(enum: StringEnum, vararg formatArgs: Any): String \ No newline at end of file +expect fun stringValue(enum: StringEnum): String + +@Composable +expect fun stringValue(enum: StringEnum, arg1: Any): String + +@Composable +expect fun stringValue(enum: StringEnum, arg1: Any, arg2: Any): String + +@Composable +expect fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String \ No newline at end of file diff --git a/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index ebd94f86..4a143821 100644 --- a/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -18,6 +18,21 @@ private fun stringEnumMapper(stringEnum: StringEnum): String { } @Composable -actual fun stringValue(enum: StringEnum, vararg formatArgs: Any): String { - return stringEnumMapper(enum).format(formatArgs) +actual fun stringValue(enum: StringEnum): String { + return stringEnumMapper(enum) } + +@Composable +actual fun stringValue(enum: StringEnum, arg1: Any): String { + return stringEnumMapper(enum).format(arg1) +} + +@Composable +actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any): String { + return stringEnumMapper(enum).format(arg1, arg2) +} + +@Composable +actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String { + return stringEnumMapper(enum).format(arg1, arg2, arg3) +} \ No newline at end of file From c52f7812f13a448a15ed9432e3a9c3031df7a9a5 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Wed, 24 Mar 2021 01:17:47 +0530 Subject: [PATCH 6/6] cleanup: add newline at the end of the file Signed-off-by: Aditya Wasan --- .../kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt | 2 +- .../kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt | 2 +- .../jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index 698e9871..3883ee89 100644 --- a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -37,4 +37,4 @@ actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any): String { @Composable actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String { return stringResource(stringEnumMapper(enum), arg1, arg2, arg3) -} \ No newline at end of file +} diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index 2c1d1567..ebb1d95e 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -12,4 +12,4 @@ expect fun stringValue(enum: StringEnum, arg1: Any): String expect fun stringValue(enum: StringEnum, arg1: Any, arg2: Any): String @Composable -expect fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String \ No newline at end of file +expect fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String diff --git a/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index 4a143821..211da5ba 100644 --- a/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -35,4 +35,4 @@ actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any): String { @Composable actual fun stringValue(enum: StringEnum, arg1: Any, arg2: Any, arg3: Any): String { return stringEnumMapper(enum).format(arg1, arg2, arg3) -} \ No newline at end of file +}