mirror of
https://github.com/lone-cloud/prism-android
synced 2026-06-03 19:54:44 -07:00
Simplify viewModel: we always need MainViewModel
This commit is contained in:
parent
dbd3e8e654
commit
92eed71b56
2 changed files with 14 additions and 59 deletions
|
|
@ -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)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Reference in a new issue