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.
This commit is contained in:
Atte149 2026-06-28 05:00:38 +03:00
parent a8f00ff3ba
commit 3a7b1b3782
2 changed files with 34 additions and 31 deletions

View file

@ -19,6 +19,7 @@
*/ */
package org.dueattendant149.bookreader package org.dueattendant149.bookreader
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@ -117,9 +118,13 @@ open class MainActivity : AppCompatActivity() {
AppThemeMode.SYSTEM -> isSystemInDarkTheme() 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( AppTheme(
darkTheme = darkTheme, darkTheme = darkTheme,
dynamicColor = uiState.appSeedColor == null, dynamicColor = dynamicColorEnabled && uiState.appSeedColor == null,
seedColor = uiState.appSeedColor, seedColor = uiState.appSeedColor,
) { ) {
Surface( Surface(

View file

@ -1,15 +1,15 @@
package org.dueattendant149.bookreader.ui.screens.settings package org.dueattendant149.bookreader.ui.screens.settings
import android.content.Context
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth 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.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll 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.Card
import androidx.compose.material3.CardDefaults import androidx.compose.material3.CardDefaults
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -28,16 +28,23 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import androidx.navigation.NavController
import org.dueattendant149.bookreader.ui.common.CustomTopAppBar 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 @Composable
fun SettingsScreen(navController: NavController) { fun SettingsScreen(navController: NavController) {
var dynamicColor by remember { mutableStateOf(true) } val context = LocalContext.current
var amoled by remember { mutableStateOf(false) } 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( Column(
modifier = Modifier modifier = Modifier
@ -54,13 +61,19 @@ fun SettingsScreen(navController: NavController) {
title = "Material You", title = "Material You",
subtitle = "Dynamic color from system wallpaper", subtitle = "Dynamic color from system wallpaper",
checked = dynamicColor, checked = dynamicColor,
onCheckedChange = { dynamicColor = it }, onCheckedChange = {
dynamicColor = it
prefs.edit().putBoolean(KEY_DYNAMIC_COLOR, it).apply()
},
) )
SettingsToggleItem( SettingsToggleItem(
title = "AMOLED", title = "AMOLED",
subtitle = "Pure black background in dark mode", subtitle = "Pure black background in dark mode",
checked = amoled, 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") { SettingsSection("About") {
SettingsClickItem( SettingsClickItem(
title = "About", title = "Book Reader",
subtitle = "Book Reader v1.0.50", 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), modifier = Modifier.padding(start = 24.dp, bottom = 8.dp),
) )
Card( Card(
modifier = Modifier modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp),
.fillMaxWidth()
.padding(horizontal = 16.dp),
shape = RoundedCornerShape(12.dp), shape = RoundedCornerShape(12.dp),
colors = CardDefaults.cardColors( colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp), containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp),
@ -118,22 +129,12 @@ private fun SettingsToggleItem(
onCheckedChange: (Boolean) -> Unit, onCheckedChange: (Boolean) -> Unit,
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier.fillMaxWidth().padding(16.dp),
.fillMaxWidth()
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text( Text(text = title, fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface)
text = title, Text(text = subtitle, fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurfaceVariant)
fontSize = 16.sp,
color = MaterialTheme.colorScheme.onSurface,
)
Text(
text = subtitle,
fontSize = 13.sp,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
} }
Switch(checked = checked, onCheckedChange = onCheckedChange) Switch(checked = checked, onCheckedChange = onCheckedChange)
} }
@ -146,10 +147,7 @@ private fun SettingsClickItem(
onClick: () -> Unit, onClick: () -> Unit,
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier.fillMaxWidth().clickable(onClick = onClick).padding(16.dp),
.fillMaxWidth()
.clickable(onClick = onClick)
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {