From e483bdc812e9c67d446d5c2ebbe41dddfe5d717a Mon Sep 17 00:00:00 2001 From: grakovne Date: Fri, 12 Jun 2026 19:26:30 +0300 Subject: [PATCH] wip --- .../advanced/AppearancePreferencesScreen.kt | 98 +++++++++++++++ .../advanced/PlaybackPreferencesScreen.kt | 119 ++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/AppearancePreferencesScreen.kt create mode 100644 app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/PlaybackPreferencesScreen.kt diff --git a/app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/AppearancePreferencesScreen.kt b/app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/AppearancePreferencesScreen.kt new file mode 100644 index 00000000..6d58af10 --- /dev/null +++ b/app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/AppearancePreferencesScreen.kt @@ -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) } + } + } + } + } +} diff --git a/app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/PlaybackPreferencesScreen.kt b/app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/PlaybackPreferencesScreen.kt new file mode 100644 index 00000000..b0a70a30 --- /dev/null +++ b/app/src/main/kotlin/org/grakovne/lissen/ui/screens/settings/advanced/PlaybackPreferencesScreen.kt @@ -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() }, + ) + } + } + } +}