From 3a7b1b37821e0893026b138756ccd4b20fe85992 Mon Sep 17 00:00:00 2001 From: Atte149 Date: Sun, 28 Jun 2026 05:00:38 +0300 Subject: [PATCH] feat(settings): wire Material You + AMOLED toggles to SharedPreferences - SettingsScreen: dynamic_color and amoled saved to 'book_reader_ui_prefs' - MainActivity: reads dynamic_color from prefs, passes to AppTheme - Toggles now actually affect the theme (Material You on/off) - ':app:assembleOssDebug' passes, APK deployed. --- .../bookreader/reader/MainActivity.kt | 7 ++- .../ui/screens/settings/SettingsScreen.kt | 58 +++++++++---------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/dueattendant149/bookreader/reader/MainActivity.kt b/app/src/main/java/com/dueattendant149/bookreader/reader/MainActivity.kt index c11316f..9e9e105 100644 --- a/app/src/main/java/com/dueattendant149/bookreader/reader/MainActivity.kt +++ b/app/src/main/java/com/dueattendant149/bookreader/reader/MainActivity.kt @@ -19,6 +19,7 @@ */ package org.dueattendant149.bookreader +import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle @@ -117,9 +118,13 @@ open class MainActivity : AppCompatActivity() { AppThemeMode.SYSTEM -> isSystemInDarkTheme() } + // Read Material You / AMOLED settings from new UI prefs + val uiPrefs = remember { getSharedPreferences("book_reader_ui_prefs", Context.MODE_PRIVATE) } + val dynamicColorEnabled = remember { uiPrefs.getBoolean("dynamic_color", true) } + AppTheme( darkTheme = darkTheme, - dynamicColor = uiState.appSeedColor == null, + dynamicColor = dynamicColorEnabled && uiState.appSeedColor == null, seedColor = uiState.appSeedColor, ) { Surface( diff --git a/app/src/main/java/org/dueattendant149/bookreader/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/org/dueattendant149/bookreader/ui/screens/settings/SettingsScreen.kt index 6adbd55..e387af5 100644 --- a/app/src/main/java/org/dueattendant149/bookreader/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/org/dueattendant149/bookreader/ui/screens/settings/SettingsScreen.kt @@ -1,15 +1,15 @@ package org.dueattendant149.bookreader.ui.screens.settings +import android.content.Context import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -18,9 +18,9 @@ import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.material3.Switch import androidx.compose.material3.Text +import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -28,16 +28,23 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import org.dueattendant149.bookreader.ui.common.CustomTopAppBar +private const val PREFS = "book_reader_ui_prefs" +private const val KEY_DYNAMIC_COLOR = "dynamic_color" +private const val KEY_AMOLED = "amoled" + @Composable fun SettingsScreen(navController: NavController) { - var dynamicColor by remember { mutableStateOf(true) } - var amoled by remember { mutableStateOf(false) } + val context = LocalContext.current + val prefs = remember { context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) } + var dynamicColor by remember { mutableStateOf(prefs.getBoolean(KEY_DYNAMIC_COLOR, true)) } + var amoled by remember { mutableStateOf(prefs.getBoolean(KEY_AMOLED, false)) } Column( modifier = Modifier @@ -54,13 +61,19 @@ fun SettingsScreen(navController: NavController) { title = "Material You", subtitle = "Dynamic color from system wallpaper", checked = dynamicColor, - onCheckedChange = { dynamicColor = it }, + onCheckedChange = { + dynamicColor = it + prefs.edit().putBoolean(KEY_DYNAMIC_COLOR, it).apply() + }, ) SettingsToggleItem( title = "AMOLED", subtitle = "Pure black background in dark mode", checked = amoled, - onCheckedChange = { amoled = it }, + onCheckedChange = { + amoled = it + prefs.edit().putBoolean(KEY_AMOLED, it).apply() + }, ) } @@ -79,8 +92,8 @@ fun SettingsScreen(navController: NavController) { SettingsSection("About") { SettingsClickItem( - title = "About", - subtitle = "Book Reader v1.0.50", + title = "Book Reader", + subtitle = "v1.0.50 ยท AGPL-3.0", ) {} } @@ -98,9 +111,7 @@ private fun SettingsSection(title: String, content: @Composable () -> Unit) { modifier = Modifier.padding(start = 24.dp, bottom = 8.dp), ) Card( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors( containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp), @@ -118,22 +129,12 @@ private fun SettingsToggleItem( onCheckedChange: (Boolean) -> Unit, ) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), + modifier = Modifier.fillMaxWidth().padding(16.dp), verticalAlignment = Alignment.CenterVertically, ) { Column(modifier = Modifier.weight(1f)) { - Text( - text = title, - fontSize = 16.sp, - color = MaterialTheme.colorScheme.onSurface, - ) - Text( - text = subtitle, - fontSize = 13.sp, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) + Text(text = title, fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface) + Text(text = subtitle, fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) } Switch(checked = checked, onCheckedChange = onCheckedChange) } @@ -146,10 +147,7 @@ private fun SettingsClickItem( onClick: () -> Unit, ) { Row( - modifier = Modifier - .fillMaxWidth() - .clickable(onClick = onClick) - .padding(16.dp), + modifier = Modifier.fillMaxWidth().clickable(onClick = onClick).padding(16.dp), verticalAlignment = Alignment.CenterVertically, ) { Column(modifier = Modifier.weight(1f)) {