diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 3c4b1e36..bdd2168d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -3,5 +3,6 @@ -dontwarn androidx.compose.animation.tooling.ComposeAnimation -dontwarn android.view.RenderNode -dontwarn android.view.DisplayListCanvas +-dontwarn sun.misc.Unsafe -dontobfuscate -dontoptimize diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt index ff243edb..f2bc3cba 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.KEY_ROUTE import androidx.navigation.compose.NavHost @@ -27,6 +26,7 @@ import dev.msfjarvis.lobsters.ui.posts.HottestPosts import dev.msfjarvis.lobsters.ui.posts.SavedPosts import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel import dev.msfjarvis.lobsters.util.IconResource +import dev.msfjarvis.lobsters.utils.get import kotlinx.coroutines.launch @Composable @@ -104,10 +104,10 @@ fun LobstersBottomNav( icon = { IconResource( resourceId = screen.badgeRes, - contentDescription = stringResource(screen.labelRes), + contentDescription = screen.labelRes.get(), ) }, - label = { Text(stringResource(id = screen.labelRes)) }, + label = { Text(screen.labelRes.get()) }, selected = currentDestination == screen, modifier = Modifier.testTag(screen.name), alwaysShowLabel = false, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt index 8bc2bacf..4bbd216a 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt @@ -13,6 +13,8 @@ import androidx.compose.ui.unit.dp import dev.msfjarvis.lobsters.R import dev.msfjarvis.lobsters.ui.navigation.Destination import dev.msfjarvis.lobsters.util.IconResource +import dev.msfjarvis.lobsters.utils.Strings +import dev.msfjarvis.lobsters.utils.get import kotlinx.coroutines.launch @OptIn(ExperimentalAnimationApi::class) @@ -33,7 +35,7 @@ fun LobstersTopAppBar( if (currentDestination == Destination.Saved) { IconResource( resourceId = R.drawable.ic_sort_24px, - contentDescription = stringResource(id = R.string.change_sorting_order), + contentDescription = Strings.ChangeSortingOrder.get(), modifier = Modifier .padding(horizontal = 8.dp, vertical = 8.dp) .clickable { scope.launch { toggleSortingOrder() } }, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt index 44d5708a..0d2e65d6 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt @@ -1,19 +1,19 @@ package dev.msfjarvis.lobsters.ui.navigation import androidx.annotation.DrawableRes -import androidx.annotation.StringRes import dev.msfjarvis.lobsters.R +import dev.msfjarvis.lobsters.utils.Strings /** * Destinations for navigation within the app. */ enum class Destination( val route: String, - @StringRes val labelRes: Int, + val labelRes: Strings, @DrawableRes val badgeRes: Int, ) { - Hottest("hottest", R.string.hottest_posts, R.drawable.ic_whatshot_24px), - Saved("saved", R.string.saved_posts, R.drawable.ic_favorite_24px), + Hottest("hottest", Strings.HottestPosts, R.drawable.ic_whatshot_24px), + Saved("saved", Strings.SavedPosts, R.drawable.ic_favorite_24px), ; companion object { 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 622285a1..2fd62b26 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 @@ -36,8 +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 +import dev.msfjarvis.lobsters.utils.Strings +import dev.msfjarvis.lobsters.utils.get val TEST_POST = SavedPost( shortId = "zqyydb", @@ -142,10 +142,7 @@ fun SubmitterAvatar( ) { CoilImage( data = "${LobstersApi.BASE_URL}/$avatarUrl", - contentDescription = stringValue( - StringEnum.AvatarContentDescription, - name, - ), + contentDescription = Strings.AvatarContentDescription.get(name), fadeIn = true, requestBuilder = { transformations(CircleCropTransformation()) @@ -160,7 +157,7 @@ fun SubmitterNameText( name: String, ) { Text( - text = stringValue(StringEnum.SubmittedBy, name), + text = Strings.SubmittedBy.get(name), modifier = Modifier .padding(start = 4.dp), ) @@ -180,12 +177,10 @@ 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 = stringValue(contentDescriptionEnum), + contentDescription = if (saved) Strings.RemoveFromSavedPosts.get() else Strings.AddToSavedPosts.get(), ) } } @@ -205,7 +200,7 @@ fun CommentsButton( IconResource( resourceId = R.drawable.ic_insert_comment_24px, tint = MaterialTheme.colors.secondary, - contentDescription = stringValue(StringEnum.OpenComments), + contentDescription = Strings.OpenComments.get(), ) } } 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 6ec72ea0..1a8c15f9 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 @@ -21,8 +21,8 @@ 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 dev.msfjarvis.lobsters.utils.Strings +import dev.msfjarvis.lobsters.utils.get import kotlinx.coroutines.flow.Flow @OptIn(ExperimentalFoundationApi::class) @@ -47,9 +47,9 @@ fun SavedPosts( R.drawable.ic_favorite_border_24px, tint = Color(0xFFD97373), modifier = Modifier.padding(16.dp), - contentDescription = stringValue(StringEnum.AddToSavedPosts), + contentDescription = Strings.AddToSavedPosts.get(), ) - Text(stringValue(StringEnum.NoSavedPost)) + Text(Strings.NoSavedPost.get()) } } else { LazyColumn( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 95271949..c0c13ad5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,14 +1,3 @@ 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 - Change sort order diff --git a/common/build.gradle.kts b/common/build.gradle.kts index ad258c60..70acc046 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -68,10 +68,14 @@ kotlin { } android { - buildFeatures { androidResources = true } + buildFeatures { + androidResources = true + } - sourceSets["main"].apply { - manifest.srcFile("src/androidMain/AndroidManifest.xml") - res.srcDir("src/androidMain/res") + sourceSets { + named("main") { + manifest.srcFile("src/androidMain/AndroidManifest.xml") + res.srcDirs("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 index 3883ee89..ad774903 100644 --- a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -4,37 +4,28 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import dev.msfjarvis.lobsters.common.R -private fun stringEnumMapper(stringEnum: StringEnum): Int { +private fun stringEnumMapper(stringEnum: Strings): 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 + Strings.AddToSavedPosts -> R.string.add_to_saved_posts + Strings.AppName -> R.string.app_name + Strings.AvatarContentDescription -> R.string.avatar_content_description + Strings.ChangeSortingOrder -> R.string.change_sorting_order + Strings.HottestPosts -> R.string.hottest_posts + Strings.NoSavedPost -> R.string.no_saved_posts + Strings.OpenComments -> R.string.open_comments + Strings.RefreshPostsContentDescription -> R.string.refresh_posts_content_description + Strings.RemoveFromSavedPosts -> R.string.remove_from_saved_posts + Strings.SavedPosts -> R.string.saved_posts + Strings.SubmittedBy -> R.string.submitted_by } } @Composable -actual fun stringValue(enum: StringEnum): String { - return stringResource(stringEnumMapper(enum)) +actual fun Strings.get(): String { + return stringResource(stringEnumMapper(this)) } @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) +actual fun Strings.get(fmt: Any): String { + return stringResource(stringEnumMapper(this), fmt) } diff --git a/common/src/androidMain/res/values/strings.xml b/common/src/androidMain/res/values/strings.xml index 75e20d9d..0916aedb 100644 --- a/common/src/androidMain/res/values/strings.xml +++ b/common/src/androidMain/res/values/strings.xml @@ -1,6 +1,5 @@ Claw - Loading posts… You don\'t have any saved posts Hottest Saved @@ -10,4 +9,5 @@ Remove from saved posts Refresh posts Open comments + Change sort order 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 ebb1d95e..589a6a32 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -3,13 +3,7 @@ package dev.msfjarvis.lobsters.utils import androidx.compose.runtime.Composable @Composable -expect fun stringValue(enum: StringEnum): String +expect fun Strings.get(): 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 +expect fun Strings.get(fmt: Any): String diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt similarity index 79% rename from common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt rename to common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt index 9a5b5edf..031e77dc 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringEnum.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt @@ -1,15 +1,16 @@ package dev.msfjarvis.lobsters.utils -enum class StringEnum { +enum class Strings { AddToSavedPosts, AppName, AvatarContentDescription, + ChangeSortingOrder, HottestPosts, - Loading, NoSavedPost, OpenComments, RefreshPostsContentDescription, RemoveFromSavedPosts, + SavedPosts, SubmittedBy, ; } 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 211da5ba..d7d6e8b7 100644 --- a/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/jvmMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -2,37 +2,28 @@ package dev.msfjarvis.lobsters.utils import androidx.compose.runtime.Composable -private fun stringEnumMapper(stringEnum: StringEnum): String { +private fun stringEnumMapper(stringEnum: Strings): 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" + Strings.AddToSavedPosts -> "Add to saved posts" + Strings.AppName -> "Claw" + Strings.AvatarContentDescription -> "%1s's avatar" + Strings.ChangeSortingOrder -> "Change sorting order" + Strings.HottestPosts -> "Hottest" + Strings.NoSavedPost -> "You don't have any saved posts" + Strings.OpenComments -> "Open comments" + Strings.RefreshPostsContentDescription -> "Refresh posts" + Strings.RemoveFromSavedPosts -> "Remove from saved posts" + Strings.SavedPosts -> "Saved" + Strings.SubmittedBy -> "submitted by %1s" } } @Composable -actual fun stringValue(enum: StringEnum): String { - return stringEnumMapper(enum) +actual fun Strings.get(): String { + return stringEnumMapper(this) } @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) +actual fun Strings.get(fmt: Any): String { + return stringEnumMapper(this).format(fmt) }