diff --git a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt index 2db0d35..8cd0b13 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/MainActivity.kt @@ -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.SplashScreenComposable 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 class MainActivity : ComponentActivity() { diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/LoginScreenComposable.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/LoginScreenComposable.kt index fba5881..8ec11da 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/LoginScreenComposable.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/LoginScreenComposable.kt @@ -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.ICredentialViewModel 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 kotlinx.coroutines.delay @@ -215,7 +216,7 @@ private fun LoginScreenNavigationComposable( val bookLoadingState by bookViewModel.state.observeAsState() if (bookLoadingState is IBooksViewModel.State.Finished) { - navigationViewModel.navigateTo(INavigationViewModel.Screen.MainScreen) + navigationViewModel.navigateTo(Screen.MainScreen) } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt index 6f7f616..2909a15 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt @@ -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.IBooksViewModel 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 @Preview diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/SplashScreenComposable.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/SplashScreenComposable.kt index 320d067..77605c2 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/SplashScreenComposable.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/SplashScreenComposable.kt @@ -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.IBooksViewModel 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 kotlinx.coroutines.delay import java.util.* @@ -85,14 +86,14 @@ fun SplashScreenComposable( LaunchedEffect(LAUNCH_EFFECT_NAVIGATION) { contentVisible.value = false delay(1000) - navigationViewModel.navigateTo(INavigationViewModel.Screen.MainScreen) + navigationViewModel.navigateTo(Screen.MainScreen) } } } else { LaunchedEffect(LAUNCH_EFFECT_NAVIGATION) { contentVisible.value = false delay(1000) - navigationViewModel.navigateTo(INavigationViewModel.Screen.LoginScreen) + navigationViewModel.navigateTo(Screen.LoginScreen) } } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt index 89c3fbf..f3fa779 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt @@ -5,31 +5,33 @@ import androidx.lifecycle.MutableLiveData import com.pixelized.biblib.ui.data.BookUio interface INavigationViewModel { - val screen: LiveData - val page: LiveData - - fun navigateTo(screen: Screen): Boolean - fun navigateTo(page: Page): Boolean + val screen: LiveData + val page: LiveData + fun navigateTo(navigable: Navigable, addToBackStack: Boolean = false): Boolean fun navigateBack(): Boolean - sealed class Screen { - object SplashScreen : Screen() - object MainScreen : Screen() - object LoginScreen : Screen() + sealed class Navigable { + sealed class Screen : Navigable() { + object SplashScreen : Screen() + object MainScreen : Screen() + object LoginScreen : Screen() + } + + sealed class Page : Navigable() { + object HomePage : Page() + data class Detail(val book: BookUio) : Page() + } } - sealed class Page { - object HomePage : Page() - data class Detail(val book: BookUio) : Page() - } + class Mock( + screen: Navigable.Screen = Navigable.Screen.SplashScreen, + page: Navigable.Page = Navigable.Page.HomePage + ) : INavigationViewModel { + override val screen: LiveData = MutableLiveData(screen) + override val page: LiveData = MutableLiveData(page) - class Mock(screen: Screen = Screen.SplashScreen, page: Page = Page.HomePage) : INavigationViewModel { - override val screen: LiveData = MutableLiveData(screen) - override val page: LiveData = MutableLiveData(page) - - override fun navigateTo(screen: Screen): Boolean = false - override fun navigateTo(page: Page): Boolean = false + override fun navigateTo(navigable: Navigable, addToBackStack: Boolean): Boolean = false override fun navigateBack(): Boolean = false } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/NavigationViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/NavigationViewModel.kt index 0c700df..3835507 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/NavigationViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/NavigationViewModel.kt @@ -3,38 +3,53 @@ package com.pixelized.biblib.ui.viewmodel.navigation import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Page -import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Screen +import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable +import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Page +import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Screen import java.util.* class NavigationViewModel : ViewModel(), INavigationViewModel { - - private val stack = Stack() - + private val stack = Stack() private val _screen = MutableLiveData(Screen.SplashScreen) - override val screen: LiveData get() = _screen - private val _page = MutableLiveData(Page.HomePage) + + override val screen: LiveData get() = _screen override val page: LiveData get() = _page - override fun navigateTo(screen: Screen): Boolean { - _screen.postValue(screen) - return true - } - - override fun navigateTo(page: Page): Boolean { - _page.postValue(page) - stack.push(page) + override fun navigateTo(navigable: Navigable, addToBackStack: Boolean): Boolean { + when (navigable) { + is Page -> _page.postValue(navigable) + is Screen -> _screen.postValue(navigable) + } + if (addToBackStack) { + stack.push(navigable) + } else { + stack.push(null) + } return true } override fun navigateBack(): Boolean { - stack.pop() - return if (stack.empty()) { - false + return when (val navigable: Navigable? = popBackStack()) { + is Page -> { + _page.postValue(navigable) + true + } + is Screen -> { + _screen.postValue(navigable) + true + } + else -> false + } + } + + private fun popBackStack(): Navigable? { + return if (stack.isEmpty()) { + null } else { - _page.postValue(stack.peek()) - true + stack.pop() + while (stack.isNotEmpty() && stack.peek() == null) stack.pop() + return if (stack.isNotEmpty()) stack.peek() else null } } } \ No newline at end of file