From bfb9fb6ca8bc7910814f40327e8cecedb9558a5d Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sun, 26 Apr 2026 13:55:23 +0100 Subject: [PATCH] Tweaked ViewModel retention to mirror the Nav2 behavior --- .../java/com/rtbishop/look4sat/MainScreen.kt | 6 ++++++ .../{NightOverlay.kt => MapNightOverlay.kt} | 2 +- .../rtbishop/look4sat/feature/map/MapScreen.kt | 9 ++++++--- .../look4sat/feature/map/MapViewModel.kt | 18 ++++++++++-------- .../look4sat/feature/passes/PassesScreen.kt | 6 +++++- .../look4sat/feature/passes/PassesViewModel.kt | 12 ++++++------ .../look4sat/feature/radar/RadarScreen.kt | 6 +++++- .../look4sat/feature/radar/RadarViewModel.kt | 7 ++----- .../feature/radiocontrol/RadioControlScreen.kt | 6 +++++- .../radiocontrol/RadioControlViewModel.kt | 13 ++++++------- .../feature/satellites/SatellitesScreen.kt | 6 +++++- .../feature/satellites/SatellitesViewModel.kt | 12 ++++++------ .../feature/settings/SettingsScreen.kt | 6 +++++- .../feature/settings/SettingsViewModel.kt | 13 +++++-------- 14 files changed, 73 insertions(+), 49 deletions(-) rename feature/map/src/main/java/com/rtbishop/look4sat/feature/map/{NightOverlay.kt => MapNightOverlay.kt} (99%) diff --git a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt index 5ea30662..bc41062f 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt @@ -56,8 +56,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.ui.NavDisplay import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.presentation.Screen @@ -122,6 +124,10 @@ fun MainScreen() { transitionSpec = { fadeTransition }, popTransitionSpec = { fadeTransition }, predictivePopTransitionSpec = { fadeTransition }, + entryDecorators = listOf( + rememberSaveableStateHolderNavEntryDecorator(), + rememberViewModelStoreNavEntryDecorator() + ), entryProvider = entryProvider { entry { SatellitesDestination(navigateUp = navigateBack) diff --git a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/NightOverlay.kt b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt similarity index 99% rename from feature/map/src/main/java/com/rtbishop/look4sat/feature/map/NightOverlay.kt rename to feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt index 81f2f544..db31dfc1 100644 --- a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/NightOverlay.kt +++ b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt @@ -43,7 +43,7 @@ import kotlin.math.sin * filled vertical rectangles. On a 1080-wide screen this means ~270 trig * evaluations per row, which is imperceptible. */ -class NightOverlay : Overlay() { +class MapNightOverlay : Overlay() { /** Sub-solar latitude in degrees. */ var sunLatDeg: Double = 0.0 diff --git a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapScreen.kt b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapScreen.kt index bb86ecb5..5d8a7f37 100644 --- a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapScreen.kt +++ b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapScreen.kt @@ -63,6 +63,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.core.domain.predict.GeoPos import com.rtbishop.look4sat.core.domain.predict.OrbitalObject import com.rtbishop.look4sat.core.domain.predict.OrbitalPos +import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.presentation.IconCard import com.rtbishop.look4sat.core.presentation.NextPassRow import com.rtbishop.look4sat.core.presentation.R @@ -120,9 +121,11 @@ private val moonIconPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { @Composable fun MapDestination() { + val context = LocalContext.current + val container = (context.applicationContext as IContainerProvider).getMainContainer() val viewModel = viewModel( modelClass = MapViewModel::class.java, - factory = MapViewModel.Factory + factory = MapViewModel.factory(container) ) val uiState by viewModel.uiState.collectAsStateWithLifecycle() val mapView = rememberMapViewWithLifecycle() @@ -407,11 +410,11 @@ private fun setFootprint(orbitalPos: OrbitalPos, mapView: MapView) { private fun setTerminator(sunLatDeg: Double, sunLonDeg: Double, mapView: MapView) { try { val overlay = mapView.overlays[OVERLAY_TERMINATOR] - if (overlay is NightOverlay) { + if (overlay is MapNightOverlay) { overlay.sunLatDeg = sunLatDeg overlay.sunLonDeg = sunLonDeg } else { - mapView.overlays[OVERLAY_TERMINATOR] = NightOverlay().apply { + mapView.overlays[OVERLAY_TERMINATOR] = MapNightOverlay().apply { this.sunLatDeg = sunLatDeg this.sunLonDeg = sunLonDeg } diff --git a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapViewModel.kt b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapViewModel.kt index a0903a6e..e609919c 100644 --- a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapViewModel.kt +++ b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapViewModel.kt @@ -18,7 +18,6 @@ package com.rtbishop.look4sat.feature.map import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory @@ -27,7 +26,7 @@ import com.rtbishop.look4sat.core.domain.predict.GeoPos import com.rtbishop.look4sat.core.domain.predict.OrbitalObject import com.rtbishop.look4sat.core.domain.predict.OrbitalPass import com.rtbishop.look4sat.core.domain.predict.OrbitalPos -import com.rtbishop.look4sat.core.domain.repository.IContainerProvider +import com.rtbishop.look4sat.core.domain.repository.IMainContainer import com.rtbishop.look4sat.core.domain.repository.ISatelliteRepo import com.rtbishop.look4sat.core.domain.repository.ISettingsRepo import com.rtbishop.look4sat.core.domain.utility.clipLat @@ -50,8 +49,10 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import java.util.Date -class MapViewModel(private val satelliteRepo: ISatelliteRepo, private val settingsRepo: ISettingsRepo) : - ViewModel() { +class MapViewModel( + private val satelliteRepo: ISatelliteRepo, + private val settingsRepo: ISettingsRepo +) : ViewModel() { private val stationPos = settingsRepo.stationPosition.value private val defaultPass = getDefaultPass() @@ -293,11 +294,12 @@ class MapViewModel(private val satelliteRepo: ISatelliteRepo, private val settin /** Number of parallel chunks for satellite position computation */ private const val PARALLEL_CHUNKS = 4 - val Factory: ViewModelProvider.Factory = viewModelFactory { - val applicationKey = ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY + fun factory(container: IMainContainer) = viewModelFactory { initializer { - val container = (this[applicationKey] as IContainerProvider).getMainContainer() - MapViewModel(container.satelliteRepo, container.settingsRepo) + MapViewModel( + satelliteRepo = container.satelliteRepo, + settingsRepo = container.settingsRepo + ) } } } diff --git a/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesScreen.kt b/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesScreen.kt index 997255c7..1c909f89 100644 --- a/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesScreen.kt +++ b/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesScreen.kt @@ -50,6 +50,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -63,6 +64,7 @@ import com.rtbishop.look4sat.core.domain.predict.DeepSpaceObject import com.rtbishop.look4sat.core.domain.predict.NearEarthObject import com.rtbishop.look4sat.core.domain.predict.OrbitalData import com.rtbishop.look4sat.core.domain.predict.OrbitalPass +import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.presentation.EmptyListCard import com.rtbishop.look4sat.core.presentation.IconCard import com.rtbishop.look4sat.core.presentation.InfoDialog @@ -81,9 +83,11 @@ import java.util.TimeZone @Composable fun PassesDestination(navigateToRadar: (Int, Long) -> Unit) { + val context = LocalContext.current + val container = (context.applicationContext as IContainerProvider).getMainContainer() val viewModel = viewModel( modelClass = PassesViewModel::class.java, - factory = PassesViewModel.Factory + factory = PassesViewModel.factory(container) ) val uiState = viewModel.uiState.collectAsStateWithLifecycle().value PassesScreen(uiState, viewModel::onAction, navigateToRadar) diff --git a/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesViewModel.kt b/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesViewModel.kt index e884be39..99c2a65a 100644 --- a/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesViewModel.kt +++ b/feature/passes/src/main/java/com/rtbishop/look4sat/feature/passes/PassesViewModel.kt @@ -18,14 +18,13 @@ package com.rtbishop.look4sat.feature.passes import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import com.rtbishop.look4sat.core.domain.model.PassesSettings import com.rtbishop.look4sat.core.domain.predict.CelestialComputer import com.rtbishop.look4sat.core.domain.predict.OrbitalPass -import com.rtbishop.look4sat.core.domain.repository.IContainerProvider +import com.rtbishop.look4sat.core.domain.repository.IMainContainer import com.rtbishop.look4sat.core.domain.repository.ISatelliteRepo import com.rtbishop.look4sat.core.domain.repository.ISettingsRepo import com.rtbishop.look4sat.core.domain.utility.round @@ -200,11 +199,12 @@ class PassesViewModel( } companion object { - val Factory: ViewModelProvider.Factory = viewModelFactory { - val applicationKey = ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY + fun factory(container: IMainContainer) = viewModelFactory { initializer { - val container = (this[applicationKey] as IContainerProvider).getMainContainer() - PassesViewModel(container.satelliteRepo, container.settingsRepo) + PassesViewModel( + satelliteRepo = container.satelliteRepo, + settingsRepo = container.settingsRepo + ) } } } diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt index 79604309..c48b0aff 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarScreen.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.keepScreenOn +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription @@ -61,6 +62,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.core.domain.model.SatRadio import com.rtbishop.look4sat.core.domain.predict.OrbitalPos +import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.domain.utility.toDegrees import com.rtbishop.look4sat.core.presentation.EmptyListCard import com.rtbishop.look4sat.core.presentation.IconCard @@ -81,10 +83,12 @@ fun RadarDestination( navigateUp: () -> Unit, navigateToRadioControl: (Int, Long) -> Unit = { _, _ -> } ) { + val context = LocalContext.current + val container = (context.applicationContext as IContainerProvider).getMainContainer() val viewModel = viewModel( modelClass = RadarViewModel::class.java, key = "$catNum-$aosTime", - factory = RadarViewModel.factory(catNum, aosTime) + factory = RadarViewModel.factory(catNum, aosTime, container) ) val uiState by viewModel.uiState.collectAsStateWithLifecycle() RadarScreen(uiState, viewModel::onAction, navigateUp, navigateToRadioControl) diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt index 5ab62b77..a43c9354 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt @@ -18,7 +18,6 @@ package com.rtbishop.look4sat.feature.radar import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory @@ -26,7 +25,7 @@ import com.rtbishop.look4sat.core.domain.model.SatRadio import com.rtbishop.look4sat.core.domain.predict.CelestialComputer import com.rtbishop.look4sat.core.domain.predict.OrbitalObject import com.rtbishop.look4sat.core.domain.predict.OrbitalPos -import com.rtbishop.look4sat.core.domain.repository.IContainerProvider +import com.rtbishop.look4sat.core.domain.repository.IMainContainer import com.rtbishop.look4sat.core.domain.repository.IReporter import com.rtbishop.look4sat.core.domain.repository.ISatelliteRepo import com.rtbishop.look4sat.core.domain.repository.ISensorsRepo @@ -214,10 +213,8 @@ class RadarViewModel( } companion object { - fun factory(catNum: Int, aosTime: Long): ViewModelProvider.Factory = viewModelFactory { - val applicationKey = ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY + fun factory(catNum: Int, aosTime: Long, container: IMainContainer) = viewModelFactory { initializer { - val container = (this[applicationKey] as IContainerProvider).getMainContainer() RadarViewModel( catNum = catNum, aosTime = aosTime, diff --git a/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlScreen.kt b/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlScreen.kt index acae67ab..c3d5c112 100644 --- a/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlScreen.kt +++ b/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlScreen.kt @@ -45,6 +45,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.keepScreenOn +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -52,6 +53,7 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.core.domain.model.SatRadio +import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.presentation.CardButton import com.rtbishop.look4sat.core.presentation.IconCard import com.rtbishop.look4sat.core.presentation.NextPassRow @@ -65,10 +67,12 @@ import java.util.Locale @Composable fun RadioControlDestination(catNum: Int = 0, aosTime: Long = 0L, navigateUp: () -> Unit) { + val context = LocalContext.current + val container = (context.applicationContext as IContainerProvider).getMainContainer() val viewModel = viewModel( modelClass = RadioControlViewModel::class.java, key = "$catNum-$aosTime", - factory = RadioControlViewModel.factory(catNum, aosTime) + factory = RadioControlViewModel.factory(catNum, aosTime, container) ) val uiState by viewModel.uiState.collectAsStateWithLifecycle() RadioControlScreen(uiState, viewModel::onAction, navigateUp) diff --git a/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlViewModel.kt b/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlViewModel.kt index 84e15d5d..187950ad 100644 --- a/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlViewModel.kt +++ b/feature/radiocontrol/src/main/java/com/rtbishop/look4sat/feature/radiocontrol/RadioControlViewModel.kt @@ -18,13 +18,12 @@ package com.rtbishop.look4sat.feature.radiocontrol import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import com.rtbishop.look4sat.core.domain.model.SatRadio import com.rtbishop.look4sat.core.domain.predict.OrbitalPass -import com.rtbishop.look4sat.core.domain.repository.IContainerProvider +import com.rtbishop.look4sat.core.domain.repository.IMainContainer import com.rtbishop.look4sat.core.domain.repository.IRadioTrackingService import com.rtbishop.look4sat.core.domain.repository.ISatelliteRepo import com.rtbishop.look4sat.core.domain.repository.ISettingsRepo @@ -173,10 +172,12 @@ class RadioControlViewModel( companion object { - val CTCSS_TONES = listOf(67.0, 69.3, 71.9, 74.4, 77.0, 79.7, 82.5, 85.4, 88.5, 91.5, + val CTCSS_TONES = listOf( + 67.0, 69.3, 71.9, 74.4, 77.0, 79.7, 82.5, 85.4, 88.5, 91.5, 94.8, 97.4, 100.0, 103.5, 107.2, 110.9, 114.8, 118.8, 123.0, 127.3, 131.8, 136.5, 141.3, 146.2, 151.4, 156.7, 162.2, 167.9, 173.8, 179.9, 186.2, 192.8, 203.5, 210.7, - 218.1, 225.7, 233.6, 241.8, 250.3) + 218.1, 225.7, 233.6, 241.8, 250.3 + ) fun formatFrequency(frequencyHz: Long): String { if (frequencyHz <= 0) return "---" @@ -186,10 +187,8 @@ class RadioControlViewModel( return String.format(Locale.ENGLISH, "%d.%03d.%03d", mhz, khz, hz) } - fun factory(catNum: Int, aosTime: Long): ViewModelProvider.Factory = viewModelFactory { - val applicationKey = ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY + fun factory(catNum: Int, aosTime: Long, container: IMainContainer) = viewModelFactory { initializer { - val container = (this[applicationKey] as IContainerProvider).getMainContainer() RadioControlViewModel( catNum = catNum, aosTime = aosTime, diff --git a/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesScreen.kt b/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesScreen.kt index 08e5e242..4d2a1764 100644 --- a/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesScreen.kt +++ b/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesScreen.kt @@ -44,6 +44,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription @@ -57,6 +58,7 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.core.domain.model.SatItem +import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.presentation.CardLoadingIndicator import com.rtbishop.look4sat.core.presentation.EmptyListCard import com.rtbishop.look4sat.core.presentation.IconCard @@ -71,9 +73,11 @@ import com.rtbishop.look4sat.core.presentation.layoutPadding @Composable fun SatellitesDestination(navigateUp: () -> Unit) { + val context = LocalContext.current + val container = (context.applicationContext as IContainerProvider).getMainContainer() val viewModel = viewModel( modelClass = SatellitesViewModel::class.java, - factory = SatellitesViewModel.Factory + factory = SatellitesViewModel.factory(container) ) val uiState = viewModel.uiState.collectAsStateWithLifecycle().value SatellitesScreen(uiState, viewModel::onAction, navigateUp) diff --git a/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesViewModel.kt b/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesViewModel.kt index 72406462..fdc4b9b3 100644 --- a/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesViewModel.kt +++ b/feature/satellites/src/main/java/com/rtbishop/look4sat/feature/satellites/SatellitesViewModel.kt @@ -18,11 +18,10 @@ package com.rtbishop.look4sat.feature.satellites import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory -import com.rtbishop.look4sat.core.domain.repository.IContainerProvider +import com.rtbishop.look4sat.core.domain.repository.IMainContainer import com.rtbishop.look4sat.core.domain.repository.ISelectionRepo import com.rtbishop.look4sat.core.domain.repository.ISettingsRepo import kotlinx.coroutines.flow.MutableStateFlow @@ -97,11 +96,12 @@ class SatellitesViewModel( } companion object { - val Factory: ViewModelProvider.Factory = viewModelFactory { - val applicationKey = ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY + fun factory(container: IMainContainer) = viewModelFactory { initializer { - val container = (this[applicationKey] as IContainerProvider).getMainContainer() - SatellitesViewModel(container.selectionRepo, container.settingsRepo) + SatellitesViewModel( + selectionRepo = container.selectionRepo, + settingsRepo = container.settingsRepo + ) } } } diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt index 996f62f4..777f38c8 100644 --- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt @@ -51,6 +51,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -62,6 +63,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.core.domain.model.OtherSettings import com.rtbishop.look4sat.core.domain.predict.GeoPos +import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.presentation.CardButton import com.rtbishop.look4sat.core.presentation.IconCard import com.rtbishop.look4sat.core.presentation.MainTheme @@ -77,9 +79,11 @@ import java.util.Locale @Composable fun SettingsDestination() { + val context = LocalContext.current + val container = (context.applicationContext as IContainerProvider).getMainContainer() val viewModel = viewModel( modelClass = SettingsViewModel::class.java, - factory = SettingsViewModel.Factory + factory = SettingsViewModel.factory(container) ) val uiState by viewModel.uiState.collectAsStateWithLifecycle() SettingsScreen(uiState, viewModel::onAction) diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsViewModel.kt index ca17941d..6a685155 100644 --- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsViewModel.kt @@ -18,12 +18,11 @@ package com.rtbishop.look4sat.feature.settings import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory -import com.rtbishop.look4sat.core.domain.repository.IContainerProvider import com.rtbishop.look4sat.core.domain.repository.IDatabaseRepo +import com.rtbishop.look4sat.core.domain.repository.IMainContainer import com.rtbishop.look4sat.core.domain.repository.ISettingsRepo import com.rtbishop.look4sat.core.domain.usecase.IShowToast import com.rtbishop.look4sat.core.presentation.R @@ -188,14 +187,12 @@ class SettingsViewModel( // endregion companion object { - val Factory: ViewModelProvider.Factory = viewModelFactory { - val applicationKey = ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY + fun factory(container: IMainContainer) = viewModelFactory { initializer { - val container = (this[applicationKey] as IContainerProvider).getMainContainer() SettingsViewModel( - container.databaseRepo, - container.settingsRepo, - container.provideShowToast() + databaseRepo = container.databaseRepo, + settingsRepo = container.settingsRepo, + showToast = container.provideShowToast() ) } }