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( diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 1e0a7e44..ad258c60 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) } } @@ -67,5 +68,10 @@ kotlin { } android { - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") + buildFeatures { androidResources = true } + + sourceSets["main"].apply { + manifest.srcFile("src/androidMain/AndroidManifest.xml") + res.srcDir("src/androidMain/res") + } } 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..3883ee89 --- /dev/null +++ b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -0,0 +1,40 @@ +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): 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) +} 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..ebb1d95e --- /dev/null +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -0,0 +1,15 @@ +package dev.msfjarvis.lobsters.utils + +import androidx.compose.runtime.Composable + +@Composable +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 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..211da5ba --- /dev/null +++ b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -0,0 +1,38 @@ +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): 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) +}