From e2168c8f6e9ddaa36a0fe7970749107533156aa4 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Wed, 18 Dec 2024 10:25:50 +0100 Subject: [PATCH 1/5] chore: Add new logic for toDestination without kotlin reflect --- .../ui/navigation/NavigationDestination.kt | 65 +++++++++---------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt index d00600ccf..391f1a37b 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt @@ -17,24 +17,23 @@ */ package com.infomaniak.swisstransfer.ui.navigation -import android.os.Bundle import androidx.compose.animation.AnimatedContentScope import androidx.compose.runtime.Composable import androidx.navigation.NavBackStackEntry import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.navDeepLink +import androidx.navigation.toRoute +import com.infomaniak.sentry.SentryLog import com.infomaniak.swisstransfer.BuildConfig import com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components.TransferTypeUi import kotlinx.serialization.Serializable -import kotlin.reflect.KClass -import kotlin.reflect.full.primaryConstructor /** * Sealed class representing the navigation arguments for the main navigation flow. */ @Serializable -sealed class MainNavigation : NavigationDestination() { +sealed class MainNavigation() : NavigationDestination() { var enableTransition = true @Serializable @@ -57,7 +56,7 @@ sealed class MainNavigation : NavigationDestination() { } } } - + @Serializable data class TransferDetailsDestination(val transferUuid: String) : MainNavigation() @@ -65,7 +64,31 @@ sealed class MainNavigation : NavigationDestination() { data object SettingsDestination : MainNavigation() companion object { + private val TAG = MainNavigation::class.java.simpleName val startDestination = SentDestination + + val entries = listOf( + SentDestination::class, + ReceivedDestination::class, + TransferDetailsDestination::class, + SettingsDestination::class, + ) + + fun NavBackStackEntry.toMainDestination(): MainNavigation? { + return runCatching { + val destinationRoute = destination.route ?: error("Destination route cannot be empty") + when (entries.firstOrNull { destinationRoute.contains(it.qualifiedName.toString()) }) { + SentDestination::class -> this.toRoute() + ReceivedDestination::class -> this.toRoute() + TransferDetailsDestination::class -> this.toRoute() + SettingsDestination::class -> this.toRoute() + else -> error("Destination $destinationRoute is not handled") + } + }.getOrElse { exception -> + SentryLog.e(TAG, "toMainDestination: Failure", exception) + null + } + } } } @@ -98,34 +121,4 @@ sealed class NewTransferNavigation : NavigationDestination() { * Sealed class representing navigation arguments with a title resource. */ @Serializable -sealed class NavigationDestination { - - companion object { - - inline fun NavBackStackEntry.toDestination(): T? { - return toDestination(T::class, backStackEntry = this) - } - - fun toDestination(kClass: KClass, backStackEntry: NavBackStackEntry?): T? { - - fun kClassFromRoute(route: String) = kClass.sealedSubclasses.firstOrNull { - route.contains(it.qualifiedName.toString()) - } - - if (backStackEntry == null) return null - - val route = backStackEntry.destination.route ?: "" - val args = backStackEntry.arguments - val subclass = kClassFromRoute(route) ?: return null - - return createInstance(subclass, args) - } - - private fun createInstance(kClass: KClass, bundle: Bundle?): T? { - return kClass.primaryConstructor?.let { - val args = it.parameters.associateWith { parameter -> bundle?.get(parameter.name) } - it.callBy(args) - } ?: kClass.objectInstance - } - } -} +sealed class NavigationDestination From 02c1dea3ec889146d30d2fd703b2945ff9cda4b6 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Wed, 18 Dec 2024 10:26:33 +0100 Subject: [PATCH 2/5] chore: Use toMainDestination instead --- .../com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt | 4 ++-- .../swisstransfer/ui/screen/main/components/MainScaffold.kt | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt index a42714170..fe06e199f 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt @@ -25,7 +25,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar import com.infomaniak.swisstransfer.ui.navigation.MainNavigation -import com.infomaniak.swisstransfer.ui.navigation.NavigationDestination.Companion.toDestination +import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.Companion.toMainDestination import com.infomaniak.swisstransfer.ui.screen.main.components.MainScaffold import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows @@ -37,7 +37,7 @@ fun MainScreen() { val navBackStackEntry by navController.currentBackStackEntryAsState() val currentDestination by remember(navBackStackEntry) { - derivedStateOf { navBackStackEntry?.toDestination() ?: MainNavigation.startDestination } + derivedStateOf { navBackStackEntry?.toMainDestination() ?: MainNavigation.startDestination } } MainScaffold( diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/MainScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/MainScaffold.kt index 563d53799..c66aa7f66 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/MainScaffold.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/MainScaffold.kt @@ -17,7 +17,6 @@ */ package com.infomaniak.swisstransfer.ui.screen.main.components -import android.content.Intent import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.material3.HorizontalDivider @@ -26,10 +25,8 @@ import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.navigation.NavController import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController -import com.infomaniak.core2.extensions.parcelableExtra import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar import com.infomaniak.swisstransfer.ui.navigation.MainNavigation import com.infomaniak.swisstransfer.ui.navigation.NavigationItem From 7137428a2967d7ecae673adaf78b31f0e8ea2b3d Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Wed, 18 Dec 2024 10:28:00 +0100 Subject: [PATCH 3/5] chore: Remove useless code --- .../swisstransfer/ui/navigation/NavigationDestination.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt index 391f1a37b..394acafc9 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt @@ -33,7 +33,7 @@ import kotlinx.serialization.Serializable * Sealed class representing the navigation arguments for the main navigation flow. */ @Serializable -sealed class MainNavigation() : NavigationDestination() { +sealed class MainNavigation : NavigationDestination() { var enableTransition = true @Serializable From efee9cf1a57f8a059a2d34bb87a046b76b3e9bfa Mon Sep 17 00:00:00 2001 From: Kevin Boulongne Date: Wed, 18 Dec 2024 10:31:06 +0100 Subject: [PATCH 4/5] refactor: Remove now unused `TransferDetailsDestination` --- .../swisstransfer/ui/navigation/NavigationDestination.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt index 394acafc9..d63d7e5a4 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt @@ -57,9 +57,6 @@ sealed class MainNavigation : NavigationDestination() { } } - @Serializable - data class TransferDetailsDestination(val transferUuid: String) : MainNavigation() - @Serializable data object SettingsDestination : MainNavigation() @@ -70,7 +67,6 @@ sealed class MainNavigation : NavigationDestination() { val entries = listOf( SentDestination::class, ReceivedDestination::class, - TransferDetailsDestination::class, SettingsDestination::class, ) @@ -80,7 +76,6 @@ sealed class MainNavigation : NavigationDestination() { when (entries.firstOrNull { destinationRoute.contains(it.qualifiedName.toString()) }) { SentDestination::class -> this.toRoute() ReceivedDestination::class -> this.toRoute() - TransferDetailsDestination::class -> this.toRoute() SettingsDestination::class -> this.toRoute() else -> error("Destination $destinationRoute is not handled") } From 572f985746a51ed6361c1ec3e469be76fe9b51d9 Mon Sep 17 00:00:00 2001 From: Kevin Boulongne Date: Wed, 18 Dec 2024 11:00:58 +0100 Subject: [PATCH 5/5] fix: Destination UI now correctly updates when app is minified --- .../ui/navigation/NavigationDestination.kt | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt index d63d7e5a4..abe2f6dcd 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt @@ -36,9 +36,19 @@ import kotlinx.serialization.Serializable sealed class MainNavigation : NavigationDestination() { var enableTransition = true + /** + * DO NOT RENAME THIS. + * EVER. + * Because of the minification, it will break the `toMainDestination()` function. + */ @Serializable data object SentDestination : MainNavigation() + /** + * DO NOT RENAME THIS. + * EVER. + * Because of the minification, it will break the `toMainDestination()` function. + */ @Serializable data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation() { @@ -57,6 +67,11 @@ sealed class MainNavigation : NavigationDestination() { } } + /** + * DO NOT RENAME THIS. + * EVER. + * Because of the minification, it will break the `toMainDestination()` function. + */ @Serializable data object SettingsDestination : MainNavigation() @@ -64,19 +79,25 @@ sealed class MainNavigation : NavigationDestination() { private val TAG = MainNavigation::class.java.simpleName val startDestination = SentDestination + /** + * If these classes have to be renamed, they need to be renamed in this `list` too. + */ val entries = listOf( - SentDestination::class, - ReceivedDestination::class, - SettingsDestination::class, + "SentDestination", + "ReceivedDestination", + "SettingsDestination", ) fun NavBackStackEntry.toMainDestination(): MainNavigation? { return runCatching { val destinationRoute = destination.route ?: error("Destination route cannot be empty") - when (entries.firstOrNull { destinationRoute.contains(it.qualifiedName.toString()) }) { - SentDestination::class -> this.toRoute() - ReceivedDestination::class -> this.toRoute() - SettingsDestination::class -> this.toRoute() + /** + * If these classes have to be renamed, they need to be renamed in this `when` too. + */ + when (entries.firstOrNull { destinationRoute.contains(it) }) { + "SentDestination" -> this.toRoute() + "ReceivedDestination" -> this.toRoute() + "SettingsDestination" -> this.toRoute() else -> error("Destination $destinationRoute is not handled") } }.getOrElse { exception ->