From 2644974ad5117a9112889bf4a72a3c8a429266a4 Mon Sep 17 00:00:00 2001 From: Nishant Mishra Date: Wed, 22 Oct 2025 22:13:19 +0530 Subject: [PATCH] feat(ui): make settings screen remember its state when navigating --- .../ui/settingsScreen/SettingsScreen.kt | 41 +++---------------- .../viewModel/SettingsViewModel.kt | 18 +++++++- 2 files changed, 21 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/SettingsScreen.kt b/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/SettingsScreen.kt index ebc7c3f..47195a3 100644 --- a/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/SettingsScreen.kt +++ b/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/SettingsScreen.kt @@ -34,7 +34,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.text.input.TextFieldState -import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon @@ -43,12 +42,12 @@ import androidx.compose.material3.SliderState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.material3.rememberSliderState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -57,14 +56,11 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Devices -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.ui.NavDisplay import org.nsh07.pomodoro.R import org.nsh07.pomodoro.service.TimerService @@ -79,7 +75,6 @@ import org.nsh07.pomodoro.ui.settingsScreen.viewModel.SettingsViewModel import org.nsh07.pomodoro.ui.settingsScreens import org.nsh07.pomodoro.ui.theme.AppFonts.robotoFlexTopBar import org.nsh07.pomodoro.ui.theme.CustomColors.topBarColors -import org.nsh07.pomodoro.ui.theme.TomatoTheme @OptIn(ExperimentalMaterial3Api::class) @@ -90,6 +85,8 @@ fun SettingsScreenRoot( ) { val context = LocalContext.current + val backStack = viewModel.backStack + DisposableEffect(Unit) { viewModel.runTextFieldFlowCollection() onDispose { viewModel.cancelTextFieldFlowCollection() } @@ -122,6 +119,7 @@ fun SettingsScreenRoot( SettingsScreen( preferencesState = preferencesState, + backStack = backStack, focusTimeInputFieldState = focusTimeInputFieldState, shortBreakTimeInputFieldState = shortBreakTimeInputFieldState, longBreakTimeInputFieldState = longBreakTimeInputFieldState, @@ -150,6 +148,7 @@ fun SettingsScreenRoot( @Composable private fun SettingsScreen( preferencesState: PreferencesState, + backStack: SnapshotStateList, focusTimeInputFieldState: TextFieldState, shortBreakTimeInputFieldState: TextFieldState, longBreakTimeInputFieldState: TextFieldState, @@ -168,7 +167,6 @@ private fun SettingsScreen( ) { val context = LocalContext.current val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() - val backStack = rememberNavBackStack(Screen.Settings.Main) NavDisplay( backStack = backStack, @@ -283,32 +281,3 @@ private fun SettingsScreen( } ) } - -@OptIn(ExperimentalMaterial3Api::class) -@Preview( - showSystemUi = true, - device = Devices.PIXEL_9_PRO -) -@Composable -fun SettingsScreenPreview() { - TomatoTheme { - SettingsScreen( - preferencesState = PreferencesState(), - focusTimeInputFieldState = rememberTextFieldState((25).toString()), - shortBreakTimeInputFieldState = rememberTextFieldState((5).toString()), - longBreakTimeInputFieldState = rememberTextFieldState((15).toString()), - sessionsSliderState = rememberSliderState(value = 3f, steps = 3, valueRange = 1f..5f), - alarmEnabled = true, - vibrateEnabled = true, - alarmSound = "null", - onAlarmEnabledChange = {}, - onVibrateEnabledChange = {}, - onBlackThemeChange = {}, - onAodEnabledChange = {}, - onAlarmSoundChanged = {}, - onThemeChange = {}, - onColorSchemeChange = {}, - modifier = Modifier.fillMaxSize() - ) - } -} diff --git a/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/viewModel/SettingsViewModel.kt b/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/viewModel/SettingsViewModel.kt index 454bf82..76ebb8c 100644 --- a/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/viewModel/SettingsViewModel.kt +++ b/app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/viewModel/SettingsViewModel.kt @@ -1,8 +1,18 @@ /* * Copyright (c) 2025 Nishant Mishra * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * This file is part of Tomato - a minimalist pomodoro timer for Android. + * + * Tomato is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Tomato is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Tomato. + * If not, see . */ package org.nsh07.pomodoro.ui.settingsScreen.viewModel @@ -11,6 +21,7 @@ import android.net.Uri import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SliderState +import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.graphics.Color import androidx.lifecycle.ViewModel @@ -31,12 +42,15 @@ import kotlinx.coroutines.launch import org.nsh07.pomodoro.TomatoApplication import org.nsh07.pomodoro.data.AppPreferenceRepository import org.nsh07.pomodoro.data.TimerRepository +import org.nsh07.pomodoro.ui.Screen @OptIn(FlowPreview::class, ExperimentalMaterial3Api::class) class SettingsViewModel( private val preferenceRepository: AppPreferenceRepository, private val timerRepository: TimerRepository, ) : ViewModel() { + val backStack = mutableStateListOf(Screen.Settings.Main) + private val _preferencesState = MutableStateFlow(PreferencesState()) val preferencesState = _preferencesState.asStateFlow()