From 03c716a20cee0a14a21667831d196de437ee0eac Mon Sep 17 00:00:00 2001 From: Gregory Prosper Date: Wed, 10 Apr 2024 21:45:51 -0400 Subject: [PATCH 1/2] text refactor --- .../character/CharacterStatusComponent.kt | 5 ++++- .../components/common/DataPointComponent.kt | 12 +++++++++--- .../simplerick/ui/text/CharacterGender.kt | 13 +++++++++++++ .../simplerick/ui/text/CharacterStatus.kt | 12 ++++++++++++ .../androidfactory/simplerick/ui/text/UiText.kt | 16 ++++++++++++++++ .../viewmodels/CharacterDetailsViewModel.kt | 14 ++++++++------ app/src/main/res/values/strings.xml | 7 +++++++ .../network/models/domain/CharacterGender.kt | 10 +++++----- .../network/models/domain/CharacterStatus.kt | 8 ++++---- 9 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt create mode 100644 app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt create mode 100644 app/src/main/java/com/androidfactory/simplerick/ui/text/UiText.kt diff --git a/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt b/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt index d2833b4..f187a3d 100644 --- a/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt +++ b/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt @@ -8,10 +8,13 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.androidfactory.network.models.domain.CharacterStatus +import com.androidfactory.simplerick.R +import com.androidfactory.simplerick.ui.text.stringResource import com.androidfactory.simplerick.ui.theme.RickTextPrimary import com.androidfactory.simplerick.ui.theme.SimpleRickTheme @@ -28,7 +31,7 @@ fun CharacterStatusComponent(characterStatus: CharacterStatus) { .padding(horizontal = 12.dp, vertical = 4.dp) ) { Text( - text = "Status: ${characterStatus.displayName}", + text = "Status: ${stringResource(characterStatus.stringResource())}", fontSize = 20.sp, color = RickTextPrimary ) diff --git a/app/src/main/java/com/androidfactory/simplerick/components/common/DataPointComponent.kt b/app/src/main/java/com/androidfactory/simplerick/components/common/DataPointComponent.kt index 9543b48..795aa34 100644 --- a/app/src/main/java/com/androidfactory/simplerick/components/common/DataPointComponent.kt +++ b/app/src/main/java/com/androidfactory/simplerick/components/common/DataPointComponent.kt @@ -3,19 +3,22 @@ package com.androidfactory.simplerick.components.common import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.sp +import com.androidfactory.simplerick.ui.text.UiText import com.androidfactory.simplerick.ui.theme.RickAction import com.androidfactory.simplerick.ui.theme.RickTextPrimary data class DataPoint( val title: String, - val description: String + val description: UiText ) @Composable fun DataPointComponent(dataPoint: DataPoint) { + val context = LocalContext.current Column { Text( text = dataPoint.title, @@ -24,7 +27,7 @@ fun DataPointComponent(dataPoint: DataPoint) { color = RickAction ) Text( - text = dataPoint.description, + text = dataPoint.description.asString(context), fontSize = 24.sp, color = RickTextPrimary ) @@ -34,6 +37,9 @@ fun DataPointComponent(dataPoint: DataPoint) { @Preview @Composable fun DataPointComponentPreview() { - val data = DataPoint(title = "Last known location", description = "Citadel of Ricks") + val data = DataPoint( + title = "Last known location", + description = UiText.DynamicText("Citadel of Ricks") + ) DataPointComponent(dataPoint = data) } \ No newline at end of file diff --git a/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt new file mode 100644 index 0000000..08cc5cf --- /dev/null +++ b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt @@ -0,0 +1,13 @@ +package com.androidfactory.simplerick.ui.text + +import com.androidfactory.network.models.domain.CharacterGender +import com.androidfactory.simplerick.R + +fun CharacterGender.stringResource(): Int { + return when (this) { + CharacterGender.Male -> R.string.character_gender_male + CharacterGender.Female -> R.string.character_gender_female + CharacterGender.Genderless -> R.string.character_gender_unspecified + CharacterGender.Unknown -> R.string.character_gender_unknown + } +} \ No newline at end of file diff --git a/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt new file mode 100644 index 0000000..be3377f --- /dev/null +++ b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt @@ -0,0 +1,12 @@ +package com.androidfactory.simplerick.ui.text + +import com.androidfactory.network.models.domain.CharacterStatus +import com.androidfactory.simplerick.R + +fun CharacterStatus.stringResource(): Int { + return when (this) { + CharacterStatus.Alive -> R.string.character_status_alive + CharacterStatus.Dead -> R.string.character_status_dead + CharacterStatus.Unknown -> R.string.character_status_unknown + } +} \ No newline at end of file diff --git a/app/src/main/java/com/androidfactory/simplerick/ui/text/UiText.kt b/app/src/main/java/com/androidfactory/simplerick/ui/text/UiText.kt new file mode 100644 index 0000000..8626272 --- /dev/null +++ b/app/src/main/java/com/androidfactory/simplerick/ui/text/UiText.kt @@ -0,0 +1,16 @@ +package com.androidfactory.simplerick.ui.text + +import android.content.Context +import androidx.annotation.StringRes + +sealed interface UiText { + data class StringResource(@StringRes val resId: Int) : UiText + data class DynamicText(val value: String) : UiText + + fun asString(context: Context): String { + return when (this) { + is StringResource -> context.getString(resId) + is DynamicText -> value + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt b/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt index a1607b1..cd5fcd0 100644 --- a/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt +++ b/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.viewModelScope import com.androidfactory.simplerick.components.common.DataPoint import com.androidfactory.simplerick.repositories.CharacterRepository import com.androidfactory.simplerick.screens.CharacterDetailsViewState +import com.androidfactory.simplerick.ui.text.UiText +import com.androidfactory.simplerick.ui.text.stringResource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -25,14 +27,14 @@ class CharacterDetailsViewModel @Inject constructor( _internalStorageFlow.update { return@update CharacterDetailsViewState.Loading } characterRepository.fetchCharacter(characterId).onSuccess { character -> val dataPoints = buildList { - add(DataPoint("Last known location", character.location.name)) - add(DataPoint("Species", character.species)) - add(DataPoint("Gender", character.gender.displayName)) + add(DataPoint("Last known location", UiText.DynamicText(character.location.name))) + add(DataPoint("Species", UiText.DynamicText(character.species))) + add(DataPoint("Gender", UiText.StringResource(character.gender.stringResource()))) character.type.takeIf { it.isNotEmpty() }?.let { type -> - add(DataPoint("Type", type)) + add(DataPoint("Type", UiText.DynamicText(type))) } - add(DataPoint("Origin", character.origin.name)) - add(DataPoint("Episode count", character.episodeIds.size.toString())) + add(DataPoint("Origin", UiText.DynamicText(character.origin.name))) + add(DataPoint("Episode count", UiText.DynamicText(character.episodeIds.size.toString()))) } _internalStorageFlow.update { return@update CharacterDetailsViewState.Success( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 389e953..adbea7c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,10 @@ Simple Rick + Dead + Alive + Unknown + Male + Female + No Gender + Unknown \ No newline at end of file diff --git a/network/src/main/java/com/androidfactory/network/models/domain/CharacterGender.kt b/network/src/main/java/com/androidfactory/network/models/domain/CharacterGender.kt index cbe72fb..f6e47fd 100644 --- a/network/src/main/java/com/androidfactory/network/models/domain/CharacterGender.kt +++ b/network/src/main/java/com/androidfactory/network/models/domain/CharacterGender.kt @@ -1,8 +1,8 @@ package com.androidfactory.network.models.domain -sealed class CharacterGender(val displayName: String) { - object Male: CharacterGender("Male") - object Female: CharacterGender("Female") - object Genderless: CharacterGender("No gender") - object Unknown: CharacterGender("Not specified") +sealed class CharacterGender() { + object Male: CharacterGender() + object Female: CharacterGender() + object Genderless: CharacterGender() + object Unknown: CharacterGender() } \ No newline at end of file diff --git a/network/src/main/java/com/androidfactory/network/models/domain/CharacterStatus.kt b/network/src/main/java/com/androidfactory/network/models/domain/CharacterStatus.kt index 9232377..c78626b 100644 --- a/network/src/main/java/com/androidfactory/network/models/domain/CharacterStatus.kt +++ b/network/src/main/java/com/androidfactory/network/models/domain/CharacterStatus.kt @@ -2,8 +2,8 @@ package com.androidfactory.network.models.domain import androidx.compose.ui.graphics.Color -sealed class CharacterStatus(val displayName: String, val color: Color) { - object Alive: CharacterStatus("Alive", Color.Green) - object Dead: CharacterStatus("Dead", Color.Red) - object Unknown: CharacterStatus("Unknown", Color.Yellow) +sealed class CharacterStatus(val color: Color) { + object Alive: CharacterStatus(Color.Green) + object Dead: CharacterStatus(Color.Red) + object Unknown: CharacterStatus(Color.Yellow) } \ No newline at end of file From 63aa9de21774ee0049e7f2e7c2cbf8acf022144e Mon Sep 17 00:00:00 2001 From: Gregory Prosper Date: Wed, 10 Apr 2024 21:47:28 -0400 Subject: [PATCH 2/2] Rename --- .../components/character/CharacterStatusComponent.kt | 5 ++--- .../com/androidfactory/simplerick/ui/text/CharacterGender.kt | 2 +- .../com/androidfactory/simplerick/ui/text/CharacterStatus.kt | 2 +- .../simplerick/viewmodels/CharacterDetailsViewModel.kt | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt b/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt index f187a3d..134f9f5 100644 --- a/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt +++ b/app/src/main/java/com/androidfactory/simplerick/components/character/CharacterStatusComponent.kt @@ -13,8 +13,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.androidfactory.network.models.domain.CharacterStatus -import com.androidfactory.simplerick.R -import com.androidfactory.simplerick.ui.text.stringResource +import com.androidfactory.simplerick.ui.text.displayNameResource import com.androidfactory.simplerick.ui.theme.RickTextPrimary import com.androidfactory.simplerick.ui.theme.SimpleRickTheme @@ -31,7 +30,7 @@ fun CharacterStatusComponent(characterStatus: CharacterStatus) { .padding(horizontal = 12.dp, vertical = 4.dp) ) { Text( - text = "Status: ${stringResource(characterStatus.stringResource())}", + text = "Status: ${stringResource(characterStatus.displayNameResource())}", fontSize = 20.sp, color = RickTextPrimary ) diff --git a/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt index 08cc5cf..ce1db0d 100644 --- a/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt +++ b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterGender.kt @@ -3,7 +3,7 @@ package com.androidfactory.simplerick.ui.text import com.androidfactory.network.models.domain.CharacterGender import com.androidfactory.simplerick.R -fun CharacterGender.stringResource(): Int { +fun CharacterGender.displayNameResource(): Int { return when (this) { CharacterGender.Male -> R.string.character_gender_male CharacterGender.Female -> R.string.character_gender_female diff --git a/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt index be3377f..17f8b90 100644 --- a/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt +++ b/app/src/main/java/com/androidfactory/simplerick/ui/text/CharacterStatus.kt @@ -3,7 +3,7 @@ package com.androidfactory.simplerick.ui.text import com.androidfactory.network.models.domain.CharacterStatus import com.androidfactory.simplerick.R -fun CharacterStatus.stringResource(): Int { +fun CharacterStatus.displayNameResource(): Int { return when (this) { CharacterStatus.Alive -> R.string.character_status_alive CharacterStatus.Dead -> R.string.character_status_dead diff --git a/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt b/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt index cd5fcd0..b87871e 100644 --- a/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt +++ b/app/src/main/java/com/androidfactory/simplerick/viewmodels/CharacterDetailsViewModel.kt @@ -6,7 +6,7 @@ import com.androidfactory.simplerick.components.common.DataPoint import com.androidfactory.simplerick.repositories.CharacterRepository import com.androidfactory.simplerick.screens.CharacterDetailsViewState import com.androidfactory.simplerick.ui.text.UiText -import com.androidfactory.simplerick.ui.text.stringResource +import com.androidfactory.simplerick.ui.text.displayNameResource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -29,7 +29,7 @@ class CharacterDetailsViewModel @Inject constructor( val dataPoints = buildList { add(DataPoint("Last known location", UiText.DynamicText(character.location.name))) add(DataPoint("Species", UiText.DynamicText(character.species))) - add(DataPoint("Gender", UiText.StringResource(character.gender.stringResource()))) + add(DataPoint("Gender", UiText.StringResource(character.gender.displayNameResource()))) character.type.takeIf { it.isNotEmpty() }?.let { type -> add(DataPoint("Type", UiText.DynamicText(type))) }