Change the back stack system.

This commit is contained in:
Thomas Andres Gomez 2021-05-14 13:44:11 +02:00
parent 4b5893cf43
commit d2acbf8d18
6 changed files with 63 additions and 44 deletions

View file

@ -13,7 +13,7 @@ import com.pixelized.biblib.ui.composable.screen.LoginScreenComposable
import com.pixelized.biblib.ui.composable.screen.MainScreenComposable import com.pixelized.biblib.ui.composable.screen.MainScreenComposable
import com.pixelized.biblib.ui.composable.screen.SplashScreenComposable import com.pixelized.biblib.ui.composable.screen.SplashScreenComposable
import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Screen import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Screen
import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {

View file

@ -51,6 +51,7 @@ import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel
import com.pixelized.biblib.ui.viewmodel.credential.CredentialViewModel import com.pixelized.biblib.ui.viewmodel.credential.CredentialViewModel
import com.pixelized.biblib.ui.viewmodel.credential.ICredentialViewModel import com.pixelized.biblib.ui.viewmodel.credential.ICredentialViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Screen
import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -215,7 +216,7 @@ private fun LoginScreenNavigationComposable(
val bookLoadingState by bookViewModel.state.observeAsState() val bookLoadingState by bookViewModel.state.observeAsState()
if (bookLoadingState is IBooksViewModel.State.Finished) { if (bookLoadingState is IBooksViewModel.State.Finished) {
navigationViewModel.navigateTo(INavigationViewModel.Screen.MainScreen) navigationViewModel.navigateTo(Screen.MainScreen)
} }
} }

View file

@ -17,7 +17,7 @@ import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel
import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Page import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Page
import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel
@Preview @Preview

View file

@ -24,6 +24,7 @@ import com.pixelized.biblib.ui.viewmodel.authentication.IAuthenticationViewModel
import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel
import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Screen
import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel import com.pixelized.biblib.ui.viewmodel.navigation.NavigationViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.util.* import java.util.*
@ -85,14 +86,14 @@ fun SplashScreenComposable(
LaunchedEffect(LAUNCH_EFFECT_NAVIGATION) { LaunchedEffect(LAUNCH_EFFECT_NAVIGATION) {
contentVisible.value = false contentVisible.value = false
delay(1000) delay(1000)
navigationViewModel.navigateTo(INavigationViewModel.Screen.MainScreen) navigationViewModel.navigateTo(Screen.MainScreen)
} }
} }
} else { } else {
LaunchedEffect(LAUNCH_EFFECT_NAVIGATION) { LaunchedEffect(LAUNCH_EFFECT_NAVIGATION) {
contentVisible.value = false contentVisible.value = false
delay(1000) delay(1000)
navigationViewModel.navigateTo(INavigationViewModel.Screen.LoginScreen) navigationViewModel.navigateTo(Screen.LoginScreen)
} }
} }
} }

View file

@ -5,31 +5,33 @@ import androidx.lifecycle.MutableLiveData
import com.pixelized.biblib.ui.data.BookUio import com.pixelized.biblib.ui.data.BookUio
interface INavigationViewModel { interface INavigationViewModel {
val screen: LiveData<Screen> val screen: LiveData<Navigable.Screen>
val page: LiveData<Page> val page: LiveData<Navigable.Page>
fun navigateTo(screen: Screen): Boolean
fun navigateTo(page: Page): Boolean
fun navigateTo(navigable: Navigable, addToBackStack: Boolean = false): Boolean
fun navigateBack(): Boolean fun navigateBack(): Boolean
sealed class Screen { sealed class Navigable {
object SplashScreen : Screen() sealed class Screen : Navigable() {
object MainScreen : Screen() object SplashScreen : Screen()
object LoginScreen : Screen() object MainScreen : Screen()
object LoginScreen : Screen()
}
sealed class Page : Navigable() {
object HomePage : Page()
data class Detail(val book: BookUio) : Page()
}
} }
sealed class Page { class Mock(
object HomePage : Page() screen: Navigable.Screen = Navigable.Screen.SplashScreen,
data class Detail(val book: BookUio) : Page() page: Navigable.Page = Navigable.Page.HomePage
} ) : INavigationViewModel {
override val screen: LiveData<Navigable.Screen> = MutableLiveData(screen)
override val page: LiveData<Navigable.Page> = MutableLiveData(page)
class Mock(screen: Screen = Screen.SplashScreen, page: Page = Page.HomePage) : INavigationViewModel { override fun navigateTo(navigable: Navigable, addToBackStack: Boolean): Boolean = false
override val screen: LiveData<Screen> = MutableLiveData(screen)
override val page: LiveData<Page> = MutableLiveData(page)
override fun navigateTo(screen: Screen): Boolean = false
override fun navigateTo(page: Page): Boolean = false
override fun navigateBack(): Boolean = false override fun navigateBack(): Boolean = false
} }
} }

View file

@ -3,38 +3,53 @@ package com.pixelized.biblib.ui.viewmodel.navigation
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Page import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Screen import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Page
import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Screen
import java.util.* import java.util.*
class NavigationViewModel : ViewModel(), INavigationViewModel { class NavigationViewModel : ViewModel(), INavigationViewModel {
private val stack = Stack<Navigable?>()
private val stack = Stack<Page>()
private val _screen = MutableLiveData<Screen>(Screen.SplashScreen) private val _screen = MutableLiveData<Screen>(Screen.SplashScreen)
override val screen: LiveData<Screen> get() = _screen
private val _page = MutableLiveData<Page>(Page.HomePage) private val _page = MutableLiveData<Page>(Page.HomePage)
override val screen: LiveData<Screen> get() = _screen
override val page: LiveData<Page> get() = _page override val page: LiveData<Page> get() = _page
override fun navigateTo(screen: Screen): Boolean { override fun navigateTo(navigable: Navigable, addToBackStack: Boolean): Boolean {
_screen.postValue(screen) when (navigable) {
return true is Page -> _page.postValue(navigable)
} is Screen -> _screen.postValue(navigable)
}
override fun navigateTo(page: Page): Boolean { if (addToBackStack) {
_page.postValue(page) stack.push(navigable)
stack.push(page) } else {
stack.push(null)
}
return true return true
} }
override fun navigateBack(): Boolean { override fun navigateBack(): Boolean {
stack.pop() return when (val navigable: Navigable? = popBackStack()) {
return if (stack.empty()) { is Page -> {
false _page.postValue(navigable)
true
}
is Screen -> {
_screen.postValue(navigable)
true
}
else -> false
}
}
private fun popBackStack(): Navigable? {
return if (stack.isEmpty()) {
null
} else { } else {
_page.postValue(stack.peek()) stack.pop()
true while (stack.isNotEmpty() && stack.peek() == null) stack.pop()
return if (stack.isNotEmpty()) stack.peek() else null
} }
} }
} }