Skip to content

Commit 2644974

Browse files
committed
feat(ui): make settings screen remember its state when navigating
1 parent cfb1a75 commit 2644974

File tree

2 files changed

+21
-38
lines changed

2 files changed

+21
-38
lines changed

app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/SettingsScreen.kt

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import androidx.compose.foundation.layout.padding
3434
import androidx.compose.foundation.lazy.LazyColumn
3535
import androidx.compose.foundation.lazy.itemsIndexed
3636
import androidx.compose.foundation.text.input.TextFieldState
37-
import androidx.compose.foundation.text.input.rememberTextFieldState
3837
import androidx.compose.material3.ExperimentalMaterial3Api
3938
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
4039
import androidx.compose.material3.Icon
@@ -43,12 +42,12 @@ import androidx.compose.material3.SliderState
4342
import androidx.compose.material3.Text
4443
import androidx.compose.material3.TopAppBar
4544
import androidx.compose.material3.TopAppBarDefaults
46-
import androidx.compose.material3.rememberSliderState
4745
import androidx.compose.runtime.Composable
4846
import androidx.compose.runtime.DisposableEffect
4947
import androidx.compose.runtime.getValue
5048
import androidx.compose.runtime.remember
5149
import androidx.compose.runtime.saveable.rememberSaveable
50+
import androidx.compose.runtime.snapshots.SnapshotStateList
5251
import androidx.compose.ui.Alignment
5352
import androidx.compose.ui.Modifier
5453
import androidx.compose.ui.graphics.Color
@@ -57,14 +56,11 @@ import androidx.compose.ui.platform.LocalContext
5756
import androidx.compose.ui.res.painterResource
5857
import androidx.compose.ui.res.stringResource
5958
import androidx.compose.ui.text.style.TextOverflow
60-
import androidx.compose.ui.tooling.preview.Devices
61-
import androidx.compose.ui.tooling.preview.Preview
6259
import androidx.compose.ui.unit.dp
6360
import androidx.compose.ui.unit.sp
6461
import androidx.lifecycle.compose.collectAsStateWithLifecycle
6562
import androidx.lifecycle.viewmodel.compose.viewModel
6663
import androidx.navigation3.runtime.entryProvider
67-
import androidx.navigation3.runtime.rememberNavBackStack
6864
import androidx.navigation3.ui.NavDisplay
6965
import org.nsh07.pomodoro.R
7066
import org.nsh07.pomodoro.service.TimerService
@@ -79,7 +75,6 @@ import org.nsh07.pomodoro.ui.settingsScreen.viewModel.SettingsViewModel
7975
import org.nsh07.pomodoro.ui.settingsScreens
8076
import org.nsh07.pomodoro.ui.theme.AppFonts.robotoFlexTopBar
8177
import org.nsh07.pomodoro.ui.theme.CustomColors.topBarColors
82-
import org.nsh07.pomodoro.ui.theme.TomatoTheme
8378

8479

