From 8dadcb5e48e596affe3a2d72ed165cad36aa0374 Mon Sep 17 00:00:00 2001 From: Radhika canopas <74301808+cp-radhika-s@users.noreply.github.com> Date: Fri, 9 Feb 2024 11:09:43 +0530 Subject: [PATCH] Refactor navigation (#19) * Minor fix * Refactor navigation * Minor refactoring * Lint fix * Fix test * Minor fix --- .../com/canopas/catchme/ui/MainActivity.kt | 27 ++++++- .../com/canopas/catchme/ui/MainViewModel.kt | 35 ++++++++- .../auth/methods/SignInMethodViewModel.kt | 4 +- .../auth/phone/SignInWithPhoneViewModel.kt | 4 +- .../PhoneVerificationViewModel.kt | 4 +- .../catchme/ui/flow/home/home/HomeScreen.kt | 75 +++--------------- .../ui/flow/home/home/HomeScreenViewModel.kt | 14 ++-- .../catchme/ui/flow/home/map/MapScreen.kt | 26 ++----- .../catchme/ui/flow/home/map/MapViewModel.kt | 18 +++-- .../space/create/CreateSpaceHomeViewModel.kt | 4 +- .../space/create/SpaceInviteCodeViewModel.kt | 4 +- .../home/space/join/JoinSpaceViewModel.kt | 15 +++- .../catchme/ui/flow/intro/IntroViewModel.kt | 30 +------- .../ui/flow/onboard/OnboardViewModel.kt | 12 ++- .../permission/EnablePermissionViewModel.kt | 4 +- .../ui/flow/settings/SettingsViewModel.kt | 10 +-- .../catchme/ui/navigation/AppNavigator.kt | 7 +- .../canopas/catchme/ui/MainViewModelTest.kt | 76 +++++++++++++++++++ .../auth/methods/SignInMethodViewModelTest.kt | 4 +- .../EnablePermissionViewModelTest.kt | 4 +- .../phone/SignInWithPhoneViewModelTest.kt | 4 +- .../PhoneVerificationViewModelTest.kt | 4 +- .../flow/home/home/HomeScreenViewModelTest.kt | 8 +- .../ui/flow/home/map/MapViewModelTest.kt | 4 +- .../create/CreateSpaceHomeViewModelTest.kt | 4 +- .../create/SpaceInviteCodeViewModelTest.kt | 4 +- .../home/space/join/JoinSpaceViewModelTest.kt | 9 ++- .../ui/flow/intro/IntroViewModelTest.kt | 58 +------------- .../ui/flow/onboard/OnboardViewModelTest.kt | 4 +- .../data/models/location/ApiLocation.kt | 5 ++ 30 files changed, 243 insertions(+), 238 deletions(-) create mode 100644 app/src/test/java/com/canopas/catchme/ui/MainViewModelTest.kt diff --git a/app/src/main/java/com/canopas/catchme/ui/MainActivity.kt b/app/src/main/java/com/canopas/catchme/ui/MainActivity.kt index d2ceaac7..1050a195 100644 --- a/app/src/main/java/com/canopas/catchme/ui/MainActivity.kt +++ b/app/src/main/java/com/canopas/catchme/ui/MainActivity.kt @@ -19,8 +19,13 @@ import com.canopas.catchme.ui.flow.auth.phone.EXTRA_RESULT_IS_NEW_USER import com.canopas.catchme.ui.flow.auth.phone.SignInWithPhoneScreen import com.canopas.catchme.ui.flow.auth.verification.PhoneVerificationScreen import com.canopas.catchme.ui.flow.home.home.HomeScreen +import com.canopas.catchme.ui.flow.home.space.create.CreateSpaceHomeScreen +import com.canopas.catchme.ui.flow.home.space.create.SpaceInvite +import com.canopas.catchme.ui.flow.home.space.join.JoinSpaceScreen import com.canopas.catchme.ui.flow.intro.IntroScreen import com.canopas.catchme.ui.flow.onboard.OnboardScreen +import com.canopas.catchme.ui.flow.permission.EnablePermissionsScreen +import com.canopas.catchme.ui.flow.settings.SettingsScreen import com.canopas.catchme.ui.navigation.AppDestinations import com.canopas.catchme.ui.navigation.AppNavigator import com.canopas.catchme.ui.navigation.KEY_RESULT @@ -55,7 +60,7 @@ fun MainApp() { AppNavigator(navController = navController, viewModel.navActions) - NavHost(navController = navController, startDestination = AppDestinations.intro.path) { + NavHost(navController = navController, startDestination = AppDestinations.home.path) { slideComposable(AppDestinations.intro.path) { IntroScreen() } @@ -96,5 +101,25 @@ fun MainApp() { slideComposable(AppDestinations.home.path) { HomeScreen() } + + slideComposable(AppDestinations.createSpace.path) { + CreateSpaceHomeScreen() + } + + slideComposable(AppDestinations.joinSpace.path) { + JoinSpaceScreen() + } + + slideComposable(AppDestinations.SpaceInvitation.path) { + SpaceInvite() + } + + slideComposable(AppDestinations.enablePermissions.path) { + EnablePermissionsScreen() + } + + slideComposable(AppDestinations.settings.path) { + SettingsScreen() + } } } diff --git a/app/src/main/java/com/canopas/catchme/ui/MainViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/MainViewModel.kt index 0042ab20..1cf29050 100644 --- a/app/src/main/java/com/canopas/catchme/ui/MainViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/MainViewModel.kt @@ -1,16 +1,45 @@ package com.canopas.catchme.ui import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.canopas.catchme.data.storage.UserPreferences -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppDestinations +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class MainViewModel @Inject constructor( private val userPreferences: UserPreferences, - appNavigator: MainNavigator + navigator: AppNavigator ) : ViewModel() { - val navActions = appNavigator.navigationChannel + val navActions = navigator.navigationChannel + + init { + viewModelScope.launch { + if (userPreferences.isIntroShown()) { + if (userPreferences.currentUser == null) { + navigator.navigateTo( + AppDestinations.signIn.path, + popUpToRoute = AppDestinations.intro.path, + inclusive = true + ) + } else if (!userPreferences.isOnboardShown()) { + navigator.navigateTo( + AppDestinations.onboard.path, + popUpToRoute = AppDestinations.intro.path, + inclusive = true + ) + } else { + navigator.navigateTo( + AppDestinations.home.path, + popUpToRoute = AppDestinations.intro.path, + inclusive = true + ) + } + } + } + } } diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModel.kt index 1b07739d..0c503487 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModel.kt @@ -7,7 +7,7 @@ import com.canopas.catchme.data.service.auth.FirebaseAuthService import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import com.google.android.gms.auth.api.signin.GoogleSignInAccount import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -18,7 +18,7 @@ import javax.inject.Inject @HiltViewModel class SignInMethodViewModel @Inject constructor( - private val navigator: MainNavigator, + private val navigator: AppNavigator, private val firebaseAuth: FirebaseAuthService, private val authService: AuthService, private val appDispatcher: AppDispatcher, diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModel.kt index 69e30439..a088da00 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModel.kt @@ -9,8 +9,8 @@ import com.canopas.catchme.data.service.auth.PhoneAuthState import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations import com.canopas.catchme.ui.navigation.AppDestinations.OtpVerificationNavigation +import com.canopas.catchme.ui.navigation.AppNavigator import com.canopas.catchme.ui.navigation.KEY_RESULT -import com.canopas.catchme.ui.navigation.MainNavigator import com.canopas.catchme.ui.navigation.RESULT_OKAY import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -21,7 +21,7 @@ import javax.inject.Inject @HiltViewModel class SignInWithPhoneViewModel @Inject constructor( - private val appNavigator: MainNavigator, + private val appNavigator: AppNavigator, private val fbAuthService: FirebaseAuthService, private val authService: AuthService, private val dispatcher: AppDispatcher diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModel.kt index 9f891f18..75fad483 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModel.kt @@ -12,8 +12,8 @@ import com.canopas.catchme.ui.flow.auth.phone.EXTRA_RESULT_IS_NEW_USER import com.canopas.catchme.ui.navigation.AppDestinations import com.canopas.catchme.ui.navigation.AppDestinations.OtpVerificationNavigation.KEY_PHONE_NO import com.canopas.catchme.ui.navigation.AppDestinations.OtpVerificationNavigation.KEY_VERIFICATION_ID +import com.canopas.catchme.ui.navigation.AppNavigator import com.canopas.catchme.ui.navigation.KEY_RESULT -import com.canopas.catchme.ui.navigation.MainNavigator import com.canopas.catchme.ui.navigation.RESULT_OKAY import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -25,7 +25,7 @@ import javax.inject.Inject @HiltViewModel class PhoneVerificationViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - private val appNavigator: MainNavigator, + private val appNavigator: AppNavigator, private val firebaseAuth: FirebaseAuthService, private val authService: AuthService, private val dispatcher: AppDispatcher diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreen.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreen.kt index 84dc401a..8c8fa0a1 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreen.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreen.kt @@ -1,12 +1,9 @@ package com.canopas.catchme.ui.flow.home.home import androidx.annotation.DrawableRes -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween -import androidx.compose.animation.slideInVertically -import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope @@ -23,10 +20,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -40,7 +34,6 @@ import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost -import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.canopas.catchme.R import com.canopas.catchme.data.utils.isBackgroundLocationPermissionGranted @@ -50,14 +43,7 @@ import com.canopas.catchme.ui.flow.home.home.component.SpaceSelectionMenu import com.canopas.catchme.ui.flow.home.home.component.SpaceSelectionPopup import com.canopas.catchme.ui.flow.home.map.MapScreen import com.canopas.catchme.ui.flow.home.places.PlacesScreen -import com.canopas.catchme.ui.flow.home.space.create.CreateSpaceHomeScreen -import com.canopas.catchme.ui.flow.home.space.create.SpaceInvite -import com.canopas.catchme.ui.flow.home.space.join.JoinSpaceScreen -import com.canopas.catchme.ui.flow.permission.EnablePermissionsScreen -import com.canopas.catchme.ui.flow.settings.SettingsScreen import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.AppNavigator -import com.canopas.catchme.ui.navigation.slideComposable import com.canopas.catchme.ui.navigation.tabComposable import com.canopas.catchme.ui.theme.AppTheme @@ -73,21 +59,6 @@ fun HomeScreen() { } } - AppNavigator(navController = navController, viewModel.navActions) - val navBackStackEntry by navController.currentBackStackEntryAsState() - - val showTopBar by remember { - derivedStateOf { - showSpaceTopBarOn.contains(navBackStackEntry?.destination?.route) - } - } - - val hideBottomBar by remember { - derivedStateOf { - hideBottomBarOn.contains(navBackStackEntry?.destination?.route) - } - } - Scaffold( containerColor = AppTheme.colorScheme.surface, content = { @@ -97,24 +68,18 @@ fun HomeScreen() { ) { HomeScreenContent(navController) - AnimatedVisibility( - visible = showTopBar, - enter = slideInVertically { -it }, - exit = slideOutVertically { -it } - ) { - HomeTopBar() - } + HomeTopBar() } } - /* bottomBar = { - AnimatedVisibility( - visible = !hideBottomBar, - enter = slideInVertically(tween(100)) { it }, - exit = slideOutVertically(tween(100)) { it } - ) { - HomeBottomBar(navController) - } - }*/ + /* bottomBar = { + AnimatedVisibility( + visible = !hideBottomBar, + enter = slideInVertically(tween(100)) { it }, + exit = slideOutVertically(tween(100)) { it } + ) { + HomeBottomBar(navController) + } + }*/ ) } @@ -224,26 +189,6 @@ fun HomeScreenContent(navController: NavHostController) { tabComposable(AppDestinations.activity.path) { ActivityScreen() } - - slideComposable(AppDestinations.createSpace.path) { - CreateSpaceHomeScreen() - } - - slideComposable(AppDestinations.joinSpace.path) { - JoinSpaceScreen() - } - - slideComposable(AppDestinations.SpaceInvitation.path) { - SpaceInvite() - } - - slideComposable(AppDestinations.enablePermissions.path) { - EnablePermissionsScreen() - } - - slideComposable(AppDestinations.settings.path) { - SettingsScreen() - } } } diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModel.kt index eba3d8a7..089a702d 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModel.kt @@ -9,8 +9,7 @@ import com.canopas.catchme.data.service.location.LocationManager import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.HomeNavigator -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -21,8 +20,7 @@ import javax.inject.Inject @HiltViewModel class HomeScreenViewModel @Inject constructor( - private val navigator: HomeNavigator, - private val mainNavigator: MainNavigator, + private val navigator: AppNavigator, private val locationManager: LocationManager, private val spaceRepository: SpaceRepository, private val userPreferences: UserPreferences, @@ -36,15 +34,17 @@ class HomeScreenViewModel @Inject constructor( val state: StateFlow = _state init { - updateUser() - getAllSpaces() + if (userPreferences.currentUser != null) { + updateUser() + getAllSpaces() + } } private fun updateUser() = viewModelScope.launch(appDispatcher.IO) { val user = authService.getUser() if (user == null) { authService.signOut() - mainNavigator.navigateTo( + navigator.navigateTo( AppDestinations.signIn.path, AppDestinations.home.path, true diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt index c69b6b60..7f58464e 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt @@ -148,26 +148,14 @@ fun MapScreenContent(modifier: Modifier) { } } - LaunchedEffect(userLocation, state.selectedUser) { - if (state.selectedUser != null) { - val location = state.selectedUser?.location - if (location != null) { - val latLng = LatLng(location.latitude, location.longitude) - cameraPositionState.animate( - CameraUpdateFactory.newLatLngZoom( - latLng, - DEFAULT_CAMERA_ZOOM_FOR_SELECTED_USER - ) - ) - } - } else { - cameraPositionState.animate( - CameraUpdateFactory.newLatLngZoom( - userLocation, - DEFAULT_CAMERA_ZOOM - ) + LaunchedEffect(userLocation) { + val location = state.selectedUser?.location + cameraPositionState.animate( + CameraUpdateFactory.newLatLngZoom( + userLocation, + if (location != null) DEFAULT_CAMERA_ZOOM_FOR_SELECTED_USER else DEFAULT_CAMERA_ZOOM ) - } + ) } Box(modifier = modifier.fillMaxSize()) { diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt index 74c069ea..46aead10 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt @@ -3,13 +3,14 @@ package com.canopas.catchme.ui.flow.home.map import android.location.Location import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.canopas.catchme.data.models.location.toLocation import com.canopas.catchme.data.models.user.UserInfo import com.canopas.catchme.data.repository.SpaceRepository import com.canopas.catchme.data.service.location.LocationManager import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow @@ -26,7 +27,7 @@ class MapViewModel @Inject constructor( private val userPreferences: UserPreferences, private val locationManager: LocationManager, private val appDispatcher: AppDispatcher, - private val navigator: HomeNavigator + private val navigator: AppNavigator ) : ViewModel() { private val _state = MutableStateFlow(MapScreenState()) @@ -50,11 +51,9 @@ class MapViewModel @Inject constructor( private fun listenMemberLocation() { locationJob = viewModelScope.launch(appDispatcher.IO) { spaceRepository.getMemberWithLocation().collectLatest { - val currentLocation = locationManager.getLastLocation() _state.emit( _state.value.copy( - members = it, - defaultCameraPosition = currentLocation + members = it ) ) } @@ -66,7 +65,14 @@ class MapViewModel @Inject constructor( if (selectedUser != null && selectedUser.user.id == userInfo.user.id) { dismissMemberDetail() } else { - _state.emit(_state.value.copy(selectedUser = userInfo, showUserDetails = true)) + val selectedLocation = userInfo.location?.toLocation() + _state.emit( + _state.value.copy( + selectedUser = userInfo, + defaultCameraPosition = selectedLocation, + showUserDetails = true + ) + ) } } diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModel.kt index e79c5f80..d3b3a508 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.viewModelScope import com.canopas.catchme.data.repository.SpaceRepository import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -15,7 +15,7 @@ import javax.inject.Inject @HiltViewModel class CreateSpaceHomeViewModel @Inject constructor( - private val appNavigator: HomeNavigator, + private val appNavigator: AppNavigator, private val spaceRepository: SpaceRepository, private val appDispatcher: AppDispatcher ) : ViewModel() { diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModel.kt index d8ae03e7..5563b3b0 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModel.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import com.canopas.catchme.ui.navigation.AppDestinations.SpaceInvitation.KEY_INVITE_CODE import com.canopas.catchme.ui.navigation.AppDestinations.SpaceInvitation.KEY_SPACE_NAME -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class SpaceInviteCodeViewModel @Inject constructor( - private val appNavigator: HomeNavigator, + private val appNavigator: AppNavigator, private val savedStateHandle: SavedStateHandle ) : ViewModel() { diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModel.kt index 354999ad..cef092fa 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModel.kt @@ -4,9 +4,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.canopas.catchme.data.models.space.ApiSpace import com.canopas.catchme.data.repository.SpaceRepository +import com.canopas.catchme.data.service.auth.AuthService import com.canopas.catchme.data.service.space.SpaceInvitationService import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -16,10 +17,11 @@ import javax.inject.Inject @HiltViewModel class JoinSpaceViewModel @Inject constructor( - private val appNavigator: HomeNavigator, + private val appNavigator: AppNavigator, private val appDispatcher: AppDispatcher, private val invitationService: SpaceInvitationService, - private val spaceRepository: SpaceRepository + private val spaceRepository: SpaceRepository, + private val authService: AuthService ) : ViewModel() { private val _state = MutableStateFlow(JoinSpaceState()) @@ -49,6 +51,13 @@ class JoinSpaceViewModel @Inject constructor( } val spaceId = invitation.space_id + val joinedSpaces = authService.currentUser?.space_ids ?: emptyList() + + if (spaceId in joinedSpaces) { + popBackStack() + return@launch + } + spaceRepository.joinSpace(spaceId) val space = spaceRepository.getSpace(spaceId) diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/intro/IntroViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/intro/IntroViewModel.kt index a56976b4..ce2a4bbd 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/intro/IntroViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/intro/IntroViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -12,35 +12,9 @@ import javax.inject.Inject @HiltViewModel class IntroViewModel @Inject constructor( private val userPreferences: UserPreferences, - private val navigator: MainNavigator + private val navigator: AppNavigator ) : ViewModel() { - init { - viewModelScope.launch { - if (userPreferences.isIntroShown()) { - if (userPreferences.currentUser == null) { - navigator.navigateTo( - AppDestinations.signIn.path, - popUpToRoute = AppDestinations.intro.path, - inclusive = true - ) - } else if (!userPreferences.isOnboardShown()) { - navigator.navigateTo( - AppDestinations.onboard.path, - popUpToRoute = AppDestinations.intro.path, - inclusive = true - ) - } else { - navigator.navigateTo( - AppDestinations.home.path, - popUpToRoute = AppDestinations.intro.path, - inclusive = true - ) - } - } - } - } - fun completedIntro() = viewModelScope.launch { userPreferences.setIntroShown(true) navigator.navigateTo( diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModel.kt index 81909f42..76697165 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModel.kt @@ -9,7 +9,7 @@ import com.canopas.catchme.data.service.space.SpaceInvitationService import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -23,7 +23,7 @@ class OnboardViewModel @Inject constructor( private val appDispatcher: AppDispatcher, private val spaceRepository: SpaceRepository, private val userPreferences: UserPreferences, - private val navigator: MainNavigator, + private val navigator: AppNavigator, private val invitationService: SpaceInvitationService ) : ViewModel() { @@ -133,6 +133,12 @@ class OnboardViewModel @Inject constructor( } val space = spaceRepository.getSpace(invitation.space_id) + val joinedSpaces = currentUser?.space_ids ?: emptyList() + + if (space != null && space.id in joinedSpaces) { + navigateToHome() + return@launch + } if (space != null) { spaceRepository.joinSpace(invitation.space_id) @@ -172,6 +178,7 @@ class OnboardViewModel @Inject constructor( fun resetErrorState() { _state.value = _state.value.copy( error = null, + alreadySpaceMember = false, errorInvalidInviteCode = false ) } @@ -197,6 +204,7 @@ data class OnboardScreenState( val creatingSpace: Boolean = false, val verifyingInviteCode: Boolean = false, val errorInvalidInviteCode: Boolean = false, + val alreadySpaceMember: Boolean = false, val error: String? = null ) diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/permission/EnablePermissionViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/permission/EnablePermissionViewModel.kt index 00c90fd0..0a453c13 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/permission/EnablePermissionViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/permission/EnablePermissionViewModel.kt @@ -1,13 +1,13 @@ package com.canopas.catchme.ui.flow.permission import androidx.lifecycle.ViewModel -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class EnablePermissionViewModel @Inject constructor( - private val appNavigator: HomeNavigator + private val appNavigator: AppNavigator ) : ViewModel() { fun popBack() { diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/settings/SettingsViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/settings/SettingsViewModel.kt index a92fbd83..e18ddb5f 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/settings/SettingsViewModel.kt @@ -7,8 +7,7 @@ import com.canopas.catchme.data.repository.SpaceRepository import com.canopas.catchme.data.service.auth.AuthService import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations -import com.canopas.catchme.ui.navigation.HomeNavigator -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -17,8 +16,7 @@ import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( - private val navigator: HomeNavigator, - private val appNavigator: MainNavigator, + private val navigator: AppNavigator, private val authService: AuthService, private val appDispatcher: AppDispatcher, private val spaceRepository: SpaceRepository @@ -58,7 +56,7 @@ class SettingsViewModel @Inject constructor( fun signOutUser() = viewModelScope.launch(appDispatcher.IO) { _state.emit(_state.value.copy(signingOut = true, openSignOutDialog = false)) authService.signOut() - appNavigator.navigateTo( + navigator.navigateTo( AppDestinations.signIn.path, AppDestinations.home.path, true @@ -70,7 +68,7 @@ class SettingsViewModel @Inject constructor( _state.emit(_state.value.copy(deletingAccount = true, openDeleteAccountDialog = false)) spaceRepository.deleteUserSpaces() authService.deleteAccount() - appNavigator.navigateTo( + navigator.navigateTo( AppDestinations.signIn.path, AppDestinations.home.path, true diff --git a/app/src/main/java/com/canopas/catchme/ui/navigation/AppNavigator.kt b/app/src/main/java/com/canopas/catchme/ui/navigation/AppNavigator.kt index 64c34cb0..171edc8e 100644 --- a/app/src/main/java/com/canopas/catchme/ui/navigation/AppNavigator.kt +++ b/app/src/main/java/com/canopas/catchme/ui/navigation/AppNavigator.kt @@ -15,12 +15,7 @@ const val RESULT_OKAY = 1 const val RESULT_CANCEL = 0 @Singleton -class HomeNavigator @Inject constructor() : AppNavigator() - -@Singleton -class MainNavigator @Inject constructor() : AppNavigator() - -abstract class AppNavigator { +class AppNavigator @Inject constructor() { private val _navigationChannel = MutableSharedFlow(extraBufferCapacity = 1) diff --git a/app/src/test/java/com/canopas/catchme/ui/MainViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/MainViewModelTest.kt new file mode 100644 index 00000000..e69be705 --- /dev/null +++ b/app/src/test/java/com/canopas/catchme/ui/MainViewModelTest.kt @@ -0,0 +1,76 @@ +package com.canopas.catchme.ui +import com.canopas.catchme.MainCoroutineRule +import com.canopas.catchme.data.storage.UserPreferences +import com.canopas.catchme.ui.navigation.AppNavigator +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +@ExperimentalCoroutinesApi +class MainViewModelTest { + @get:Rule + val coroutineRule = MainCoroutineRule() + + private lateinit var viewModel: MainViewModel + + private val userPreferences = mock() + private val navigator = mock() + + @Test + fun `should navigate to sign-in screen if intro is shown and current user is null`() = runTest { + whenever(userPreferences.isIntroShown()).thenReturn(true) + whenever(userPreferences.currentUser).thenReturn(null) + viewModel = MainViewModel(userPreferences, navigator) + verify(navigator).navigateTo( + "sign-in", + popUpToRoute = "intro", + inclusive = true + ) + } + + @Test + fun `should navigate to home screen if intro is shown`() = runTest { + whenever(userPreferences.isIntroShown()).thenReturn(true) + whenever(userPreferences.currentUser).thenReturn(mock()) + whenever(userPreferences.isOnboardShown()).thenReturn(true) + + viewModel = MainViewModel(userPreferences, navigator) + verify(navigator).navigateTo( + "home", + popUpToRoute = "intro", + inclusive = true + ) + } + + @Test + fun `should navigate to onboard screen if onboard is not shown`() = runTest { + whenever(userPreferences.currentUser).thenReturn(mock()) + whenever(userPreferences.isIntroShown()).thenReturn(true) + whenever(userPreferences.isOnboardShown()).thenReturn(false) + viewModel = MainViewModel(userPreferences, navigator) + verify(navigator).navigateTo( + "onboard", + popUpToRoute = "intro", + inclusive = true + ) + } + + @Test + fun `should not navigate to onboard screen if onboard is shown`() = runTest { + whenever(userPreferences.currentUser).thenReturn(mock()) + whenever(userPreferences.isIntroShown()).thenReturn(true) + whenever(userPreferences.isOnboardShown()).thenReturn(true) + + viewModel = MainViewModel(userPreferences, navigator) + verify(navigator, times(0)).navigateTo( + "onboard", + popUpToRoute = "intro", + inclusive = true + ) + } +} diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModelTest.kt index db5b8aa0..83ec3e65 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/auth/methods/SignInMethodViewModelTest.kt @@ -5,7 +5,7 @@ import com.canopas.catchme.data.service.auth.AuthService import com.canopas.catchme.data.service.auth.FirebaseAuthService import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import com.google.android.gms.auth.api.signin.GoogleSignInAccount import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -30,7 +30,7 @@ class SignInMethodViewModelTest { private lateinit var viewModel: SignInMethodViewModel - private val navigator = mock() + private val navigator = mock() private val firebaseAuth = mock() private val authService = mock() private val userPreferences = mock() diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/auth/permission/EnablePermissionViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/auth/permission/EnablePermissionViewModelTest.kt index 27b0886a..bb2d33c3 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/auth/permission/EnablePermissionViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/auth/permission/EnablePermissionViewModelTest.kt @@ -1,14 +1,14 @@ package com.canopas.catchme.ui.flow.auth.permission import com.canopas.catchme.ui.flow.permission.EnablePermissionViewModel -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import org.junit.Test import org.mockito.kotlin.mock import org.mockito.kotlin.verify class EnablePermissionViewModelTest { - private val appNavigator = mock() + private val appNavigator = mock() private val viewModel = EnablePermissionViewModel(appNavigator) diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModelTest.kt index 171bf7a0..1edcb102 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/auth/phone/SignInWithPhoneViewModelTest.kt @@ -6,7 +6,7 @@ import com.canopas.catchme.data.service.auth.AuthService import com.canopas.catchme.data.service.auth.FirebaseAuthService import com.canopas.catchme.data.service.auth.PhoneAuthState import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import com.google.firebase.FirebaseException import com.google.firebase.auth.PhoneAuthCredential import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -30,7 +30,7 @@ class SignInWithPhoneViewModelTest { private lateinit var viewModel: SignInWithPhoneViewModel - private val navigator = mock() + private val navigator = mock() private val firebaseAuth = mock() private val authService = mock() diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModelTest.kt index c533a636..7b4383cc 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/auth/verification/PhoneVerificationViewModelTest.kt @@ -9,7 +9,7 @@ import com.canopas.catchme.data.service.auth.PhoneAuthState import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.navigation.AppDestinations.OtpVerificationNavigation.KEY_PHONE_NO import com.canopas.catchme.ui.navigation.AppDestinations.OtpVerificationNavigation.KEY_VERIFICATION_ID -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import com.google.firebase.auth.PhoneAuthCredential import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -37,7 +37,7 @@ class PhoneVerificationViewModelTest { private lateinit var viewModel: PhoneVerificationViewModel - private val navigator = mock() + private val navigator = mock() private val firebaseAuth = mock() private val authService = mock() private val savedStateHandle = mock() diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModelTest.kt index 2572c07b..69b9cf68 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/home/home/HomeScreenViewModelTest.kt @@ -13,8 +13,7 @@ import com.canopas.catchme.data.utils.AppDispatcher import com.canopas.catchme.ui.flow.home.home.HomeViewModelTestData.space_info1 import com.canopas.catchme.ui.flow.home.home.HomeViewModelTestData.space_info2 import com.canopas.catchme.ui.flow.home.home.HomeViewModelTestData.user1 -import com.canopas.catchme.ui.navigation.HomeNavigator -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay @@ -47,8 +46,7 @@ class HomeScreenViewModelTest { @get:Rule val coroutineRule = MainCoroutineRule() - private val navigator = mock() - private val mainNavigator = mock() + private val navigator = mock() private val locationManager = mock() private val spaceRepository = mock() private val userPreferences = mock() @@ -59,9 +57,9 @@ class HomeScreenViewModelTest { private lateinit var viewModel: HomeScreenViewModel private fun setUp() { + whenever(userPreferences.currentUser).thenReturn(user1) viewModel = HomeScreenViewModel( navigator = navigator, - mainNavigator = mainNavigator, locationManager = locationManager, spaceRepository = spaceRepository, userPreferences = userPreferences, diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/home/map/MapViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/home/map/MapViewModelTest.kt index bd0c8032..50b7d077 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/home/map/MapViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/home/map/MapViewModelTest.kt @@ -8,7 +8,7 @@ import com.canopas.catchme.data.repository.SpaceRepository import com.canopas.catchme.data.service.location.LocationManager import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay @@ -33,7 +33,7 @@ class MapViewModelTest { private val spaceRepository = mock() private val userPreferences = mock() private val locationManager = mock() - private val navigator = mock() + private val navigator = mock() private val testDispatcher = AppDispatcher(IO = UnconfinedTestDispatcher()) private lateinit var viewModel: MapViewModel diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModelTest.kt index 23a0ae73..ee207460 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/CreateSpaceHomeViewModelTest.kt @@ -3,7 +3,7 @@ package com.canopas.catchme.ui.flow.home.space.create import com.canopas.catchme.MainCoroutineRule import com.canopas.catchme.data.repository.SpaceRepository import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -21,7 +21,7 @@ class CreateSpaceHomeViewModelTest { private val spaceRepository = mock() private val testDispatcher = AppDispatcher(IO = UnconfinedTestDispatcher()) - private val appNavigator = mock() + private val appNavigator = mock() private lateinit var viewModel: CreateSpaceHomeViewModel diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModelTest.kt index 37bd9d6f..150691de 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/home/space/create/SpaceInviteCodeViewModelTest.kt @@ -3,7 +3,7 @@ package com.canopas.catchme.ui.flow.home.space.create import androidx.lifecycle.SavedStateHandle import com.canopas.catchme.ui.navigation.AppDestinations import com.canopas.catchme.ui.navigation.AppDestinations.SpaceInvitation.KEY_INVITE_CODE -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import org.junit.Test import org.mockito.kotlin.mock import org.mockito.kotlin.verify @@ -12,7 +12,7 @@ import org.mockito.kotlin.whenever class SpaceInviteCodeViewModelTest { private val savedStateHandle = mock() - private val appNavigator = mock() + private val appNavigator = mock() @Test fun `popBackStack should call navigateBack on appNavigator`() { diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModelTest.kt index 5e930196..d5e508a4 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/home/space/join/JoinSpaceViewModelTest.kt @@ -4,9 +4,10 @@ import com.canopas.catchme.MainCoroutineRule import com.canopas.catchme.data.models.space.ApiSpace import com.canopas.catchme.data.models.space.ApiSpaceInvitation import com.canopas.catchme.data.repository.SpaceRepository +import com.canopas.catchme.data.service.auth.AuthService import com.canopas.catchme.data.service.space.SpaceInvitationService import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.HomeNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay @@ -28,7 +29,8 @@ class JoinSpaceViewModelTest { val coroutineRule = MainCoroutineRule() private val spaceRepository = mock() - private val appNavigator = mock() + private val appNavigator = mock() + private val authService = mock() private val invitationService = mock() private val testDispatcher = AppDispatcher(IO = UnconfinedTestDispatcher()) @@ -41,7 +43,8 @@ class JoinSpaceViewModelTest { appNavigator = appNavigator, appDispatcher = testDispatcher, invitationService = invitationService, - spaceRepository = spaceRepository + spaceRepository = spaceRepository, + authService = authService ) } diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/intro/IntroViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/intro/IntroViewModelTest.kt index 7d473cff..54dc5320 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/intro/IntroViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/intro/IntroViewModelTest.kt @@ -2,13 +2,12 @@ package com.canopas.catchme.ui.flow.intro import com.canopas.catchme.MainCoroutineRule import com.canopas.catchme.data.storage.UserPreferences -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test import org.mockito.kotlin.mock -import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @@ -20,60 +19,7 @@ class IntroViewModelTest { private lateinit var viewModel: IntroViewModel private val userPreferences = mock() - private val navigator = mock() - - @Test - fun `should navigate to sign-in screen if intro is shown and current user is null`() = runTest { - whenever(userPreferences.isIntroShown()).thenReturn(true) - whenever(userPreferences.currentUser).thenReturn(null) - viewModel = IntroViewModel(userPreferences, navigator) - verify(navigator).navigateTo( - "sign-in", - popUpToRoute = "intro", - inclusive = true - ) - } - - @Test - fun `should navigate to home screen if intro is shown`() = runTest { - whenever(userPreferences.isIntroShown()).thenReturn(true) - whenever(userPreferences.currentUser).thenReturn(mock()) - whenever(userPreferences.isOnboardShown()).thenReturn(true) - - viewModel = IntroViewModel(userPreferences, navigator) - verify(navigator).navigateTo( - "home", - popUpToRoute = "intro", - inclusive = true - ) - } - - @Test - fun `should navigate to onboard screen if onboard is not shown`() = runTest { - whenever(userPreferences.currentUser).thenReturn(mock()) - whenever(userPreferences.isIntroShown()).thenReturn(true) - whenever(userPreferences.isOnboardShown()).thenReturn(false) - viewModel = IntroViewModel(userPreferences, navigator) - verify(navigator).navigateTo( - "onboard", - popUpToRoute = "intro", - inclusive = true - ) - } - - @Test - fun `should not navigate to onboard screen if onboard is shown`() = runTest { - whenever(userPreferences.currentUser).thenReturn(mock()) - whenever(userPreferences.isIntroShown()).thenReturn(true) - whenever(userPreferences.isOnboardShown()).thenReturn(true) - - viewModel = IntroViewModel(userPreferences, navigator) - verify(navigator, times(0)).navigateTo( - "onboard", - popUpToRoute = "intro", - inclusive = true - ) - } + private val navigator = mock() @Test fun `completedIntro should set IntroShown to true`() = runTest { diff --git a/app/src/test/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModelTest.kt b/app/src/test/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModelTest.kt index 50653174..dd91c506 100644 --- a/app/src/test/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModelTest.kt +++ b/app/src/test/java/com/canopas/catchme/ui/flow/onboard/OnboardViewModelTest.kt @@ -9,7 +9,7 @@ import com.canopas.catchme.data.service.auth.AuthService import com.canopas.catchme.data.service.space.SpaceInvitationService import com.canopas.catchme.data.storage.UserPreferences import com.canopas.catchme.data.utils.AppDispatcher -import com.canopas.catchme.ui.navigation.MainNavigator +import com.canopas.catchme.ui.navigation.AppNavigator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay @@ -36,7 +36,7 @@ class OnboardViewModelTest { private val userService = mock() private val userPreferences = mock() private val spaceRepository = mock() - private val navigator = mock() + private val navigator = mock() private val invitationService = mock() private val testDispatcher = AppDispatcher(IO = UnconfinedTestDispatcher()) diff --git a/data/src/main/java/com/canopas/catchme/data/models/location/ApiLocation.kt b/data/src/main/java/com/canopas/catchme/data/models/location/ApiLocation.kt index d7e758f6..694d1dea 100644 --- a/data/src/main/java/com/canopas/catchme/data/models/location/ApiLocation.kt +++ b/data/src/main/java/com/canopas/catchme/data/models/location/ApiLocation.kt @@ -11,3 +11,8 @@ data class ApiLocation( val longitude: Double = 0.0, val created_at: Long? = System.currentTimeMillis() ) + +fun ApiLocation.toLocation() = android.location.Location("").apply { + latitude = this@toLocation.latitude + longitude = this@toLocation.longitude +}