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
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(

View file

@ -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)) {