8580
@OptIn(ExperimentalMaterial3Api::class)
@@ -90,6 +85,8 @@ fun SettingsScreenRoot(
9085
) {
9186
val context = LocalContext.current
9287

88+
val backStack = viewModel.backStack
89+
9390
DisposableEffect(Unit) {
9491
viewModel.runTextFieldFlowCollection()
9592
onDispose { viewModel.cancelTextFieldFlowCollection() }
@@ -122,6 +119,7 @@ fun SettingsScreenRoot(
122119

123120
SettingsScreen(
124121
preferencesState = preferencesState,
122+
backStack = backStack,
125123
focusTimeInputFieldState = focusTimeInputFieldState,
126124
shortBreakTimeInputFieldState = shortBreakTimeInputFieldState,
127125
longBreakTimeInputFieldState = longBreakTimeInputFieldState,
@@ -150,6 +148,7 @@ fun SettingsScreenRoot(
150148
@Composable
151149
private fun SettingsScreen(
152150
preferencesState: PreferencesState,
151+
backStack: SnapshotStateList<Screen.Settings>,
153152
focusTimeInputFieldState: TextFieldState,
154153
shortBreakTimeInputFieldState: TextFieldState,
155154
longBreakTimeInputFieldState: TextFieldState,
@@ -168,7 +167,6 @@ private fun SettingsScreen(
168167
) {
169168
val context = LocalContext.current
170169
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
171-
val backStack = rememberNavBackStack(Screen.Settings.Main)
172170

173171
NavDisplay(
174172
backStack = backStack,
@@ -283,32 +281,3 @@ private fun SettingsScreen(
283281
}
284282
)
285283
}
286-
287-
@OptIn(ExperimentalMaterial3Api::class)
288-
@Preview(
289-
showSystemUi = true,
290-
device = Devices.PIXEL_9_PRO
291-
)
292-
@Composable
293-
fun SettingsScreenPreview() {
294-
TomatoTheme {
295-
SettingsScreen(
296-
preferencesState = PreferencesState(),
297-
focusTimeInputFieldState = rememberTextFieldState((25).toString()),
298-
shortBreakTimeInputFieldState = rememberTextFieldState((5).toString()),
299-
longBreakTimeInputFieldState = rememberTextFieldState((15).toString()),
300-
sessionsSliderState = rememberSliderState(value = 3f, steps = 3, valueRange = 1f..5f),
301-
alarmEnabled = true,
302-
vibrateEnabled = true,
303-
alarmSound = "null",
304-
onAlarmEnabledChange = {},
305-
onVibrateEnabledChange = {},
306-
onBlackThemeChange = {},
307-
onAodEnabledChange = {},
308-
onAlarmSoundChanged = {},
309-
onThemeChange = {},
310-
onColorSchemeChange = {},
311-
modifier = Modifier.fillMaxSize()
312-
)
313-
}
314-
}

app/src/main/java/org/nsh07/pomodoro/ui/settingsScreen/viewModel/SettingsViewModel.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
/*
22
* Copyright (c) 2025 Nishant Mishra
33
*
4-
* You should have received a copy of the GNU General Public License
5-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
4+
* This file is part of Tomato - a minimalist pomodoro timer for Android.
5+
*
6+
* Tomato is free software: you can redistribute it and/or modify it under the terms of the GNU
7+
* General Public License as published by the Free Software Foundation, either version 3 of the
8+
* License, or (at your option) any later version.
9+
*
10+
* Tomato is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
11+
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
12+
* Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License along with Tomato.
15+
* If not, see <https://www.gnu.org/licenses/>.
616
*/
717

818
package org.nsh07.pomodoro.ui.settingsScreen.viewModel
@@ -11,6 +21,7 @@ import android.net.Uri
1121
import androidx.compose.foundation.text.input.TextFieldState
1222
import androidx.compose.material3.ExperimentalMaterial3Api
1323
import androidx.compose.material3.SliderState
24+
import androidx.compose.runtime.mutableStateListOf
1425
import androidx.compose.runtime.snapshotFlow
1526
import androidx.compose.ui.graphics.Color
1627
import androidx.lifecycle.ViewModel
@@ -31,12 +42,15 @@ import kotlinx.coroutines.launch
3142
import org.nsh07.pomodoro.TomatoApplication
3243
import org.nsh07.pomodoro.data.AppPreferenceRepository
3344
import org.nsh07.pomodoro.data.TimerRepository
45+
import org.nsh07.pomodoro.ui.Screen
3446

3547
@OptIn(FlowPreview::class, ExperimentalMaterial3Api::class)
3648
class SettingsViewModel(
3749
private val preferenceRepository: AppPreferenceRepository,
3850
private val timerRepository: TimerRepository,
3951
) : ViewModel() {
52+
val backStack = mutableStateListOf<Screen.Settings>(Screen.Settings.Main)
53+
4054
private val _preferencesState = MutableStateFlow(PreferencesState())
4155
val preferencesState = _preferencesState.asStateFlow()
4256

0 commit comments

Comments
 (0)