From f58bf273eb2d7aaedaa81200da9805c9c2e7d74f Mon Sep 17 00:00:00 2001 From: Anmol Verma Date: Tue, 1 Mar 2022 19:30:38 +0530 Subject: [PATCH] wip: setup deps for project with mix of compose and xml ui using nav components. --- app/build.gradle.kts | 2 + .../praxis/di/NavigationModule.kt | 6 +- .../praxis/root/OnboardingActivity.kt | 8 +-- app/src/main/res/layout/main.xml | 18 +++++ .../main/res/layout/view_random_photos.xml | 31 --------- buildSrc/src/main/kotlin/Dependencies.kt | 18 ++++- common/build.gradle.kts | 1 + commonui/build.gradle.kts | 1 + .../src/main/res/navigation/app_nav_graph.xml | 6 ++ navigator/build.gradle.kts | 1 + .../praxis/navigator/NavigationCommand.kt | 14 +++- .../praxis/navigator/Navigator.kt | 66 +++++++++++++++++-- .../ComposeNavigator.kt | 6 +- .../navigators/PraxisFragmentNavigator.kt | 65 ++++++++++++++++++ ui-authentication/build.gradle.kts | 1 + .../praxis/feat/authentication/vm/AuthVM.kt | 8 +-- .../authentication/vm/ForgotPasswordVM.kt | 6 +- .../feat/authentication/vm/AuthVMTest.kt | 12 ++-- ui-onboarding/build.gradle.kts | 1 + .../uionboarding/compose/CommonInputUI.kt | 11 ++-- .../uionboarding/compose/GettingStarted.kt | 10 +-- .../uionboarding/compose/ScreenInputUI.kt | 10 +-- .../uionboarding/compose/SkipTypingScreen.kt | 18 ++--- .../uionboarding/nav/OnboardingNavigation.kt | 12 ++-- 24 files changed, 240 insertions(+), 92 deletions(-) create mode 100644 app/src/main/res/layout/main.xml delete mode 100644 app/src/main/res/layout/view_random_photos.xml create mode 100644 commonui/src/main/res/navigation/app_nav_graph.xml rename navigator/src/main/java/com/mutualmobile/praxis/navigator/{composenavigator => navigators}/ComposeNavigator.kt (90%) create mode 100644 navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/PraxisFragmentNavigator.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5f8997ff..75680efc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -126,6 +126,8 @@ dependencies { Lib.Androidx.list.forEach(::api) Lib.Androidx.Compose.list.forEach(::api) + Lib.Androidx.Navigation.list.forEach(::api) + Lib.ThirdParty.list.forEach(::api) Lib.Accompanist.list.forEach(::api) Lib.Google.list.forEach(::api) diff --git a/app/src/main/java/com/mutualmobile/praxis/di/NavigationModule.kt b/app/src/main/java/com/mutualmobile/praxis/di/NavigationModule.kt index e0e88fc1..cf5b6214 100755 --- a/app/src/main/java/com/mutualmobile/praxis/di/NavigationModule.kt +++ b/app/src/main/java/com/mutualmobile/praxis/di/NavigationModule.kt @@ -1,7 +1,7 @@ package com.mutualmobile.praxis.di -import com.mutualmobile.praxis.navigator.ComposeNavigator -import com.mutualmobile.praxis.navigator.composenavigator.PraxisCloneComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator +import com.mutualmobile.praxis.navigator.navigators.PraxisComposeNavigator import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -14,5 +14,5 @@ abstract class NavigationModule { @Binds @Singleton - abstract fun provideComposeNavigator(praxisComposeNavigator: PraxisCloneComposeNavigator): ComposeNavigator + abstract fun provideComposeNavigator(praxisComposeNavigator: PraxisComposeNavigator): AbsComposeNavigator } diff --git a/app/src/main/java/com/mutualmobile/praxis/root/OnboardingActivity.kt b/app/src/main/java/com/mutualmobile/praxis/root/OnboardingActivity.kt index 243107ab..babfc17b 100644 --- a/app/src/main/java/com/mutualmobile/praxis/root/OnboardingActivity.kt +++ b/app/src/main/java/com/mutualmobile/praxis/root/OnboardingActivity.kt @@ -10,7 +10,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.google.accompanist.insets.ProvideWindowInsets import dagger.hilt.android.AndroidEntryPoint -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.PraxisRoute import com.mutualmobile.praxis.uionboarding.nav.onboardingNavigation import com.praxis.feat.authentication.nav.authNavGraph @@ -20,7 +20,7 @@ import javax.inject.Inject class OnboardingActivity : AppCompatActivity() { @Inject - lateinit var composeNavigator: ComposeNavigator + lateinit var absComposeNavigator: AbsComposeNavigator override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -31,7 +31,7 @@ class OnboardingActivity : AppCompatActivity() { val navController = rememberNavController() LaunchedEffect(Unit) { - composeNavigator.handleNavigationCommands(navController) + absComposeNavigator.handleNavigationCommands(navController) } ProvideWindowInsets(windowInsetsAnimationsEnabled = true) { @@ -40,7 +40,7 @@ class OnboardingActivity : AppCompatActivity() { startDestination = PraxisRoute.OnBoarding.name, ) { onboardingNavigation( - composeNavigator = composeNavigator, + absComposeNavigator = absComposeNavigator, ) authNavGraph() } diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml new file mode 100644 index 00000000..d16c2b28 --- /dev/null +++ b/app/src/main/res/layout/main.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_random_photos.xml b/app/src/main/res/layout/view_random_photos.xml deleted file mode 100644 index a6946780..00000000 --- a/app/src/main/res/layout/view_random_photos.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 81a3a66c..48bade68 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -56,6 +56,22 @@ object Lib { SPLASH_SCREEN_API ) + object Navigation { + private const val nav_version = "2.4.1" + + // Kotlin + private const val NAV_FRAGMENT = "androidx.navigation:navigation-fragment-ktx:$nav_version" + private const val NAV_UI_KTX = "androidx.navigation:navigation-ui-ktx:$nav_version" + + // Feature module Support + private const val NAV_DYNAMIC_MODULES = + "androidx.navigation:navigation-dynamic-features-fragment:$nav_version" + private const val COMPOSE_NAVIGATION = "androidx.navigation:navigation-compose:2.5.0-alpha01" + + val list = listOf(NAV_FRAGMENT, NAV_UI_KTX, NAV_DYNAMIC_MODULES, COMPOSE_NAVIGATION) + + } + object Compose { private const val ACTIVITY_COMPOSE = "androidx.activity:activity-compose:${composeVersion}" private const val CONSTRAINT_LAYOUT_COMPOSE = @@ -66,7 +82,6 @@ object Lib { private const val COMPOSE_MATERIAL = "androidx.compose.material:material:${composeVersion}" private const val COMPOSE_TOOLING = "androidx.compose.ui:ui-tooling-preview:${composeVersion}" private const val COMPOSE_DEBUG_TOOLING = "androidx.compose.ui:ui-tooling:${composeVersion}" - private const val COMPOSE_NAVIGATION = "androidx.navigation:navigation-compose:2.5.0-alpha01" val list = listOf( CONSTRAINT_LAYOUT_COMPOSE, @@ -76,7 +91,6 @@ object Lib { COMPOSE_MATERIAL, COMPOSE_TOOLING, COMPOSE_DEBUG_TOOLING, - COMPOSE_NAVIGATION, ) } } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index e9bdb2fd..292e1051 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { Lib.Androidx.list.forEach(::implementation) Lib.Androidx.Compose.list.forEach(::implementation) + Lib.Androidx.Navigation.list.forEach(::implementation) Lib.ThirdParty.list.forEach(::implementation) Lib.Accompanist.list.forEach(::implementation) Lib.Google.list.forEach(::implementation) diff --git a/commonui/build.gradle.kts b/commonui/build.gradle.kts index 73940cf7..49952713 100644 --- a/commonui/build.gradle.kts +++ b/commonui/build.gradle.kts @@ -47,6 +47,7 @@ dependencies { Lib.Androidx.list.forEach(::implementation) Lib.Androidx.Compose.list.forEach(::implementation) + Lib.Androidx.Navigation.list.forEach(::implementation) Lib.ThirdParty.list.forEach(::implementation) Lib.Accompanist.list.forEach(::implementation) Lib.Google.list.forEach(::implementation) diff --git a/commonui/src/main/res/navigation/app_nav_graph.xml b/commonui/src/main/res/navigation/app_nav_graph.xml new file mode 100644 index 00000000..9dbe92b2 --- /dev/null +++ b/commonui/src/main/res/navigation/app_nav_graph.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/navigator/build.gradle.kts b/navigator/build.gradle.kts index fe83c7e6..fb9fd937 100644 --- a/navigator/build.gradle.kts +++ b/navigator/build.gradle.kts @@ -46,6 +46,7 @@ dependencies { Lib.Androidx.list.forEach(::implementation) Lib.Androidx.Compose.list.forEach(::implementation) + Lib.Androidx.Navigation.list.forEach(::implementation) Lib.ThirdParty.list.forEach(::implementation) Lib.Accompanist.list.forEach(::implementation) Lib.Google.list.forEach(::implementation) diff --git a/navigator/src/main/java/com/mutualmobile/praxis/navigator/NavigationCommand.kt b/navigator/src/main/java/com/mutualmobile/praxis/navigator/NavigationCommand.kt index 2c0b51bb..05e8e700 100644 --- a/navigator/src/main/java/com/mutualmobile/praxis/navigator/NavigationCommand.kt +++ b/navigator/src/main/java/com/mutualmobile/praxis/navigator/NavigationCommand.kt @@ -17,4 +17,16 @@ sealed class ComposeNavigationCommand : NavigationCommand() { ) : ComposeNavigationCommand() data class PopUpToRoute(val route: String, val inclusive: Boolean) : ComposeNavigationCommand() -} \ No newline at end of file +} + +sealed class FragmentNavigationCommand : NavigationCommand() { + data class NavigateToFragmentDestination(val destination: Int, val options: NavOptions? = null) : FragmentNavigationCommand() + data class NavigateUpWithResult( + val key: String, + val result: T, + val destination: Int? = null + ) : FragmentNavigationCommand() + + data class PopUpToDestination(val destination: Int, val inclusive: Boolean) : FragmentNavigationCommand() + +} diff --git a/navigator/src/main/java/com/mutualmobile/praxis/navigator/Navigator.kt b/navigator/src/main/java/com/mutualmobile/praxis/navigator/Navigator.kt index 4c4d7fbe..bd14d081 100644 --- a/navigator/src/main/java/com/mutualmobile/praxis/navigator/Navigator.kt +++ b/navigator/src/main/java/com/mutualmobile/praxis/navigator/Navigator.kt @@ -21,7 +21,7 @@ abstract class Navigator { } -abstract class ComposeNavigator : Navigator() { +abstract class AbsComposeNavigator : Navigator() { abstract fun navigate(route: String, optionsBuilder: (NavOptionsBuilder.() -> Unit)? = null) abstract fun observeResult(key: String, route: String? = null): Flow abstract fun navigateBackWithResult(key: String, result: T, route: String?) @@ -31,8 +31,8 @@ abstract class ComposeNavigator : Navigator() { suspend fun handleNavigationCommands(navController: NavController) { navigationCommands - .onSubscription { this@ComposeNavigator.navControllerFlow.value = navController } - .onCompletion { this@ComposeNavigator.navControllerFlow.value = null } + .onSubscription { this@AbsComposeNavigator.navControllerFlow.value = navController } + .onCompletion { this@AbsComposeNavigator.navControllerFlow.value = null } .collect { navController.handleComposeNavigationCommand(it) } } @@ -72,8 +72,66 @@ abstract class ComposeNavigator : Navigator() { } } +abstract class AbsFragmentNavigatior : Navigator() { + abstract fun navigateFragment( + destination: Int, + optionsBuilder: (NavOptionsBuilder.() -> Unit)? = null + ) + + abstract fun observeResult(key: String, destination: Int? = null): Flow + abstract fun navigateBackWithResult(key: String, result: T, destination: Int?) + + abstract fun popUpTo(destination: Int, inclusive: Boolean) + abstract fun navigateAndClearBackStack(destination: Int) + + suspend fun handleNavigationCommands(navController: NavController) { + navigationCommands + .onSubscription { this@AbsFragmentNavigatior.navControllerFlow.value = navController } + .onCompletion { this@AbsFragmentNavigatior.navControllerFlow.value = null } + .collect { navController.handleFragmentNavigationCommand(it) } + } + + private fun NavController.handleFragmentNavigationCommand(navigationCommand: NavigationCommand) { + when (navigationCommand) { + NavigationCommand.NavigateUp -> navigateUp() + is FragmentNavigationCommand.NavigateUpWithResult<*> -> { + navUpWithResult(navigationCommand) + } + is FragmentNavigationCommand.NavigateToFragmentDestination -> navigate( + navigationCommand.destination, + null, + navigationCommand.options + ) + is FragmentNavigationCommand.PopUpToDestination -> { + popBackStack( + navigationCommand.destination, + navigationCommand.inclusive + ) + } + else -> { + throw RuntimeException("can't handle this with FragmentNavGraphNavigator") + } + } + } + + private fun NavController.navUpWithResult(navigationCommand: FragmentNavigationCommand.NavigateUpWithResult<*>) { + val backStackEntry = + navigationCommand.destination?.let { getBackStackEntry(it) } + ?: previousBackStackEntry + backStackEntry?.savedStateHandle?.set( + navigationCommand.key, + navigationCommand.result + ) + + navigationCommand.destination?.let { + popBackStack(it, false) + } ?: run { + navigateUp() + } + } +} + -@OptIn(DelicateCoroutinesApi::class) fun LiveData.asFlow(): Flow = flow { val channel = Channel(Channel.CONFLATED) val observer = Observer { diff --git a/navigator/src/main/java/com/mutualmobile/praxis/navigator/composenavigator/ComposeNavigator.kt b/navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/ComposeNavigator.kt similarity index 90% rename from navigator/src/main/java/com/mutualmobile/praxis/navigator/composenavigator/ComposeNavigator.kt rename to navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/ComposeNavigator.kt index 4fcebd70..0681b31a 100644 --- a/navigator/src/main/java/com/mutualmobile/praxis/navigator/composenavigator/ComposeNavigator.kt +++ b/navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/ComposeNavigator.kt @@ -1,15 +1,15 @@ -package com.mutualmobile.praxis.navigator.composenavigator +package com.mutualmobile.praxis.navigator.navigators import androidx.navigation.NavOptionsBuilder import androidx.navigation.navOptions import com.mutualmobile.praxis.navigator.ComposeNavigationCommand -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.asFlow import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import javax.inject.Inject -class PraxisCloneComposeNavigator @Inject constructor(): ComposeNavigator() { +class PraxisComposeNavigator @Inject constructor(): AbsComposeNavigator() { override fun navigate(route: String, optionsBuilder: (NavOptionsBuilder.() -> Unit)?) { val options = optionsBuilder?.let { navOptions(it) } diff --git a/navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/PraxisFragmentNavigator.kt b/navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/PraxisFragmentNavigator.kt new file mode 100644 index 00000000..98f43d84 --- /dev/null +++ b/navigator/src/main/java/com/mutualmobile/praxis/navigator/navigators/PraxisFragmentNavigator.kt @@ -0,0 +1,65 @@ +package com.mutualmobile.praxis.navigator.navigators + +import androidx.navigation.NavOptionsBuilder +import androidx.navigation.navOptions +import com.mutualmobile.praxis.navigator.AbsFragmentNavigatior +import com.mutualmobile.praxis.navigator.FragmentNavigationCommand +import com.mutualmobile.praxis.navigator.asFlow +import kotlinx.coroutines.flow.* +import javax.inject.Inject + +class PraxisFragmentNavigator @Inject constructor() : AbsFragmentNavigatior() { + + override fun navigateFragment(destination: Int, optionsBuilder: (NavOptionsBuilder.() -> Unit)?) { + val options = optionsBuilder?.let { navOptions(it) } + navigationCommands.tryEmit( + FragmentNavigationCommand.NavigateToFragmentDestination( + destination, + options + ) + ) + } + + override fun navigateAndClearBackStack(destination: Int) { + navigationCommands.tryEmit( + FragmentNavigationCommand.NavigateToFragmentDestination( + destination, + navOptions { + popUpTo(0) + }) + ) + } + + override fun popUpTo(destination: Int, inclusive: Boolean) { + navigationCommands.tryEmit(FragmentNavigationCommand.PopUpToDestination(destination, inclusive)) + } + + override fun navigateBackWithResult(key: String, result: T, destination: Int?) { + navigationCommands.tryEmit( + FragmentNavigationCommand.NavigateUpWithResult( + key = key, + result = result, + destination = destination + ) + ) + } + + override fun observeResult(key: String, destination: Int?): Flow { + return navControllerFlow + .filterNotNull() + .flatMapLatest { navController -> + val backStackEntry = destination?.let { navController.getBackStackEntry(it) } + ?: navController.currentBackStackEntry + + backStackEntry?.savedStateHandle?.let { savedStateHandle -> + savedStateHandle.getLiveData(key) + .asFlow() + .filter { it != null } + .onEach { + // Nullify the result to avoid resubmitting it + savedStateHandle.set(key, null) + } + } ?: emptyFlow() + } + } +} \ No newline at end of file diff --git a/ui-authentication/build.gradle.kts b/ui-authentication/build.gradle.kts index f976ad7b..4e21435a 100644 --- a/ui-authentication/build.gradle.kts +++ b/ui-authentication/build.gradle.kts @@ -66,6 +66,7 @@ dependencies { Lib.Androidx.list.forEach(::implementation) Lib.Androidx.Compose.list.forEach(::implementation) + Lib.Androidx.Navigation.list.forEach(::implementation) Lib.ThirdParty.list.forEach(::implementation) Lib.Accompanist.list.forEach(::implementation) Lib.Google.list.forEach(::implementation) diff --git a/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/AuthVM.kt b/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/AuthVM.kt index ecb1eaf1..08a59387 100644 --- a/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/AuthVM.kt +++ b/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/AuthVM.kt @@ -4,7 +4,7 @@ import android.net.Uri import androidx.lifecycle.* import com.mutualmobile.praxis.domain.model.StreamingFile import com.mutualmobile.praxis.domain.usecases.FetchRandomPhotoUseCase -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.NavigationKeys import com.mutualmobile.praxis.navigator.PraxisScreen import com.praxis.feat.authentication.ui.exceptions.FormValidationFailed @@ -19,7 +19,7 @@ import javax.inject.Inject @HiltViewModel class AuthVM @Inject constructor( private val savedStateHandle: SavedStateHandle, - private val composeNavigator: ComposeNavigator, + private val absComposeNavigator: AbsComposeNavigator, private val fetchPhotoUseCase: FetchRandomPhotoUseCase ) : ViewModel() { @@ -66,7 +66,7 @@ class AuthVM @Inject constructor( } private fun observePasswordReset() { - composeNavigator.observeResult(NavigationKeys.ForgotPassword).onStart { + absComposeNavigator.observeResult(NavigationKeys.ForgotPassword).onStart { val message = savedStateHandle.get(NavigationKeys.ForgotPassword) message?.let { emit(it) @@ -88,7 +88,7 @@ class AuthVM @Inject constructor( } fun navigateForgotPassword() { - composeNavigator.navigate(PraxisScreen.ForgotPassword.route) + absComposeNavigator.navigate(PraxisScreen.ForgotPassword.route) } fun logout() { diff --git a/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/ForgotPasswordVM.kt b/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/ForgotPasswordVM.kt index 1b9cb21c..01d6fbe2 100644 --- a/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/ForgotPasswordVM.kt +++ b/ui-authentication/src/main/java/com/praxis/feat/authentication/vm/ForgotPasswordVM.kt @@ -2,18 +2,18 @@ package com.praxis.feat.authentication.vm import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.NavigationKeys import com.mutualmobile.praxis.navigator.PraxisScreen import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class ForgotPasswordVM @Inject constructor(private val navigator: ComposeNavigator) : ViewModel() { +class ForgotPasswordVM @Inject constructor(private val navigatorAbs: AbsComposeNavigator) : ViewModel() { var email = mutableStateOf("") fun navigateBack() { - navigator.navigateBackWithResult( + navigatorAbs.navigateBackWithResult( NavigationKeys.ForgotPassword, "Reset Password Done!", PraxisScreen.Auth.route ) diff --git a/ui-authentication/src/test/java/com/praxis/feat/authentication/vm/AuthVMTest.kt b/ui-authentication/src/test/java/com/praxis/feat/authentication/vm/AuthVMTest.kt index cedb7586..6aa9fcfa 100644 --- a/ui-authentication/src/test/java/com/praxis/feat/authentication/vm/AuthVMTest.kt +++ b/ui-authentication/src/test/java/com/praxis/feat/authentication/vm/AuthVMTest.kt @@ -2,7 +2,7 @@ package com.praxis.feat.authentication.vm import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.praxis.feat.authentication.ui.model.LoginForm import io.mockk.MockKAnnotations import io.mockk.coEvery @@ -18,7 +18,7 @@ import org.junit.Test class AuthVMTest { @MockK - lateinit var navigator: ComposeNavigator + lateinit var navigatorAbs: AbsComposeNavigator @MockK private lateinit var savedStateHandle: SavedStateHandle @@ -41,14 +41,14 @@ class AuthVMTest { runTest { launch { coEvery { - navigator.observeResult(any()) + navigatorAbs.observeResult(any()) } returns emptyFlow() coEvery { savedStateHandle.get(any()) } returns "" - authVM = AuthVM(savedStateHandle, navigator) + authVM = AuthVM(savedStateHandle, navigatorAbs) authVM.formUiState.test { assert(awaitItem() is AuthVM.UiState.Empty) @@ -67,14 +67,14 @@ class AuthVMTest { runTest { launch { coEvery { - navigator.observeResult(any()) + navigatorAbs.observeResult(any()) } returns emptyFlow() coEvery { savedStateHandle.get(any()) } returns "" - authVM = AuthVM(savedStateHandle, navigator) + authVM = AuthVM(savedStateHandle, navigatorAbs) authVM.credentials.value = LoginForm("anmol@gmail.com", "sdkfkjkjfdsjkfds") authVM.formUiState.test { diff --git a/ui-onboarding/build.gradle.kts b/ui-onboarding/build.gradle.kts index ced77d9d..a201c546 100644 --- a/ui-onboarding/build.gradle.kts +++ b/ui-onboarding/build.gradle.kts @@ -67,6 +67,7 @@ dependencies { Lib.Androidx.list.forEach(::implementation) Lib.Androidx.Compose.list.forEach(::implementation) + Lib.Androidx.Navigation.list.forEach(::implementation) Lib.ThirdParty.list.forEach(::implementation) Lib.Accompanist.list.forEach(::implementation) Lib.Google.list.forEach(::implementation) diff --git a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/CommonInputUI.kt b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/CommonInputUI.kt index 65592eb2..4f58e355 100644 --- a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/CommonInputUI.kt +++ b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/CommonInputUI.kt @@ -16,13 +16,12 @@ import com.mutualmobile.praxis.commonui.theme.PraxisSurface import com.mutualmobile.praxis.commonui.theme.PraxisTheme import com.mutualmobile.praxis.commonui.theme.PraxisColorProvider import com.mutualmobile.praxis.commonui.theme.PraxisTypography -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.PraxisRoute -import com.mutualmobile.praxis.navigator.PraxisScreen @Composable fun CommonInputUI( - composeNavigator: ComposeNavigator, + absComposeNavigator: AbsComposeNavigator, TopView: @Composable (modifier: Modifier) -> Unit, subtitleText: String ) { @@ -68,7 +67,7 @@ fun CommonInputUI( bottom.linkTo(parent.bottom) start.linkTo(parent.start) end.linkTo(parent.end) - }, composeNavigator) + }, absComposeNavigator) } } } @@ -78,10 +77,10 @@ fun CommonInputUI( } @Composable -fun NextButton(modifier: Modifier = Modifier, composeNavigator: ComposeNavigator) { +fun NextButton(modifier: Modifier = Modifier, absComposeNavigator: AbsComposeNavigator) { Button( onClick = { - composeNavigator.navigate(PraxisRoute.Auth.name) { + absComposeNavigator.navigate(PraxisRoute.Auth.name) { this.popUpTo(PraxisRoute.OnBoarding.name) { this.inclusive = true } diff --git a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/GettingStarted.kt b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/GettingStarted.kt index 270d36b0..8c7bd977 100644 --- a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/GettingStarted.kt +++ b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/GettingStarted.kt @@ -20,12 +20,12 @@ import androidx.compose.ui.unit.dp import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.mutualmobile.praxis.commonui.theme.* -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.PraxisScreen import com.mutualmobile.praxis.uionboarding.R @Composable -fun GettingStartedUI(composeNavigator: ComposeNavigator) { +fun GettingStartedUI(absComposeNavigator: AbsComposeNavigator) { PraxisTheme { val scaffoldState = rememberScaffoldState() val sysUiController = rememberSystemUiController() @@ -58,7 +58,7 @@ fun GettingStartedUI(composeNavigator: ComposeNavigator) { IntroText(modifier = Modifier.padding(top = 12.dp)) CenterImage() Spacer(Modifier.padding(8.dp)) - GetStartedButton(composeNavigator) + GetStartedButton(absComposeNavigator) } } @@ -101,7 +101,7 @@ private fun ImageEnterTransition() = expandIn( @OptIn(ExperimentalAnimationApi::class) @Composable -private fun GetStartedButton(composeNavigator: ComposeNavigator) { +private fun GetStartedButton(absComposeNavigator: AbsComposeNavigator) { var expanded by remember { mutableStateOf(false) } LaunchedEffect(Unit) { @@ -115,7 +115,7 @@ private fun GetStartedButton(composeNavigator: ComposeNavigator) { ) { Button( onClick = { - composeNavigator.navigate(PraxisScreen.SkipTypingScreen.name) + absComposeNavigator.navigate(PraxisScreen.SkipTypingScreen.name) }, Modifier .fillMaxWidth() diff --git a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/ScreenInputUI.kt b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/ScreenInputUI.kt index 11751dd1..0514e148 100644 --- a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/ScreenInputUI.kt +++ b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/ScreenInputUI.kt @@ -3,14 +3,14 @@ package com.mutualmobile.praxis.uionboarding.compose import androidx.compose.runtime.* import androidx.compose.ui.res.stringResource import com.mutualmobile.praxis.commonui.theme.PraxisTheme -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.uionboarding.R @Composable -fun EmailAddressInputUI(composeNavigator: ComposeNavigator) { +fun EmailAddressInputUI(absComposeNavigator: AbsComposeNavigator) { PraxisTheme() { CommonInputUI( - composeNavigator, + absComposeNavigator, { modifier -> EmailInputView(modifier) }, @@ -20,10 +20,10 @@ fun EmailAddressInputUI(composeNavigator: ComposeNavigator) { } @Composable -fun WorkspaceInputUI(composeNavigator: ComposeNavigator) { +fun WorkspaceInputUI(absComposeNavigator: AbsComposeNavigator) { PraxisTheme() { CommonInputUI( - composeNavigator, + absComposeNavigator, { WorkspaceInputView(it) }, diff --git a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/SkipTypingScreen.kt b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/SkipTypingScreen.kt index 15e9e023..213fb5dd 100644 --- a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/SkipTypingScreen.kt +++ b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/compose/SkipTypingScreen.kt @@ -22,12 +22,12 @@ import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.mutualmobile.praxis.commonui.material.PraxisSurfaceAppBar import com.mutualmobile.praxis.commonui.theme.* -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.PraxisScreen import com.mutualmobile.praxis.uionboarding.R @Composable -fun SkipTypingUI(composeNavigator: ComposeNavigator) { +fun SkipTypingUI(absComposeNavigator: AbsComposeNavigator) { PraxisTheme() { val scaffoldState = rememberScaffoldState() val sysUiController = rememberSystemUiController() @@ -46,7 +46,7 @@ fun SkipTypingUI(composeNavigator: ComposeNavigator) { }, navigationIcon = { IconButton(onClick = { - composeNavigator.navigateUp() + absComposeNavigator.navigateUp() }) { Icon( imageVector = Icons.Filled.Clear, @@ -84,9 +84,9 @@ fun SkipTypingUI(composeNavigator: ComposeNavigator) { TitleSubtitleText() Spacer(Modifier.padding(8.dp)) Column { - EmailMeMagicLink(composeNavigator) + EmailMeMagicLink(absComposeNavigator) Box(modifier = Modifier.height(12.dp)) - IWillSignInManually(composeNavigator) + IWillSignInManually(absComposeNavigator) } } @@ -101,10 +101,10 @@ fun SkipTypingUI(composeNavigator: ComposeNavigator) { } @Composable -fun EmailMeMagicLink(composeNavigator: ComposeNavigator) { +fun EmailMeMagicLink(absComposeNavigator: AbsComposeNavigator) { OutlinedButton( onClick = { - composeNavigator.navigate(PraxisScreen.EmailAddressInputUI.name) + absComposeNavigator.navigate(PraxisScreen.EmailAddressInputUI.name) }, border = BorderStroke(1.dp, color = Color.White), colors = ButtonDefaults.buttonColors(backgroundColor = Color.Transparent), @@ -120,10 +120,10 @@ fun EmailMeMagicLink(composeNavigator: ComposeNavigator) { } @Composable -private fun IWillSignInManually(composeNavigator: ComposeNavigator) { +private fun IWillSignInManually(absComposeNavigator: AbsComposeNavigator) { Button( onClick = { - composeNavigator.navigate(PraxisScreen.WorkspaceInputUI.name) + absComposeNavigator.navigate(PraxisScreen.WorkspaceInputUI.name) }, Modifier .fillMaxWidth() diff --git a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/nav/OnboardingNavigation.kt b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/nav/OnboardingNavigation.kt index fd6f075e..8ac0ce43 100644 --- a/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/nav/OnboardingNavigation.kt +++ b/ui-onboarding/src/main/java/com/mutualmobile/praxis/uionboarding/nav/OnboardingNavigation.kt @@ -4,7 +4,7 @@ package com.mutualmobile.praxis.uionboarding.nav import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.navigation -import com.mutualmobile.praxis.navigator.ComposeNavigator +import com.mutualmobile.praxis.navigator.AbsComposeNavigator import com.mutualmobile.praxis.navigator.PraxisRoute import com.mutualmobile.praxis.navigator.PraxisScreen import com.mutualmobile.praxis.uionboarding.compose.EmailAddressInputUI @@ -13,23 +13,23 @@ import com.mutualmobile.praxis.uionboarding.compose.SkipTypingUI import com.mutualmobile.praxis.uionboarding.compose.WorkspaceInputUI fun NavGraphBuilder.onboardingNavigation( - composeNavigator: ComposeNavigator, + absComposeNavigator: AbsComposeNavigator, ) { navigation( startDestination = PraxisScreen.GettingStarted.name, route = PraxisRoute.OnBoarding.name ) { composable(PraxisScreen.GettingStarted.name) { - GettingStartedUI(composeNavigator) + GettingStartedUI(absComposeNavigator) } composable(PraxisScreen.SkipTypingScreen.name) { - SkipTypingUI(composeNavigator) + SkipTypingUI(absComposeNavigator) } composable(PraxisScreen.WorkspaceInputUI.name) { - WorkspaceInputUI(composeNavigator) + WorkspaceInputUI(absComposeNavigator) } composable(PraxisScreen.EmailAddressInputUI.name) { - EmailAddressInputUI(composeNavigator) + EmailAddressInputUI(absComposeNavigator) } }