@@ -14,36 +14,46 @@ class AppStateViewModel : ViewModel() {
1414
1515 fun init (context : Context ) {
1616 prefs = context.getSharedPreferences(" greengo_prefs" , Context .MODE_PRIVATE )
17- _theme .value = AppTheme .fromRawValue(prefs.getString(" appTheme" , " mint" ) ? : " mint" )
18- _triviaScore .value = prefs.getInt(" score_trivia" , 0 )
19- _memoryScore .value = prefs.getInt(" score_memory" , 0 )
20- _oceanScore .value = prefs.getInt(" score_ocean" , 0 )
21- _skipMapInfo .value = prefs.getBoolean(" skip_mapInfo" , false )
17+ _theme .value = AppTheme .fromRawValue(prefs.getString(" appTheme" , " mint" ) ? : " mint" )
18+ _triviaScore .value = prefs.getInt(" score_trivia" , 0 )
19+ _memoryScore .value = prefs.getInt(" score_memory" , 0 )
20+ _oceanScore .value = prefs.getInt(" score_ocean" , 0 )
21+ _skipMapInfo .value = prefs.getBoolean(" skip_mapInfo" , false )
2222 _skipOceanInfo .value = prefs.getBoolean(" skip_oceanInfo" , false )
23- _skipMemoryInfo .value = prefs.getBoolean(" skip_memoryInfo" , false )
23+ _skipMemoryInfo .value= prefs.getBoolean(" skip_memoryInfo" , false )
2424 }
2525
2626 // ── Navigation ────────────────────────────────────────────────────────────
27+ // Rules:
28+ // • Splash is NEVER added to the back stack — it's a one-way gate.
29+ // • Home is the root. Back from Home exits the app.
30+ // • All other screens push to the stack normally.
2731
2832 private val _screen = MutableStateFlow <Screen >(Screen .Splash )
2933 val screen: StateFlow <Screen > = _screen .asStateFlow()
3034
3135 private val backStack = mutableListOf<Screen >()
3236
3337 fun navigate (screen : Screen ) {
34- backStack.add(_screen .value)
38+ val current = _screen .value
39+ // Never push Splash onto the back stack
40+ if (current !is Screen .Splash ) {
41+ backStack.add(current)
42+ }
3543 _screen .value = screen
3644 }
3745
3846 fun navigateBack () {
3947 if (backStack.isNotEmpty()) {
4048 _screen .value = backStack.removeLast()
4149 }
50+ // If stack is empty we're at Home — caller handles app exit
4251 }
4352
44- fun canNavigateBack (): Boolean {
45- return backStack.isNotEmpty()
46- }
53+ fun canNavigateBack (): Boolean = backStack.isNotEmpty()
54+
55+ // Home is the root — back from Home should exit the app
56+ fun isAtRoot (): Boolean = _screen .value is Screen .Home && backStack.isEmpty()
4757
4858 // ── Theme ─────────────────────────────────────────────────────────────────
4959
@@ -104,20 +114,9 @@ class AppStateViewModel : ViewModel() {
104114 private val _skipMemoryInfo = MutableStateFlow (false )
105115 val skipMemoryInfo: StateFlow <Boolean > = _skipMemoryInfo .asStateFlow()
106116
107- fun setSkipMapInfo (v : Boolean ) {
108- _skipMapInfo .value = v
109- prefs.edit { putBoolean(" skip_mapInfo" , v) }
110- }
111-
112- fun setSkipOceanInfo (v : Boolean ) {
113- _skipOceanInfo .value = v
114- prefs.edit { putBoolean(" skip_oceanInfo" , v) }
115- }
116-
117- fun setSkipMemoryInfo (v : Boolean ) {
118- _skipMemoryInfo .value = v
119- prefs.edit { putBoolean(" skip_memoryInfo" , v) }
120- }
117+ fun setSkipMapInfo (v : Boolean ) { _skipMapInfo .value = v; prefs.edit { putBoolean(" skip_mapInfo" , v) } }
118+ fun setSkipOceanInfo (v : Boolean ) { _skipOceanInfo .value = v; prefs.edit { putBoolean(" skip_oceanInfo" , v) } }
119+ fun setSkipMemoryInfo (v : Boolean ) { _skipMemoryInfo .value = v; prefs.edit { putBoolean(" skip_memoryInfo" , v) } }
121120
122121 fun resetPreferences () {
123122 setSkipMapInfo(false ); setSkipOceanInfo(false ); setSkipMemoryInfo(false )
@@ -128,4 +127,4 @@ class AppStateViewModel : ViewModel() {
128127 resetPreferences()
129128 setTheme(AppTheme .MINT )
130129 }
131- }
130+ }
0 commit comments