From 2592c41e439b3961944e099b8ce0b162c1b882e7 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Thu, 22 Jan 2026 23:21:30 +0900 Subject: [PATCH 1/2] feat: Define nested navigation --- .../auth/ui/navigation/NavDestination.kt | 12 +++++++----- .../auth/ui/navigation/NavigationEntryProvider.kt | 14 +++++++------- .../infomaniak/auth/ui/screen/main/MainScreen.kt | 2 +- .../complete/OnboardingCompleteScreen.kt} | 8 ++++---- .../{ => start}/CrossAppLoginViewModel.kt | 2 +- .../OnboardingStartPage.kt} | 7 ++----- .../OnboardingStartScreen.kt} | 12 ++++++------ 7 files changed, 28 insertions(+), 29 deletions(-) rename app/src/main/kotlin/com/infomaniak/auth/ui/screen/{ready/ReadyScreen.kt => onboarding/complete/OnboardingCompleteScreen.kt} (93%) rename app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/{ => start}/CrossAppLoginViewModel.kt (95%) rename app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/{OnboardingPage.kt => start/OnboardingStartPage.kt} (95%) rename app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/{OnboardingScreen.kt => start/OnboardingStartScreen.kt} (96%) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt index 23de4fa..a0ef0b3 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt @@ -25,12 +25,14 @@ sealed interface NavDestination : NavKey { @Serializable data object Home : NavDestination - @Serializable - data object Onboarding : NavDestination + sealed interface Onboarding : NavDestination { + @Serializable + data object Start : Onboarding - @Serializable - data object SecuringAccount : NavDestination + @Serializable + data object Complete : NavDestination + } @Serializable - data object Ready : NavDestination + data object SecuringAccount : NavDestination } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt index ef73307..f6ffbe2 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt @@ -22,27 +22,27 @@ import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import com.infomaniak.auth.ui.screen.home.HomeScreen -import com.infomaniak.auth.ui.screen.onboarding.OnboardingScreen -import com.infomaniak.auth.ui.screen.ready.ReadyScreen +import com.infomaniak.auth.ui.screen.onboarding.complete.OnboardingCompleteScreen +import com.infomaniak.auth.ui.screen.onboarding.start.OnboardingStartScreen import com.infomaniak.auth.ui.screen.securingaccount.SecuringAccountScreen fun baseEntryProvider(backStack: NavBackStack): (NavKey) -> NavEntry = entryProvider { entry { HomeScreen() } - entry { - OnboardingScreen( + entry { + OnboardingStartScreen( onLogin = { backStack.add(NavDestination.SecuringAccount) }, onCreateAccount = {} ) } entry { SecuringAccountScreen( - onFinish = { backStack.add(NavDestination.Ready) } + onFinish = { backStack.add(NavDestination.Onboarding.Complete) } ) } - entry { - ReadyScreen( + entry { + OnboardingCompleteScreen( navigateToHome = { backStack.clear() backStack.add(NavDestination.Home) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt index 6474bd3..5c0da5c 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt @@ -28,7 +28,7 @@ import com.infomaniak.auth.ui.navigation.baseEntryProvider @Composable fun MainScreen() { // TODO: will change when back give the result of account status - val startDestination = if (true) NavDestination.Onboarding else NavDestination.Home + val startDestination = if (true) NavDestination.Onboarding.Start else NavDestination.Home val backStack = rememberNavBackStack(startDestination) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/ready/ReadyScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/complete/OnboardingCompleteScreen.kt similarity index 93% rename from app/src/main/kotlin/com/infomaniak/auth/ui/screen/ready/ReadyScreen.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/complete/OnboardingCompleteScreen.kt index 3fc1253..e45f3b2 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/ready/ReadyScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/complete/OnboardingCompleteScreen.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.screen.ready +package com.infomaniak.auth.ui.screen.onboarding.complete import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -40,7 +40,7 @@ import com.infomaniak.core.ui.compose.bottomstickybuttonscaffolds.BottomStickyBu import com.infomaniak.core.ui.compose.preview.PreviewSmallWindow @Composable -fun ReadyScreen(navigateToHome: () -> Unit) { +fun OnboardingCompleteScreen(navigateToHome: () -> Unit) { BottomStickyButtonScaffold( topBar = { InfomaniakAuthenticatorTopAppBar() @@ -70,8 +70,8 @@ fun ReadyScreen(navigateToHome: () -> Unit) { @PreviewSmallWindow @Composable -fun ReadyScreenPreview() { +fun OnboardingCompleteScreenPreview() { AuthenticatorTheme { - ReadyScreen(navigateToHome = {}) + OnboardingCompleteScreen(navigateToHome = {}) } } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/CrossAppLoginViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/CrossAppLoginViewModel.kt similarity index 95% rename from app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/CrossAppLoginViewModel.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/CrossAppLoginViewModel.kt index 0196b4d..a912382 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/CrossAppLoginViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/CrossAppLoginViewModel.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.screen.onboarding +package com.infomaniak.auth.ui.screen.onboarding.start import com.infomaniak.auth.BuildConfig import com.infomaniak.core.crossapplogin.back.BaseCrossAppLoginViewModel diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/OnboardingPage.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/OnboardingStartPage.kt similarity index 95% rename from app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/OnboardingPage.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/OnboardingStartPage.kt index 03db819..f205a85 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/OnboardingPage.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/OnboardingStartPage.kt @@ -15,23 +15,20 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.screen.onboarding +package com.infomaniak.auth.ui.screen.onboarding.start import androidx.annotation.RawRes import androidx.annotation.StringRes -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.size import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -110,7 +107,7 @@ internal sealed class IllustrationResource { @PreviewSmallWindow @Composable -private fun OnboardingPagePreview() { +private fun OnboardingStartPagePreview() { val pagerState = rememberPagerState(pageCount = { 1 }) val page = Page.Login.toOnboardingPage(pagerState = pagerState, index = 0) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/OnboardingScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/OnboardingStartScreen.kt similarity index 96% rename from app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/OnboardingScreen.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/OnboardingStartScreen.kt index 9a146d9..e18a0d7 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/OnboardingScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/onboarding/start/OnboardingStartScreen.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.screen.onboarding +package com.infomaniak.auth.ui.screen.onboarding.start import androidx.activity.ComponentActivity import androidx.activity.compose.LocalActivity @@ -51,7 +51,7 @@ import com.infomaniak.core.ui.compose.basics.rememberCallableState import com.infomaniak.core.ui.compose.preview.PreviewSmallWindow @Composable -fun OnboardingScreen( +fun OnboardingStartScreen( crossAppLoginViewModel: CrossAppLoginViewModel = viewModel(), onLogin: () -> Unit, onCreateAccount: () -> Unit @@ -70,7 +70,7 @@ fun OnboardingScreen( crossAppLoginViewModel.activateUpdates(hostActivity) } - OnboardingScreen( + OnboardingStartScreen( accountsCheckingState = { accountsCheckingState }, skippedIds = { skippedIds }, // TODO : Use loginRequest When login logic ready @@ -85,7 +85,7 @@ fun OnboardingScreen( } @Composable -private fun OnboardingScreen( +private fun OnboardingStartScreen( accountsCheckingState: () -> AccountsCheckingState, skippedIds: () -> Set, isLoginButtonLoading: () -> Boolean, @@ -141,11 +141,11 @@ private fun OnboardingScreen( @PreviewSmallWindow @Composable -private fun OnboardingScreenPreview( +private fun OnboardingStartScreenPreview( @PreviewParameter(AccountsPreviewParameter::class) accounts: List ) { AuthenticatorTheme { - OnboardingScreen( + OnboardingStartScreen( accountsCheckingState = { AccountsCheckingState(AccountsCheckingStatus.Checking, checkedAccounts = accounts) }, From cf6c812bc0111846c7440a322d761ceb5c0adcac Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Fri, 23 Jan 2026 00:11:18 +0900 Subject: [PATCH 2/2] fix: Correctly use Onboarding navigation destination --- .../kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt index a0ef0b3..4913a50 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt @@ -30,7 +30,7 @@ sealed interface NavDestination : NavKey { data object Start : Onboarding @Serializable - data object Complete : NavDestination + data object Complete : Onboarding } @Serializable