From beae723372288caa804ebd802f77a2953369c200 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Wed, 13 May 2026 19:31:58 +0200 Subject: [PATCH] feat: add ReadOnlySetting and corresponding UI component for displaying read-only settings --- .../ui/screen/settings/TvSettingsScreen.kt | 33 +++++++++++++++++++ .../ui/screen/settings/SettingsScreen.kt | 9 +++++ .../components/ReadOnlySettingItem.kt | 31 +++++++++++++++++ .../feature/update/AppUpdateController.kt | 31 +++++++++++------ .../purefin/core/settings/SettingOption.kt | 8 +++++ 5 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/hu/bbara/purefin/ui/screen/settings/components/ReadOnlySettingItem.kt diff --git a/app-tv/src/main/java/hu/bbara/purefin/ui/screen/settings/TvSettingsScreen.kt b/app-tv/src/main/java/hu/bbara/purefin/ui/screen/settings/TvSettingsScreen.kt index 56f6d113..3e4b367f 100644 --- a/app-tv/src/main/java/hu/bbara/purefin/ui/screen/settings/TvSettingsScreen.kt +++ b/app-tv/src/main/java/hu/bbara/purefin/ui/screen/settings/TvSettingsScreen.kt @@ -41,6 +41,7 @@ import hu.bbara.purefin.core.feature.settings.SettingsViewModel import hu.bbara.purefin.core.settings.BooleanSetting import hu.bbara.purefin.core.settings.DropdownSetting import hu.bbara.purefin.core.settings.RangeSetting +import hu.bbara.purefin.core.settings.ReadOnlySetting import hu.bbara.purefin.core.settings.SettingOption import hu.bbara.purefin.core.settings.StringSetting import hu.bbara.purefin.core.settings.VoidSetting @@ -149,6 +150,13 @@ private fun TvSettingOptionItem( } } + is ReadOnlySetting -> { + TvReadOnlySettingItem( + title = option.title, + value = option.value + ) + } + is VoidSetting -> { TvVoidSettingItem( title = option.title, @@ -200,6 +208,31 @@ private fun TvSettingsTopBar( } } +@Composable +private fun TvReadOnlySettingItem( + title: String, + value: String, + modifier: Modifier = Modifier +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 28.dp, vertical = 16.dp) + ) { + Text( + text = title, + style = MaterialTheme.typography.bodyLarge + ) + Text( + text = value, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } +} + @Composable private fun TvVoidSettingItem( title: String, diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/settings/SettingsScreen.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/settings/SettingsScreen.kt index cd996fb5..43c78096 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/settings/SettingsScreen.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/settings/SettingsScreen.kt @@ -24,6 +24,7 @@ import hu.bbara.purefin.core.feature.settings.SettingsViewModel import hu.bbara.purefin.core.settings.BooleanSetting import hu.bbara.purefin.core.settings.DropdownSetting import hu.bbara.purefin.core.settings.RangeSetting +import hu.bbara.purefin.core.settings.ReadOnlySetting import hu.bbara.purefin.core.settings.SettingOption import hu.bbara.purefin.core.settings.StringSetting import hu.bbara.purefin.core.settings.VoidSetting @@ -32,6 +33,7 @@ import hu.bbara.purefin.ui.screen.home.components.DefaultTopBarIconButton import hu.bbara.purefin.ui.screen.settings.components.BooleanSettingItem import hu.bbara.purefin.ui.screen.settings.components.DropdownSettingItem import hu.bbara.purefin.ui.screen.settings.components.RangeSettingItem +import hu.bbara.purefin.ui.screen.settings.components.ReadOnlySettingItem import hu.bbara.purefin.ui.screen.settings.components.StringSettingItem import hu.bbara.purefin.ui.screen.settings.components.VoidSettingItem @@ -138,6 +140,13 @@ private fun SettingOptionItem( } } + is ReadOnlySetting -> { + ReadOnlySettingItem( + title = option.title, + value = option.value + ) + } + is VoidSetting -> { VoidSettingItem( title = option.title, diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/settings/components/ReadOnlySettingItem.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/settings/components/ReadOnlySettingItem.kt new file mode 100644 index 00000000..0c16f7b6 --- /dev/null +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/settings/components/ReadOnlySettingItem.kt @@ -0,0 +1,31 @@ +package hu.bbara.purefin.ui.screen.settings.components + +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun ReadOnlySettingItem( + title: String, + value: String, + modifier: Modifier = Modifier.Companion +) { + ListItem( + headlineContent = { + Text( + text = title, + style = MaterialTheme.typography.bodyLarge + ) + }, + trailingContent = { + Text( + text = value, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + }, + modifier = modifier + ) +} diff --git a/core/src/main/java/hu/bbara/purefin/core/feature/update/AppUpdateController.kt b/core/src/main/java/hu/bbara/purefin/core/feature/update/AppUpdateController.kt index c4a5d47b..b9608690 100644 --- a/core/src/main/java/hu/bbara/purefin/core/feature/update/AppUpdateController.kt +++ b/core/src/main/java/hu/bbara/purefin/core/feature/update/AppUpdateController.kt @@ -1,6 +1,8 @@ package hu.bbara.purefin.core.feature.update +import hu.bbara.purefin.core.settings.ReadOnlySetting import hu.bbara.purefin.core.settings.SettingGroup +import hu.bbara.purefin.core.settings.SettingOption import hu.bbara.purefin.core.settings.SettingsGroupProvider import hu.bbara.purefin.core.settings.VoidSetting import kotlinx.coroutines.flow.Flow @@ -18,7 +20,8 @@ import javax.inject.Singleton @Singleton class AppUpdateController @Inject constructor( private val appUpdateRepository: AppUpdateRepository, - private val appUpdateInstaller: AppUpdateInstaller + private val appUpdateInstaller: AppUpdateInstaller, + private val appVersionProvider: AppVersionProvider ) : SettingsGroupProvider { private val _isCheckingForUpdates = MutableStateFlow(false) val isCheckingForUpdates: StateFlow = _isCheckingForUpdates.asStateFlow() @@ -34,16 +37,17 @@ class AppUpdateController @Inject constructor( override val settingGroups: Flow> = availableUpdate .map { update -> - if (update == null) { - emptyList() - } else { - listOf( - SettingGroup( - title = "App", - options = listOf(installUpdateSetting(update)) - ) + val options = listOfNotNull>( + buildNumberSetting(), + update?.let { installUpdateSetting(it) } + ) + + listOf( + SettingGroup( + title = "App", + options = options ) - } + ) } suspend fun checkForUpdates( @@ -100,7 +104,14 @@ class AppUpdateController @Inject constructor( ) } + private fun buildNumberSetting() = ReadOnlySetting( + key = BUILD_NUMBER_KEY, + title = "Build number", + value = appVersionProvider.versionCode.toString() + ) + private companion object { + const val BUILD_NUMBER_KEY = "build_number" const val INSTALL_APP_UPDATE_KEY = "install_app_update" } } diff --git a/core/src/main/java/hu/bbara/purefin/core/settings/SettingOption.kt b/core/src/main/java/hu/bbara/purefin/core/settings/SettingOption.kt index 01d91d2c..de2810f1 100644 --- a/core/src/main/java/hu/bbara/purefin/core/settings/SettingOption.kt +++ b/core/src/main/java/hu/bbara/purefin/core/settings/SettingOption.kt @@ -25,6 +25,14 @@ data class StringSetting( override val defaultValue: String ) : SettingOption +data class ReadOnlySetting( + override val key: String, + override val title: String, + val value: String +) : SettingOption { + override val defaultValue: String = value +} + data class VoidSetting( override val key: String, override val title: String,