Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d63a0f2
feat(onboarding): Add OnboardingViewModel tests and improve effect ha…
Mostafa-alsaygh Aug 18, 2025
1c7accb
Refactor: Rename OnboardingEffect.NavigateToWelcome to OnWelcomeNavig…
Mostafa-alsaygh Aug 19, 2025
0b5ee2c
Merge branch 'develop' into add/onboarding-viewmodel-testing
Mostafa-alsaygh Aug 19, 2025
984a869
Branch was auto-updated.
london-bot[bot] Aug 19, 2025
56461c1
Refactor: Use tryToExecute for preference setting
Mostafa-alsaygh Aug 19, 2025
34bb76f
Merge branch 'develop' into add/onboarding-viewmodel-testing
Mostafa-alsaygh Aug 19, 2025
08d78f6
Test: Improve OnboardingViewModelTest stability
Mostafa-alsaygh Aug 19, 2025
7f9d74e
Branch was auto-updated.
london-bot[bot] Aug 19, 2025
0daab8f
Branch was auto-updated.
london-bot[bot] Aug 19, 2025
6642e15
Branch was auto-updated.
london-bot[bot] Aug 20, 2025
314bf48
Merge branch 'develop' into add/onboarding-viewmodel-testing
Mostafa-alsaygh Aug 20, 2025
e74dd19
test(OnboardingViewModel): Advance time in scrollNext test
Mostafa-alsaygh Aug 20, 2025
9cba631
Branch was auto-updated.
london-bot[bot] Aug 20, 2025
6fbe134
test(OnboardingViewModel): Remove redundant comments
Mostafa-alsaygh Aug 20, 2025
e0bdd9a
Merge remote-tracking branch 'origin/add/onboarding-viewmodel-testing…
Mostafa-alsaygh Aug 20, 2025
50a8de6
test(OnboardingViewModel): Replace `advanceTimeBy` with `withTimeout`…
Mostafa-alsaygh Aug 20, 2025
b71f8f0
Merge branch 'develop' into add/onboarding-viewmodel-testing
Mostafa-alsaygh Aug 20, 2025
ccda4b1
test(OnboardingViewModel): Remove unnecessary timeout in scrollNext test
Mostafa-alsaygh Aug 21, 2025
462cbb5
test(OnboardingViewModel): Use advanceUntilIdle in navigateToWelcome …
Mostafa-alsaygh Aug 21, 2025
fddda42
Branch was auto-updated.
london-bot[bot] Aug 21, 2025
061dacd
Branch was auto-updated.
london-bot[bot] Aug 21, 2025
f96219e
Branch was auto-updated.
london-bot[bot] Aug 21, 2025
cb5de3c
Merge remote-tracking branch 'origin/add/onboarding-viewmodel-testing…
Mostafa-alsaygh Aug 21, 2025
df6cda1
Refactor: Rename OnboardingEffect.OnWelcomeNavigation to WelcomeNavig…
Mostafa-alsaygh Aug 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ fun NavGraphBuilder.onboardingNavGraph(
composable<OnBoarding.Welcome> {
WelcomeScreen(
onNavigateLogin = navController::navigateToAuthGraph,
onNavigateContinue = navController::navigateToMainGraph
onNavigateAsGuest = navController::navigateToMainGraph
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,5 @@ interface RecentSearchDao : RecentDao<RecentSearchLocal> {

@Delete
suspend fun delete(item: RecentSearchLocal)

}
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ private fun Content(
) {

BackgroundGradient(
modifier = Modifier.align(Alignment.TopStart).zIndex(2f)
modifier = Modifier
.align(Alignment.TopStart)
.zIndex(2f)
)

TopBar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class EpisodeDetailsViewModel @Inject constructor(
getEpisodeDetails()
}

private fun getEpisodeDetails(){
private fun getEpisodeDetails() {
loadEpisodeDetails()
loadEpisodeRating()
loadVideoProvider()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,10 +181,14 @@ private fun HomeScreenLayout(
homeScreenContract: HomeScreenContract
) {
Box(
modifier = Modifier.fillMaxSize().navBarBottomPadding()
modifier = Modifier
.fillMaxSize()
.navBarBottomPadding()
) {
BackgroundGradient(
modifier = Modifier.align(Alignment.TopStart).zIndex(1f)
modifier = Modifier
.align(Alignment.TopStart)
.zIndex(1f)
)

Column(modifier = Modifier.fillMaxSize()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,7 @@ private fun Content(
shape = RoundedCornerShape(8.dp)
)
.background(color = NovixTheme.colors.iconBackgroundLow)
.clickable(onClick = hideSheet)
,
.clickable(onClick = hideSheet),
contentAlignment = Alignment.Center
) {
Icon(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,11 @@ private fun Content(

Box(
modifier = Modifier.fillMaxSize()
){
) {
BackgroundGradient(
modifier = Modifier.align(Alignment.TopStart).zIndex(1f)
modifier = Modifier
.align(Alignment.TopStart)
.zIndex(1f)
)

Column(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.london.presentation.feature.welcome.onboarding

sealed interface OnboardingEffect {
data object NavigateToWelcome : OnboardingEffect
data object WelcomeNavigation : OnboardingEffect
data class ScrollToPage(val page: Int) : OnboardingEffect
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import com.london.designsystem.theme.NovixTheme
import com.london.designsystem.theme.ThemePreviews
import com.london.designsystem.utils.painter
import com.london.presentation.R
import com.london.presentation.utils.Listen
import kotlinx.coroutines.CoroutineScope

@Composable
Expand All @@ -66,7 +67,19 @@ fun OnboardingScreen(
)

HandlePagerStateChanges(pagerState, viewModel)
HandleEffects(effect, viewModel, pagerState, scope, onComplete)

effect?.Listen { currentEffect ->
when (currentEffect) {
is OnboardingEffect.ScrollToPage -> {
viewModel.scrollToPage(pagerState, currentEffect.page, scope)
}

OnboardingEffect.WelcomeNavigation -> {
viewModel.onboardingFinished()
onComplete()
}
}
}

Box(
modifier = Modifier
Expand All @@ -87,30 +100,6 @@ fun OnboardingScreen(
}
}

@Composable
private fun HandleEffects(
effect: OnboardingEffect?,
viewModel: OnboardingViewModel,
pagerState: PagerState,
scope: CoroutineScope,
onComplete: () -> Unit
) {
LaunchedEffect(effect) {
when (effect) {
is OnboardingEffect.ScrollToPage -> {
viewModel.scrollToPage(pagerState, effect.page, scope)
}

OnboardingEffect.NavigateToWelcome -> {
viewModel.onboardingFinished()
onComplete()
}

null -> {}
}
}
}

@Composable
private fun Content(
pagerState: PagerState,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.london.presentation.feature.welcome.onboarding

import android.util.Log
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.tween
import androidx.compose.foundation.pager.PagerState
import androidx.lifecycle.viewModelScope
import com.london.domain.service.AppPreferencesService
import com.london.presentation.shared.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject

@HiltViewModel
Expand Down Expand Up @@ -51,19 +49,24 @@ class OnboardingViewModel @Inject constructor(

fun navigateToWelcome() {
setOnBoardingShown()
emitEffect(OnboardingEffect.NavigateToWelcome)
emitEffect(OnboardingEffect.WelcomeNavigation)
}

fun onboardingFinished() {
viewModelScope.launch(Dispatchers.IO) {
runCatching { appPreferencesService.setOnBoardingShown() }
.onFailure { Log.e("OnboardingViewModel", "onboardingFinished: ", it) }
Comment thread
yusufnasserdev marked this conversation as resolved.
}
tryToExecute(
block = { appPreferencesService.setOnBoardingShown() },
onError = { errorState ->
Timber.e("Failed to set onboarding shown: $errorState")
}
)
}

private fun setOnBoardingShown() {
viewModelScope.launch(Dispatchers.IO) {
runCatching { appPreferencesService.setOnBoardingShown() }
}
tryToExecute(
block = { appPreferencesService.setOnBoardingShown() },
onError = { errorState ->
Timber.e("Failed to set onboarding shown: $errorState")
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import com.london.presentation.R
@Composable
fun WelcomeScreen(
onNavigateLogin: () -> Unit,
onNavigateContinue: () -> Unit,
onNavigateAsGuest: () -> Unit,
) {

val screenHeight = with(LocalDensity.current) {
Expand All @@ -62,14 +62,14 @@ fun WelcomeScreen(
}
Content(
onNavigateLogin = onNavigateLogin,
onNavigateContinue = onNavigateContinue
onNavigateAsGuest = onNavigateAsGuest
)
}

@Composable
private fun Content(
onNavigateLogin: () -> Unit,
onNavigateContinue: () -> Unit,
onNavigateAsGuest: () -> Unit,
modifier: Modifier = Modifier
) {
Column(
Expand Down Expand Up @@ -118,7 +118,7 @@ private fun Content(

OutlineButton(
text = stringResource(R.string.continue_as_guest),
onClick = onNavigateContinue,
onClick = onNavigateAsGuest,
modifier = Modifier.fillMaxWidth(),
hasLabel = true,
icon = null,
Expand Down Expand Up @@ -171,7 +171,7 @@ private fun WelcomePoster(modifier: Modifier = Modifier) {
@Composable
private fun PreviewWelcomeScreen() {
WelcomeScreen(
onNavigateContinue = {},
onNavigateAsGuest = {},
onNavigateLogin = {}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ fun BuildScreen(
}



(pagingFlow != null) &&
pagingFlow.isEmpty() &&
emptyLayoutMessage.isNotNull() -> {
Expand Down
Loading
Loading