This commit is contained in:
grakovne
2026-06-12 19:26:30 +03:00
parent 4dc2068f40
commit e483bdc812
2 changed files with 217 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
package org.grakovne.lissen.ui.screens.settings.advanced
import android.os.Build
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import org.grakovne.lissen.R
import org.grakovne.lissen.ui.screens.settings.composable.ColorSchemeSettingsComposable
import org.grakovne.lissen.ui.screens.settings.composable.LibraryOrderingSettingsComposable
import org.grakovne.lissen.ui.screens.settings.composable.SettingsToggleItem
import org.grakovne.lissen.viewmodel.SettingsViewModel
@Composable
@OptIn(ExperimentalMaterial3Api::class)
fun AppearancePreferencesScreen(onBack: () -> Unit) {
val viewModel: SettingsViewModel = hiltViewModel()
val materialYouColorsEnabled by viewModel.materialYouEnabled.observeAsState(false)
Scaffold(
topBar = {
TopAppBar(
title = {
Text(
text = stringResource(R.string.appearance_preferences_title),
style = typography.titleLarge.copy(fontWeight = FontWeight.SemiBold),
color = colorScheme.onSurface,
)
},
navigationIcon = {
IconButton(onClick = { onBack() }) {
Icon(
imageVector = Icons.AutoMirrored.Outlined.ArrowBack,
contentDescription = "Back",
tint = colorScheme.onSurface,
)
}
},
)
},
modifier =
Modifier
.systemBarsPadding()
.fillMaxHeight(),
) { innerPadding ->
Column(
modifier =
Modifier
.fillMaxSize()
.padding(innerPadding),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Column(
modifier =
Modifier
.fillMaxWidth()
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally,
) {
ColorSchemeSettingsComposable(viewModel)
LibraryOrderingSettingsComposable(viewModel)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
SettingsToggleItem(
title = stringResource(R.string.settings_screen_material_you_title),
description = stringResource(R.string.settings_screen_material_you_description),
initialState = materialYouColorsEnabled,
) { viewModel.preferMaterialYouColors(it) }
}
}
}
}
}

View File

@@ -0,0 +1,119 @@
package org.grakovne.lissen.ui.screens.settings.advanced
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material.icons.outlined.Memory
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import org.grakovne.lissen.R
import org.grakovne.lissen.common.restartApplication
import org.grakovne.lissen.ui.navigation.AppNavigationService
import org.grakovne.lissen.ui.screens.settings.composable.PlaybackVolumeBoostSettingsComposable
import org.grakovne.lissen.ui.screens.settings.composable.SettingsInfoBanner
import org.grakovne.lissen.ui.screens.settings.composable.SettingsToggleItem
import org.grakovne.lissen.viewmodel.SettingsViewModel
@Composable
@OptIn(ExperimentalMaterial3Api::class)
fun PlaybackPreferencesScreen(
onBack: () -> Unit,
navController: AppNavigationService,
) {
val viewModel: SettingsViewModel = hiltViewModel()
val softwareCodecsEnabled by viewModel.softwareCodecsEnabled.observeAsState(false)
val softwareCodecsEnabledOnStart = viewModel.softwareCodecsEnabledOnStart
val context = LocalContext.current
Scaffold(
topBar = {
TopAppBar(
title = {
Text(
text = stringResource(R.string.playback_preferences_title),
style = typography.titleLarge.copy(fontWeight = FontWeight.SemiBold),
color = colorScheme.onSurface,
)
},
navigationIcon = {
IconButton(onClick = { onBack() }) {
Icon(
imageVector = Icons.AutoMirrored.Outlined.ArrowBack,
contentDescription = "Back",
tint = colorScheme.onSurface,
)
}
},
)
},
modifier =
Modifier
.systemBarsPadding()
.fillMaxHeight(),
) { innerPadding ->
Column(
modifier =
Modifier
.fillMaxSize()
.padding(innerPadding),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Column(
modifier =
Modifier
.fillMaxWidth()
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally,
) {
PlaybackVolumeBoostSettingsComposable(viewModel)
AdvancedSettingsNavigationItemComposable(
title = stringResource(R.string.settings_screen_seek_time_title),
description = stringResource(R.string.settings_screen_seek_time_hint),
onclick = { navController.showSeekSettings() },
)
SettingsToggleItem(
title = stringResource(R.string.settings_screen_software_codecs_enabled_title),
description = stringResource(R.string.settings_screen_software_codecs_enabled_description),
initialState = softwareCodecsEnabled,
) { viewModel.preferSoftwareCodecsEnabled(it) }
AudioFocusLossPolicyComposable(viewModel)
}
if (softwareCodecsEnabledOnStart != softwareCodecsEnabled) {
SettingsInfoBanner(
icon = Icons.Outlined.Memory,
text = stringResource(R.string.restart_the_app_to_start_using_the_new_codecs_title),
ctaText = stringResource(R.string.restart_the_app_to_start_using_the_new_codecs_cta),
onAction = { context.restartApplication() },
)
}
}
}
}