Simplify viewModel: we always need MainViewModel

This commit is contained in:
sim 2025-09-26 16:04:58 +02:00
parent dbd3e8e654
commit 92eed71b56
2 changed files with 14 additions and 59 deletions

View file

@ -12,11 +12,9 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
@ -24,13 +22,14 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import org.unifiedpush.android.distributor.ui.R as LibR
import org.unifiedpush.android.distributor.ui.compose.AppBar import org.unifiedpush.android.distributor.ui.compose.AppBar
import org.unifiedpush.distributor.sunup.R import org.unifiedpush.distributor.sunup.R
import org.unifiedpush.distributor.sunup.activities.DistribMigrationViewModel import org.unifiedpush.distributor.sunup.activities.DistribMigrationViewModel
import org.unifiedpush.distributor.sunup.activities.MainViewModel import org.unifiedpush.distributor.sunup.activities.MainViewModel
import org.unifiedpush.distributor.sunup.activities.PreviewFactory import org.unifiedpush.distributor.sunup.activities.PreviewFactory
import org.unifiedpush.distributor.sunup.activities.SettingsViewModel import org.unifiedpush.distributor.sunup.activities.SettingsViewModel
import org.unifiedpush.android.distributor.ui.R as LibR import org.unifiedpush.distributor.sunup.activities.ThemeViewModel
enum class AppScreen(@StringRes val title: Int) { enum class AppScreen(@StringRes val title: Int) {
Main(R.string.app_name), Main(R.string.app_name),
@ -51,23 +50,6 @@ private fun DefaultTopBar(
modifier modifier
) )
@Composable
inline fun <reified VM : ViewModel> sharedViewModel(
navController: NavHostController,
screen: AppScreen,
factory: ViewModelProvider.Factory
): VM? {
val currentBackStackEntry by navController.currentBackStackEntryAsState()
return if (currentBackStackEntry?.destination?.route == screen.name) {
val parentEntry = remember(currentBackStackEntry) {
navController.getBackStackEntry(screen.name)
}
viewModel(parentEntry, factory = factory)
} else {
null
}
}
@Composable @Composable
fun App( fun App(
factory: ViewModelProvider.Factory, factory: ViewModelProvider.Factory,
@ -80,20 +62,18 @@ fun App(
) )
// shared with all views, no need to scope it // shared with all views, no need to scope it
val migrationViewModel = viewModel<DistribMigrationViewModel>(factory = factory) val migrationViewModel = viewModel<DistribMigrationViewModel>(factory = factory)
val mainViewModel = viewModel<MainViewModel>(factory = factory)
Scaffold( Scaffold(
topBar = { topBar = {
when (currentScreen) { when (currentScreen) {
AppScreen.Main -> { AppScreen.Main -> {
sharedViewModel<MainViewModel>( MainAppBarOrSelection(
navController, mainViewModel,
currentScreen, onGoToSettings = {
factory
)?.let {
MainAppBarOrSelection(it, onGoToSettings = {
navController.navigate(AppScreen.Settings.name) navController.navigate(AppScreen.Settings.name)
})
} }
)
} }
else -> null else -> null
} ?: DefaultTopBar( } ?: DefaultTopBar(
@ -113,14 +93,14 @@ fun App(
.padding(innerPadding) .padding(innerPadding)
) { ) {
composable(route = AppScreen.Main.name) { composable(route = AppScreen.Main.name) {
sharedViewModel<MainViewModel>(navController, currentScreen, factory)?.let { MainScreen(
MainScreen(it, migrationViewModel) mainViewModel,
} migrationViewModel
)
} }
composable(route = AppScreen.Settings.name) { composable(route = AppScreen.Settings.name) {
sharedViewModel<SettingsViewModel>(navController, currentScreen, factory)?.let { val vm = viewModel<SettingsViewModel>(factory = factory)
SettingsScreen(it, themeViewModel, migrationViewModel) SettingsScreen(vm, themeViewModel, migrationViewModel)
}
} }
} }
} }

View file

@ -1,25 +0,0 @@
package org.unifiedpush.distributor.sunup.activities.ui
import android.app.Application
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
import org.unifiedpush.distributor.sunup.AppStore
class ThemeViewModel(val application: Application? = null): ViewModel() {
var dynamicColors by mutableStateOf(
application?.let {AppStore(it).dynamicColors} ?: false
)
fun toggleDynamicColors() {
viewModelScope.launch {
dynamicColors = !dynamicColors
application?.run {
AppStore(this).dynamicColors = dynamicColors
}
}
}
}