From eea0cf638da742387330e234a1ace83a133b5657 Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Sun, 15 Sep 2024 21:03:36 +0300 Subject: [PATCH 1/3] Updated Splash & Onboarding routes --- app/build.gradle.kts | 1 + .../kotlin/ApplicationConventionPlugin.kt | 1 + .../main/kotlin/ComposeConventionPlugin.kt | 1 + .../shifthackz/aisdv1/buildlogic/Compose.kt | 1 + build.gradle.kts | 2 + feature/mediapipe/build.gradle.kts | 1 + .../feature/mediapipe/ExampleUnitTest.kt | 2 +- gradle/libs.versions.toml | 28 +++++++----- presentation/build.gradle.kts | 2 + .../activity/AiStableDiffusionActivity.kt | 15 ++++--- .../navigation/NavigationEffect.kt | 17 ++++--- .../navigation/NavigationRoute.kt | 12 +++++ .../navigation/graph/MainNavGraph.kt | 44 ++++++++----------- .../navigation/router/main/MainRouterImpl.kt | 10 +++-- .../aisdv1/presentation/utils/Constants.kt | 4 +- 15 files changed, 86 insertions(+), 55 deletions(-) create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9ad3e14a..af19f233 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,6 +4,7 @@ import java.util.Properties plugins { alias(libs.plugins.generic.application) alias(libs.plugins.generic.baseline.profm) + alias(libs.plugins.compose.compiler) } android { diff --git a/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt index 34cbad9a..19bc6e0d 100644 --- a/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt @@ -17,6 +17,7 @@ class ApplicationConventionPlugin : Plugin { apply("org.jetbrains.kotlin.android") apply("org.jetbrains.kotlin.kapt") apply("generic.jacoco") + apply("org.jetbrains.kotlin.plugin.serialization") } extensions.configure { diff --git a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt index 4cecbba9..1f584542 100644 --- a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt @@ -15,6 +15,7 @@ class ComposeConventionPlugin : Plugin { apply("com.android.library") apply("org.jetbrains.kotlin.android") apply("generic.jacoco") + apply("org.jetbrains.kotlin.plugin.compose") } val extension = extensions.getByType() diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt b/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt index 86b52d10..4c36d18b 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt +++ b/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt @@ -40,6 +40,7 @@ internal fun Project.configureCompose( add("implementation", libs.findLibrary("google.accompanist.systemuicontroller").get()) add("implementation", libs.findLibrary("rx.java").get()) add("implementation", libs.findLibrary("shifthackz.mvi").get()) + add("implementation", libs.findLibrary("kotlinx.serialization.json").get()) } } } diff --git a/build.gradle.kts b/build.gradle.kts index 71a2e7db..6cd5f96b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,6 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.jetbrains.kotlin.serialization) apply false + alias(libs.plugins.compose.compiler) apply false } diff --git a/feature/mediapipe/build.gradle.kts b/feature/mediapipe/build.gradle.kts index 0249feed..b58a7358 100644 --- a/feature/mediapipe/build.gradle.kts +++ b/feature/mediapipe/build.gradle.kts @@ -14,4 +14,5 @@ dependencies { implementation(libs.rx.kotlin) fullImplementation(libs.google.mediapipe.image.generator) playstoreImplementation(libs.google.mediapipe.image.generator) + testImplementation(libs.test.junit) } diff --git a/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt b/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt index 412481c5..2fc2001c 100644 --- a/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt +++ b/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt @@ -13,4 +13,4 @@ class ExampleUnitTest { fun addition_isCorrect() { assertEquals(4, 2 + 2) } -} \ No newline at end of file +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d1a1645c..9a6c08ea 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ targetSdk = "34" compileSdk = "34" minSdk = "24" agp = "8.6.0" -kotlin = "1.9.21" +kotlin = "2.0.20" appcompat = "1.7.0" composeCompiler = "1.5.7" composeBom = "2024.08.00" @@ -47,13 +47,14 @@ turbine = "1.1.0" roboelectric = "4.13" testCoroutines = "1.8.1" mediaPipeGenerator = "0.10.14" +serialization = "1.7.2" [libraries] -android-tools-build-gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "agp"} +android-tools-build-gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } apache-stringutils = { group = "org.apache.commons", name = "commons-lang3", version.ref = "apacheStringUtils" } androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat"} +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } androidx-compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "composeActivity" } androidx-compose-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewModel" } androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewModel" } @@ -82,8 +83,8 @@ google-mediapipe-image-generator = { group = "com.google.mediapipe", name = "tas retrofit-core = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } retrofit-adapter-rxjava3 = { group = "com.squareup.retrofit2", name = "adapter-rxjava3", version.ref = "retrofit" } -okhttp-core = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp"} -okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp"} +okhttp-core = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } +okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" } koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } koin-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koinCompose" } @@ -93,16 +94,16 @@ rx-java = { group = "io.reactivex.rxjava3", name = "rxjava", version.ref = "rxJa rx-kotlin = { group = "io.reactivex.rxjava3", name = "rxkotlin", version.ref = "rxKotlinVersion" } rx-network = { group = "io.github.softartdev", name = "reactivenetwork-rx3", version.ref = "rxNetworkVersion" } timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } -test-junit = { group = "junit", name = "junit", version.ref = "junit"} -test-mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk"} -test-mockito = { group = "com.nhaarman.mockitokotlin2", name = "mockito-kotlin", version.ref = "mockito"} +test-junit = { group = "junit", name = "junit", version.ref = "junit" } +test-mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" } +test-mockito = { group = "com.nhaarman.mockitokotlin2", name = "mockito-kotlin", version.ref = "mockito" } test-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "testCoroutines" } test-koin = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" } test-koin-junit = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" } test-turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" } -test-roboelectric = { group = "org.robolectric", name = "robolectric", version.ref = "roboelectric"} -test-compose-junit = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "composeJunit"} -test-compose-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version.ref = "composeJunit"} +test-roboelectric = { group = "org.robolectric", name = "robolectric", version.ref = "roboelectric" } +test-compose-junit = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "composeJunit" } +test-compose-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version.ref = "composeJunit" } compose-gestures = { group = "com.github.SmartToolFactory", name = "Compose-Extended-Gestures", version.ref = "composeGestures" } compose-crop = { group = "io.github.mr0xf00", name = "easycrop", version.ref = "crop" } shifthackz-mvi = { group = "com.github.ShiftHackZ", name = "AndroidCoreMVI", version.ref = "mvi" } @@ -111,14 +112,17 @@ shifthackz-daynightswitch = { group = "com.github.ShiftHackZ", name = "DayNightS shifthackz-catppuccin-legacy = { group = "com.github.ShiftHackZ.Catppuccin-Android-Library", name = "palette-legacy", version.ref = "catppuccin" } shifthackz-catppuccin-compose = { group = "com.github.ShiftHackZ.Catppuccin-Android-Library", name = "compose", version.ref = "catppuccin" } shifthackz-catppuccin-splash = { group = "com.github.ShiftHackZ.Catppuccin-Android-Library", name = "splashscreen", version.ref = "catppuccin" } +kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "serialization" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -jetbrains-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version="unspecified" } +jetbrains-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version = "unspecified" } +jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } generic-flavors = { id = "generic.flavors", version = "unspecified" } generic-library = { id = "generic.library", version = "unspecified" } generic-baseline-profm = { id = "generic.baseline.profm", version = "unspecified" } generic-compose = { id = "generic.compose", version = "unspecified" } generic-application = { id = "generic.application", version = "unspecified" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts index f0cfc386..69bc3a02 100755 --- a/presentation/build.gradle.kts +++ b/presentation/build.gradle.kts @@ -1,5 +1,7 @@ plugins { alias(libs.plugins.generic.compose) + alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.kotlin.serialization) } android { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt index 29b3aa3f..58f38579 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt @@ -24,10 +24,10 @@ import com.shifthackz.aisdv1.core.common.log.debugLog import com.shifthackz.aisdv1.core.ui.MviComponent import com.shifthackz.aisdv1.presentation.extensions.navigatePopUpToCurrent import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.navigation.graph.mainNavGraph import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerScreen import com.shifthackz.aisdv1.presentation.theme.global.AiSdAppTheme -import com.shifthackz.aisdv1.presentation.utils.Constants import com.shifthackz.aisdv1.presentation.utils.PermissionUtil import kotlinx.coroutines.launch import org.koin.androidx.viewmodel.ext.android.viewModel @@ -85,7 +85,9 @@ class AiStableDiffusionActivity : AppCompatActivity() { LaunchedEffect(backStackEntry) { if (!viewModel.state.value.isShowSplash) return@LaunchedEffect - if (backStackEntry?.destination?.route != Constants.ROUTE_SPLASH) { + backStackEntry?.let { entry -> + val route = entry.destination.route ?: "" + if (route.contains("${NavigationRoute.Splash}")) return@LaunchedEffect viewModel.processIntent(AppIntent.HideSplash) } } @@ -101,9 +103,10 @@ class AiStableDiffusionActivity : AppCompatActivity() { navController.navigate(effect.route) } - is NavigationEffect.Navigate.RouteBuilder -> navController.navigate( - effect.route, effect.builder, - ) + is NavigationEffect.Navigate.RouteBuilder -> { navController.navigate( + effect.navRoute, effect.builder, + ) + } is NavigationEffect.Navigate.RoutePopUp -> { navController.navigatePopUpToCurrent(effect.route) @@ -134,7 +137,7 @@ class AiStableDiffusionActivity : AppCompatActivity() { ) { NavHost( navController = navController, - startDestination = Constants.ROUTE_SPLASH, + startDestination = NavigationRoute.Splash, builder = { mainNavGraph() }, ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt index acc03f24..7ce6138a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt @@ -8,17 +8,24 @@ sealed interface NavigationEffect : MviEffect { data object Back : NavigationEffect sealed interface Navigate : NavigationEffect { + val route: String //todo: Remove + val navRoute: NavigationRoute - val route: String - - data class Route(override val route: String) : Navigate + data class Route( + override val route: String, + override val navRoute: NavigationRoute = NavigationRoute.Splash, + ) : Navigate data class RouteBuilder( override val route: String, + override val navRoute: NavigationRoute = NavigationRoute.Splash, val builder: NavOptionsBuilder.() -> Unit, ) : Navigate - data class RoutePopUp(override val route: String) : Navigate + data class RoutePopUp( + override val route: String, + override val navRoute: NavigationRoute = NavigationRoute.Splash, + ) : Navigate } sealed interface Drawer : NavigationEffect { @@ -29,7 +36,7 @@ sealed interface NavigationEffect : MviEffect { } sealed interface Home : NavigationEffect { - val route: String + val route: String //todo: Replace with NavigationRoute data class Route(override val route: String) : Home diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt new file mode 100644 index 00000000..238c1406 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt @@ -0,0 +1,12 @@ +package com.shifthackz.aisdv1.presentation.navigation + +import com.shifthackz.aisdv1.presentation.model.LaunchSource +import kotlinx.serialization.Serializable + +sealed interface NavigationRoute { + @Serializable + data object Splash : NavigationRoute + + @Serializable + data class Onboarding(val source: LaunchSource) : NavigationRoute +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt index 393347ac..d197d9d4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt @@ -4,8 +4,11 @@ import androidx.navigation.NavArgument import androidx.navigation.NavGraphBuilder import androidx.navigation.NavType import androidx.navigation.compose.ComposeNavigator +import androidx.navigation.compose.composable import androidx.navigation.get +import androidx.navigation.toRoute import com.shifthackz.aisdv1.presentation.model.LaunchSource +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuScreen import com.shifthackz.aisdv1.presentation.screen.donate.DonateScreen import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailScreen @@ -22,15 +25,12 @@ import com.shifthackz.aisdv1.presentation.utils.Constants import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject import org.koin.core.parameter.parametersOf +import kotlin.reflect.typeOf fun NavGraphBuilder.mainNavGraph() { - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - SplashScreen() - }.apply { - route = Constants.ROUTE_SPLASH - } - ) + composable { + SplashScreen() + } addDestination( ComposeNavigator.Destination(provider[ComposeNavigator::class]) { entry -> val sourceKey = entry.arguments @@ -105,22 +105,16 @@ fun NavGraphBuilder.mainNavGraph() { route = Constants.ROUTE_DONATE } ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { entry -> - val sourceKey = entry.arguments - ?.getInt(Constants.PARAM_SOURCE) - ?: LaunchSource.SPLASH.ordinal - OnBoardingScreen( - viewModel = koinViewModel( - parameters = { parametersOf(sourceKey) } - ), - ) - }.apply { - route = Constants.ROUTE_ONBOARDING_FULL - addArgument( - Constants.PARAM_SOURCE, - NavArgument.Builder().setType(NavType.IntType).build(), - ) - } - ) + composable( + typeMap = mapOf( + typeOf() to NavType.EnumType(LaunchSource::class.java) + ) + ) { entry -> + val sourceKey = entry.toRoute().source.ordinal + OnBoardingScreen( + viewModel = koinViewModel( + parameters = { parametersOf(sourceKey) } + ), + ) + } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt index a9a2a438..778e211d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt @@ -2,6 +2,7 @@ package com.shifthackz.aisdv1.presentation.navigation.router.main import com.shifthackz.aisdv1.presentation.model.LaunchSource import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.utils.Constants import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject @@ -19,9 +20,12 @@ internal class MainRouterImpl : MainRouter { } override fun navigateToOnBoarding(source: LaunchSource) { - effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder("${Constants.ROUTE_ONBOARDING}/${source.ordinal}") { + effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder( + "", + navRoute = NavigationRoute.Onboarding(source = source) + ) { if (source == LaunchSource.SPLASH) { - popUpTo(Constants.ROUTE_SPLASH) { + popUpTo(NavigationRoute.Splash) { inclusive = true } } @@ -30,7 +34,7 @@ internal class MainRouterImpl : MainRouter { override fun navigateToPostSplashConfigLoader() { effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder(Constants.ROUTE_CONFIG_LOADER) { - popUpTo(Constants.ROUTE_SPLASH) { + popUpTo(NavigationRoute.Splash) { inclusive = true } }) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt index 6562ec2f..920b3cf1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt @@ -7,7 +7,7 @@ object Constants { const val PARAM_ITEM_ID = "itemId" const val PARAM_SOURCE = "source" - const val ROUTE_SPLASH = "splash" + //todo: Migrate ROUTES to NavigationRoute const val ROUTE_SERVER_SETUP = "server_setup" const val ROUTE_SERVER_SETUP_FULL = "$ROUTE_SERVER_SETUP/{$PARAM_SOURCE}" const val ROUTE_CONFIG_LOADER = "config_loader" @@ -23,8 +23,6 @@ object Constants { const val ROUTE_LOGGER = "logger" const val ROUTE_IN_PAINT = "in_paint" const val ROUTE_DONATE = "donate" - const val ROUTE_ONBOARDING = "onboarding" - const val ROUTE_ONBOARDING_FULL = "$ROUTE_ONBOARDING/{$PARAM_SOURCE}" const val SUB_SEED_STRENGTH_MIN = 0f const val SUB_SEED_STRENGTH_MAX = 1f From d5cb7bfaddf8c69320d04b2bd7d0c779c943fa6a Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Sun, 22 Sep 2024 13:54:28 +0300 Subject: [PATCH 2/3] Refactored remaining routes to type safe navigation --- .../activity/AiStableDiffusionActivity.kt | 16 +-- .../activity/AiStableDiffusionViewModel.kt | 2 +- .../aisdv1/presentation/activity/AppIntent.kt | 3 +- .../extensions/NavControllerExtensions.kt | 5 +- .../aisdv1/presentation/model/NavItem.kt | 3 +- .../navigation/NavigationEffect.kt | 20 +-- .../navigation/NavigationRoute.kt | 41 +++++++ .../navigation/graph/DrawerNavGraph.kt | 8 +- .../navigation/graph/HomeNavGraph.kt | 49 ++++---- .../navigation/graph/MainNavGraph.kt | 114 ++++++------------ .../navigation/router/home/HomeRouter.kt | 5 +- .../navigation/router/home/HomeRouterImpl.kt | 18 +-- .../navigation/router/main/MainRouterImpl.kt | 35 +++--- .../screen/drawer/DrawerScreen.kt | 34 +++--- .../screen/home/HomeNavigationEffect.kt | 3 - .../screen/home/HomeNavigationIntent.kt | 5 +- .../screen/home/HomeNavigationMappers.kt | 8 +- .../screen/home/HomeNavigationScreen.kt | 40 ++++-- .../screen/home/HomeNavigationViewModel.kt | 4 +- .../aisdv1/presentation/utils/Constants.kt | 30 +---- .../AiStableDiffusionViewModelTest.kt | 46 ++++--- .../router/main/MainRouterImplTest.kt | 38 +++--- 22 files changed, 272 insertions(+), 255 deletions(-) delete mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationEffect.kt diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt index 58f38579..92535155 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.core.animation.doOnEnd import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.compose.NavHost import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController @@ -77,17 +78,17 @@ class AiStableDiffusionActivity : AppCompatActivity() { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() - var homeRouteEntry: String? by remember { mutableStateOf(null) } + var homeRouteEntry: NavigationRoute? by remember { mutableStateOf(null) } BackHandler(enabled = drawerState.isOpen) { scope.launch { drawerState.close() } } LaunchedEffect(backStackEntry) { + println("TESTING | route=${backStackEntry?.destination?.route}") if (!viewModel.state.value.isShowSplash) return@LaunchedEffect backStackEntry?.let { entry -> - val route = entry.destination.route ?: "" - if (route.contains("${NavigationRoute.Splash}")) return@LaunchedEffect + if (entry.destination.hasRoute(NavigationRoute.Splash::class)) return@LaunchedEffect viewModel.processIntent(AppIntent.HideSplash) } } @@ -100,16 +101,17 @@ class AiStableDiffusionActivity : AppCompatActivity() { NavigationEffect.Back -> navController.navigateUp() is NavigationEffect.Navigate.Route -> { - navController.navigate(effect.route) + navController.navigate(effect.navRoute) } - is NavigationEffect.Navigate.RouteBuilder -> { navController.navigate( + is NavigationEffect.Navigate.RouteBuilder -> { + navController.navigate( effect.navRoute, effect.builder, ) } is NavigationEffect.Navigate.RoutePopUp -> { - navController.navigatePopUpToCurrent(effect.route) + navController.navigatePopUpToCurrent(effect.navRoute) } NavigationEffect.Drawer.Close -> scope.launch { @@ -121,7 +123,7 @@ class AiStableDiffusionActivity : AppCompatActivity() { } is NavigationEffect.Home -> { - homeRouteEntry = effect.route + homeRouteEntry = effect.navRoute } } }, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt index f2888dec..c4b764fd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt @@ -56,7 +56,7 @@ class AiStableDiffusionViewModel( } is AppIntent.HomeRoute -> { - homeRouter.navigateToRoute(intent.route) + homeRouter.navigateToRoute(intent.navRoute) } AppIntent.HideSplash -> updateState { state -> diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt index 7c633099..75a02fe3 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt @@ -1,5 +1,6 @@ package com.shifthackz.aisdv1.presentation.activity +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.android.core.mvi.MviIntent sealed interface AppIntent : MviIntent { @@ -7,5 +8,5 @@ sealed interface AppIntent : MviIntent { data object GrantStoragePermission : AppIntent data object HideSplash : AppIntent - data class HomeRoute(val route: String) : AppIntent + data class HomeRoute(val navRoute: NavigationRoute) : AppIntent } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt index eec15f32..96ffcf0f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt @@ -1,9 +1,10 @@ package com.shifthackz.aisdv1.presentation.extensions import androidx.navigation.NavController +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -fun NavController.navigatePopUpToCurrent(route: String) { - navigate(route) { +fun NavController.navigatePopUpToCurrent(navRoute: NavigationRoute) { + navigate(navRoute) { currentBackStackEntry?.destination?.route?.let { popUpTo(it) { inclusive = true } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt index a791162e..f875f6c6 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt @@ -6,11 +6,12 @@ import androidx.compose.runtime.Immutable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import com.shifthackz.aisdv1.core.model.UiText +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute @Immutable data class NavItem( val name: UiText, - val route: String, + val navRoute: NavigationRoute, val icon: Icon, val content: (@Composable () -> Unit)? = null, ) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt index 7ce6138a..f66ec403 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt @@ -8,24 +8,16 @@ sealed interface NavigationEffect : MviEffect { data object Back : NavigationEffect sealed interface Navigate : NavigationEffect { - val route: String //todo: Remove val navRoute: NavigationRoute - data class Route( - override val route: String, - override val navRoute: NavigationRoute = NavigationRoute.Splash, - ) : Navigate + data class Route(override val navRoute: NavigationRoute) : Navigate data class RouteBuilder( - override val route: String, - override val navRoute: NavigationRoute = NavigationRoute.Splash, + override val navRoute: NavigationRoute, val builder: NavOptionsBuilder.() -> Unit, ) : Navigate - data class RoutePopUp( - override val route: String, - override val navRoute: NavigationRoute = NavigationRoute.Splash, - ) : Navigate + data class RoutePopUp(override val navRoute: NavigationRoute) : Navigate } sealed interface Drawer : NavigationEffect { @@ -36,10 +28,10 @@ sealed interface NavigationEffect : MviEffect { } sealed interface Home : NavigationEffect { - val route: String //todo: Replace with NavigationRoute + val navRoute: NavigationRoute - data class Route(override val route: String) : Home + data class Route(override val navRoute: NavigationRoute) : Home - data class Update(override val route: String) : Home + data class Update(override val navRoute: NavigationRoute) : Home } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt index 238c1406..2ff81d92 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt @@ -7,6 +7,47 @@ sealed interface NavigationRoute { @Serializable data object Splash : NavigationRoute + @Serializable + data object Home : NavigationRoute + + @Serializable + data object ConfigLoader : NavigationRoute + + @Serializable + data object WebUi : NavigationRoute + + @Serializable + data object Debug : NavigationRoute + + @Serializable + data object Logger : NavigationRoute + + @Serializable + data object InPaint : NavigationRoute + + @Serializable + data object Donate : NavigationRoute + @Serializable data class Onboarding(val source: LaunchSource) : NavigationRoute + + @Serializable + data class GalleryDetail(val itemId: Long) : NavigationRoute + + @Serializable + data class ServerSetup(val source: LaunchSource) : NavigationRoute + + sealed interface HomeNavigation : NavigationRoute { + @Serializable + data object TxtToImg : HomeNavigation + + @Serializable + data object ImgToImg : HomeNavigation + + @Serializable + data object Gallery : HomeNavigation + + @Serializable + data object Settings : HomeNavigation + } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt index 5146f51d..a5b0463d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt @@ -11,7 +11,7 @@ import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.Settings import com.shifthackz.aisdv1.presentation.model.LaunchSource import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.utils.Constants +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.widget.source.getNameUiText import com.shifthackz.aisdv1.core.localization.R as LocalizationR @@ -36,7 +36,7 @@ private fun webUi(source: ServerSource) = NavItem( source.getNameUiText(), ")".asUiText(), ), - route = Constants.ROUTE_WEB_UI, + navRoute = NavigationRoute.WebUi, icon = NavItem.Icon.Vector( vector = Icons.Default.Web, ), @@ -44,7 +44,7 @@ private fun webUi(source: ServerSource) = NavItem( private fun configuration() = NavItem( name = LocalizationR.string.settings_item_config.asUiText(), - route = "${Constants.ROUTE_SERVER_SETUP}/${LaunchSource.SETTINGS.ordinal}", + navRoute = NavigationRoute.ServerSetup(source = LaunchSource.SETTINGS), icon = NavItem.Icon.Vector( vector = Icons.Default.SettingsEthernet, ), @@ -52,7 +52,7 @@ private fun configuration() = NavItem( private fun developerMode() = NavItem( name = LocalizationR.string.title_debug_menu.asUiText(), - route = Constants.ROUTE_DEBUG, + navRoute = NavigationRoute.Debug, icon = NavItem.Icon.Vector( vector = Icons.Default.DeveloperMode, ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt index 852e7dcc..dfccf1b3 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt @@ -8,45 +8,42 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.ComposeNavigator -import androidx.navigation.get +import androidx.navigation.compose.composable import com.shifthackz.aisdv1.core.model.asUiText import com.shifthackz.aisdv1.presentation.model.NavItem +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryScreen import com.shifthackz.aisdv1.presentation.screen.home.HomeNavigationScreen import com.shifthackz.aisdv1.presentation.screen.img2img.ImageToImageScreen import com.shifthackz.aisdv1.presentation.screen.settings.SettingsScreen import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageScreen -import com.shifthackz.aisdv1.presentation.utils.Constants import org.koin.compose.koinInject import com.shifthackz.aisdv1.core.localization.R as LocalizationR import com.shifthackz.aisdv1.presentation.R as PresentationR -fun NavGraphBuilder.homeScreenNavGraph(route: String = Constants.ROUTE_HOME) { - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - HomeNavigationScreen( - navItems = listOf( - txt2ImgTab(), - img2imgTab(), - galleryTab(), - settingsTab(), - ), - ) - }.apply { this.route = route } - ) +fun NavGraphBuilder.homeScreenNavGraph() { + composable { + HomeNavigationScreen( + navItems = listOf( + txt2ImgTab(), + img2imgTab(), + galleryTab(), + settingsTab(), + ), + ) + } } fun txt2ImgTab() = NavItem( name = LocalizationR.string.home_tab_txt_to_img.asUiText(), - route = Constants.ROUTE_TXT_TO_IMG, + navRoute = NavigationRoute.HomeNavigation.TxtToImg, icon = NavItem.Icon.Resource( resId = PresentationR.drawable.ic_text, modifier = Modifier.size(24.dp), ), content = { - HomeTabBase(Constants.ROUTE_TXT_TO_IMG) { + HomeTabBase(NavigationRoute.HomeNavigation.TxtToImg) { TextToImageScreen() } }, @@ -54,13 +51,13 @@ fun txt2ImgTab() = NavItem( fun img2imgTab() = NavItem( name = LocalizationR.string.home_tab_img_to_img.asUiText(), - route = Constants.ROUTE_IMG_TO_IMG, + navRoute = NavigationRoute.HomeNavigation.ImgToImg, icon = NavItem.Icon.Resource( resId = PresentationR.drawable.ic_image, modifier = Modifier.size(24.dp), ), content = { - HomeTabBase(Constants.ROUTE_IMG_TO_IMG) { + HomeTabBase(NavigationRoute.HomeNavigation.ImgToImg) { ImageToImageScreen() } }, @@ -68,13 +65,13 @@ fun img2imgTab() = NavItem( fun galleryTab() = NavItem( name = LocalizationR.string.home_tab_gallery.asUiText(), - route = Constants.ROUTE_GALLERY, + navRoute = NavigationRoute.HomeNavigation.Gallery, icon = NavItem.Icon.Resource( resId = PresentationR.drawable.ic_gallery, modifier = Modifier.size(24.dp), ), content = { - HomeTabBase(Constants.ROUTE_GALLERY) { + HomeTabBase(NavigationRoute.HomeNavigation.Gallery) { GalleryScreen() } }, @@ -82,12 +79,12 @@ fun galleryTab() = NavItem( fun settingsTab() = NavItem( name = LocalizationR.string.home_tab_settings.asUiText(), - route = Constants.ROUTE_SETTINGS, + navRoute = NavigationRoute.HomeNavigation.Settings, icon = NavItem.Icon.Vector( vector = Icons.Default.Settings, ), content = { - HomeTabBase(Constants.ROUTE_SETTINGS) { + HomeTabBase(NavigationRoute.HomeNavigation.Settings) { SettingsScreen() } } @@ -95,12 +92,12 @@ fun settingsTab() = NavItem( @Composable private fun HomeTabBase( - route: String, + navRoute: NavigationRoute, content: @Composable () -> Unit, ) { val homeRouter: HomeRouter = koinInject() LaunchedEffect(Unit) { - homeRouter.updateExternallyWithoutNavigation(route) + homeRouter.updateExternallyWithoutNavigation(navRoute = navRoute) } content() } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt index d197d9d4..0da1271f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt @@ -1,11 +1,8 @@ package com.shifthackz.aisdv1.presentation.navigation.graph -import androidx.navigation.NavArgument import androidx.navigation.NavGraphBuilder import androidx.navigation.NavType -import androidx.navigation.compose.ComposeNavigator import androidx.navigation.compose.composable -import androidx.navigation.get import androidx.navigation.toRoute import com.shifthackz.aisdv1.presentation.model.LaunchSource import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute @@ -21,7 +18,6 @@ import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupScreen import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupViewModel import com.shifthackz.aisdv1.presentation.screen.splash.SplashScreen import com.shifthackz.aisdv1.presentation.screen.web.webui.WebUiScreen -import com.shifthackz.aisdv1.presentation.utils.Constants import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject import org.koin.core.parameter.parametersOf @@ -31,80 +27,42 @@ fun NavGraphBuilder.mainNavGraph() { composable { SplashScreen() } - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { entry -> - val sourceKey = entry.arguments - ?.getInt(Constants.PARAM_SOURCE) - ?: LaunchSource.SPLASH.ordinal - ServerSetupScreen( - viewModel = koinViewModel( - parameters = { parametersOf(sourceKey) } - ), - buildInfoProvider = koinInject() - ) - }.apply { - route = Constants.ROUTE_SERVER_SETUP_FULL - addArgument( - Constants.PARAM_SOURCE, - NavArgument.Builder().setType(NavType.IntType).build(), - ) - } - ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - ConfigurationLoaderScreen() - }.apply { - route = Constants.ROUTE_CONFIG_LOADER - } - ) - homeScreenNavGraph(Constants.ROUTE_HOME) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { entry -> - val itemId = entry.arguments?.getLong(Constants.PARAM_ITEM_ID) ?: -1L - GalleryDetailScreen(itemId = itemId) - }.apply { - route = Constants.ROUTE_GALLERY_DETAIL_FULL - addArgument( - Constants.PARAM_ITEM_ID, - NavArgument.Builder().setType(NavType.LongType).build(), - ) - } - ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - DebugMenuScreen() - }.apply { - route = Constants.ROUTE_DEBUG - } - ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - LoggerScreen() - }.apply { - route = Constants.ROUTE_LOGGER - } - ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - InPaintScreen() - }.apply { - route = Constants.ROUTE_IN_PAINT - } - ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - WebUiScreen() - }.apply { - route = Constants.ROUTE_WEB_UI - } - ) - addDestination( - ComposeNavigator.Destination(provider[ComposeNavigator::class]) { - DonateScreen() - }.apply { - route = Constants.ROUTE_DONATE - } - ) + composable( + typeMap = mapOf( + typeOf() to NavType.EnumType(LaunchSource::class.java) + ) + ) { entry -> + val sourceKey = entry.toRoute().source.ordinal + ServerSetupScreen( + viewModel = koinViewModel( + parameters = { parametersOf(sourceKey) } + ), + buildInfoProvider = koinInject() + ) + } + composable { + ConfigurationLoaderScreen() + } + homeScreenNavGraph() + composable { entry -> + val itemId = entry.toRoute().itemId + GalleryDetailScreen(itemId = itemId) + } + composable { + DebugMenuScreen() + } + composable { + LoggerScreen() + } + composable { + InPaintScreen() + } + composable { + WebUiScreen() + } + composable { + DonateScreen() + } composable( typeMap = mapOf( typeOf() to NavType.EnumType(LaunchSource::class.java) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt index 79e63a08..daaafd6f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt @@ -1,13 +1,14 @@ package com.shifthackz.aisdv1.presentation.navigation.router.home import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.navigation.router.Router interface HomeRouter : Router { - fun updateExternallyWithoutNavigation(route: String) + fun updateExternallyWithoutNavigation(navRoute: NavigationRoute) - fun navigateToRoute(route: String) + fun navigateToRoute(navRoute: NavigationRoute) fun navigateToTxt2Img() diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt index 7ed20009..6535a888 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt @@ -1,7 +1,7 @@ package com.shifthackz.aisdv1.presentation.navigation.router.home import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.utils.Constants +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject @@ -9,28 +9,28 @@ class HomeRouterImpl : HomeRouter { private val effectSubject: PublishSubject = PublishSubject.create() - override fun updateExternallyWithoutNavigation(route: String) { - effectSubject.onNext(NavigationEffect.Home.Update(route)) + override fun updateExternallyWithoutNavigation(navRoute: NavigationRoute) { + effectSubject.onNext(NavigationEffect.Home.Update(navRoute)) } - override fun navigateToRoute(route: String) { - effectSubject.onNext(NavigationEffect.Home.Route(route)) + override fun navigateToRoute(navRoute: NavigationRoute) { + effectSubject.onNext(NavigationEffect.Home.Route(navRoute)) } override fun navigateToTxt2Img() { - navigateToRoute(Constants.ROUTE_TXT_TO_IMG) + navigateToRoute(NavigationRoute.HomeNavigation.TxtToImg) } override fun navigateToImg2Img() { - navigateToRoute(Constants.ROUTE_IMG_TO_IMG) + navigateToRoute(NavigationRoute.HomeNavigation.ImgToImg) } override fun navigateToGallery() { - navigateToRoute(Constants.ROUTE_GALLERY) + navigateToRoute(NavigationRoute.HomeNavigation.Gallery) } override fun navigateToSettings() { - navigateToRoute(Constants.ROUTE_SETTINGS) + navigateToRoute(NavigationRoute.HomeNavigation.Settings) } override fun observe(): Observable = effectSubject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt index 778e211d..847bd098 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt @@ -3,7 +3,6 @@ package com.shifthackz.aisdv1.presentation.navigation.router.main import com.shifthackz.aisdv1.presentation.model.LaunchSource import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.utils.Constants import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject @@ -21,7 +20,6 @@ internal class MainRouterImpl : MainRouter { override fun navigateToOnBoarding(source: LaunchSource) { effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder( - "", navRoute = NavigationRoute.Onboarding(source = source) ) { if (source == LaunchSource.SPLASH) { @@ -33,7 +31,7 @@ internal class MainRouterImpl : MainRouter { } override fun navigateToPostSplashConfigLoader() { - effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder(Constants.ROUTE_CONFIG_LOADER) { + effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder(NavigationRoute.ConfigLoader) { popUpTo(NavigationRoute.Splash) { inclusive = true } @@ -41,7 +39,7 @@ internal class MainRouterImpl : MainRouter { } override fun navigateToHomeScreen() { - effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder(Constants.ROUTE_HOME) { + effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder(NavigationRoute.Home) { popUpTo(0) { inclusive = true } @@ -49,32 +47,39 @@ internal class MainRouterImpl : MainRouter { } override fun navigateToServerSetup(source: LaunchSource) { - effectSubject.onNext(NavigationEffect.Navigate.RouteBuilder("${Constants.ROUTE_SERVER_SETUP}/${source.ordinal}") { - if (source == LaunchSource.SPLASH) { - popUpTo(0) { - inclusive = true + effectSubject.onNext( + NavigationEffect.Navigate.RouteBuilder( + navRoute = NavigationRoute.ServerSetup(source = source) + ) { + if (source == LaunchSource.SPLASH) { + popUpTo(0) { + inclusive = true + } } - } - }) + }) } override fun navigateToGalleryDetails(itemId: Long) { - effectSubject.onNext(NavigationEffect.Navigate.Route("${Constants.ROUTE_GALLERY_DETAIL}/$itemId")) + effectSubject.onNext( + NavigationEffect.Navigate.Route( + navRoute = NavigationRoute.GalleryDetail(itemId = itemId) + ) + ) } override fun navigateToInPaint() { - effectSubject.onNext(NavigationEffect.Navigate.Route(Constants.ROUTE_IN_PAINT)) + effectSubject.onNext(NavigationEffect.Navigate.Route(navRoute = NavigationRoute.InPaint)) } override fun navigateToDonate() { - effectSubject.onNext(NavigationEffect.Navigate.Route(Constants.ROUTE_DONATE)) + effectSubject.onNext(NavigationEffect.Navigate.Route(navRoute = NavigationRoute.Donate)) } override fun navigateToDebugMenu() { - effectSubject.onNext(NavigationEffect.Navigate.Route(Constants.ROUTE_DEBUG)) + effectSubject.onNext(NavigationEffect.Navigate.Route(navRoute = NavigationRoute.Debug)) } override fun navigateToLogger() { - effectSubject.onNext(NavigationEffect.Navigate.Route(Constants.ROUTE_LOGGER)) + effectSubject.onNext(NavigationEffect.Navigate.Route(navRoute = NavigationRoute.Logger)) } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt index df63a4d8..0adc5d90 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt @@ -26,11 +26,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hasRoute import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider import com.shifthackz.aisdv1.core.model.asString import com.shifthackz.aisdv1.core.ui.MviComponent import com.shifthackz.aisdv1.presentation.R import com.shifthackz.aisdv1.presentation.model.NavItem +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.utils.Constants import com.shifthackz.aisdv1.presentation.widget.item.NavigationItemIcon import org.koin.androidx.compose.koinViewModel @@ -40,18 +43,18 @@ import org.koin.compose.koinInject fun DrawerScreen( drawerState: DrawerState = rememberDrawerState(initialValue = DrawerValue.Closed), backStackEntry: NavBackStackEntry? = null, - homeRouteEntry: String? = null, + homeRouteEntry: NavigationRoute? = null, navItems: List = emptyList(), - onRootNavigate: (String) -> Unit = {}, - onHomeNavigate: (String) -> Unit = {}, + onRootNavigate: (NavigationRoute) -> Unit = {}, + onHomeNavigate: (NavigationRoute) -> Unit = {}, content: @Composable () -> Unit, ) { if (navItems.isEmpty()) { return content() } - val currentRootRoute = backStackEntry?.destination?.route - val currentRoute = if (currentRootRoute == Constants.ROUTE_HOME) { - homeRouteEntry ?: Constants.ROUTE_TXT_TO_IMG + val currentRootRoute = backStackEntry?.destination + val currentRoute: Any? = if (currentRootRoute?.hasRoute(NavigationRoute.Home::class) == true) { + homeRouteEntry ?: NavigationRoute.HomeNavigation.TxtToImg } else { currentRootRoute } @@ -64,7 +67,7 @@ fun DrawerScreen( gesturesEnabled = if (drawerState.isOpen) { true } else { - currentRootRoute == Constants.ROUTE_HOME + currentRootRoute?.hasRoute(NavigationRoute.Home::class) == true }, drawerState = drawerState, drawerContent = { @@ -104,8 +107,11 @@ fun DrawerScreen( Spacer(modifier = Modifier.height(32.dp)) navItems.forEach { item -> - val selected = item.route == currentRoute || - item.route == currentRoute?.split("/")?.firstOrNull() + val selected = (currentRoute as? NavigationRoute)?.let { navRoute -> + item.navRoute == navRoute + } ?: (currentRoute as? NavDestination)?.let { destination -> + destination.route?.contains("${item.navRoute}") == true + } ?: false NavigationDrawerItem( modifier = itemModifier.padding(bottom = 4.dp), selected = selected, @@ -118,13 +124,13 @@ fun DrawerScreen( icon = { NavigationItemIcon(item.icon) }, onClick = { if (!selected) { - if (Constants.homeRoutes.any { item.route.startsWith(it) }) { - if (currentRootRoute != Constants.ROUTE_HOME) { - onRootNavigate(Constants.ROUTE_HOME) + if (Constants.homeRoutes.any { homeRoute -> item.navRoute == homeRoute }) { + if (currentRootRoute?.hasRoute(NavigationRoute.Home::class) == false) { + onRootNavigate(NavigationRoute.Home) } - onHomeNavigate(item.route) + onHomeNavigate(item.navRoute) } else { - onRootNavigate(item.route) + onRootNavigate(item.navRoute) } } intentHandler(DrawerIntent.Close) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationEffect.kt deleted file mode 100644 index da059af4..00000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationEffect.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.shifthackz.aisdv1.presentation.screen.home - -//data class HomeNavigationEffect(val route: String) : NavigationEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt index c360cbec..84550d55 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt @@ -1,10 +1,11 @@ package com.shifthackz.aisdv1.presentation.screen.home +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.android.core.mvi.MviIntent sealed interface HomeNavigationIntent : MviIntent { - data class Route(val route: String) : HomeNavigationIntent + data class Route(val navRoute: NavigationRoute) : HomeNavigationIntent - data class Update(val route: String) : HomeNavigationIntent + data class Update(val navRoute: NavigationRoute) : HomeNavigationIntent } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt index a5094b14..4c30dc64 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt @@ -1,9 +1,9 @@ package com.shifthackz.aisdv1.presentation.screen.home import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.presentation.utils.Constants +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -fun AiGenerationResult.Type.mapToRoute(): String = when (this) { - AiGenerationResult.Type.TEXT_TO_IMAGE -> Constants.ROUTE_TXT_TO_IMG - AiGenerationResult.Type.IMAGE_TO_IMAGE -> Constants.ROUTE_IMG_TO_IMG +fun AiGenerationResult.Type.mapToRoute(): NavigationRoute = when (this) { + AiGenerationResult.Type.TEXT_TO_IMAGE -> NavigationRoute.HomeNavigation.TxtToImg + AiGenerationResult.Type.IMAGE_TO_IMAGE -> NavigationRoute.HomeNavigation.ImgToImg } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt index 154fb4da..fa375c10 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState @@ -24,7 +25,7 @@ import androidx.navigation.compose.rememberNavController import com.shifthackz.aisdv1.core.model.asString import com.shifthackz.aisdv1.core.ui.MviComponent import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.utils.Constants +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute.HomeNavigation import com.shifthackz.aisdv1.presentation.widget.connectivity.ConnectivityComposable import com.shifthackz.aisdv1.presentation.widget.item.NavigationItemIcon import org.koin.androidx.compose.koinViewModel @@ -38,18 +39,18 @@ fun HomeNavigationScreen( val viewModel = koinViewModel() val navController = rememberNavController() val backStackEntry = navController.currentBackStackEntryAsState() - val currentRoute = backStackEntry.value?.destination?.route + val currentDestination = backStackEntry.value?.destination - LaunchedEffect(currentRoute) { - if (currentRoute == Constants.ROUTE_TXT_TO_IMG) { - viewModel.processIntent(HomeNavigationIntent.Update(currentRoute)) + LaunchedEffect(currentDestination) { + if (currentDestination?.hasRoute(HomeNavigation.TxtToImg::class) == true) { + viewModel.processIntent(HomeNavigationIntent.Update(HomeNavigation.TxtToImg)) } } MviComponent( viewModel = viewModel, processEffect = { effect -> - navController.navigate(effect.route) { + navController.navigate(effect.navRoute) { navController.graph.startDestinationRoute?.let { route -> popUpTo(route) { saveState = true @@ -66,7 +67,8 @@ fun HomeNavigationScreen( bottomBar = { NavigationBar { navItems.forEach { item -> - val selected = item.route == currentRoute + val selected = + currentDestination?.route?.contains("${item.navRoute}") == true NavigationBarItem( selected = selected, label = { @@ -79,7 +81,7 @@ fun HomeNavigationScreen( selectedIndicatorColor = MaterialTheme.colorScheme.primary, ), icon = { NavigationItemIcon(item.icon) }, - onClick = { processIntent(HomeNavigationIntent.Route(item.route)) }, + onClick = { processIntent(HomeNavigationIntent.Route(item.navRoute)) }, ) } } @@ -99,11 +101,27 @@ fun HomeNavigationScreen( NavHost( modifier = Modifier.fillMaxSize(), navController = navController, - startDestination = navItems.first().route, + startDestination = navItems.first().navRoute, ) { navItems.forEach { item -> - composable(item.route) { - item.content?.invoke() + when (item.navRoute as HomeNavigation) { + HomeNavigation.Gallery -> composable { + item.content?.invoke() + } + + HomeNavigation.TxtToImg -> composable { + item.content?.invoke() + } + + HomeNavigation.ImgToImg -> { + composable { + item.content?.invoke() + } + } + + HomeNavigation.Settings -> composable { + item.content?.invoke() + } } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt index 9070ae1e..a118e1df 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt @@ -42,8 +42,8 @@ class HomeNavigationViewModel( override fun processIntent(intent: HomeNavigationIntent) { when (intent) { - is HomeNavigationIntent.Route -> homeRouter.navigateToRoute(intent.route) - is HomeNavigationIntent.Update -> homeRouter.updateExternallyWithoutNavigation(intent.route) + is HomeNavigationIntent.Route -> homeRouter.navigateToRoute(intent.navRoute) + is HomeNavigationIntent.Update -> homeRouter.updateExternallyWithoutNavigation(intent.navRoute) } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt index 920b3cf1..153a6e0a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt @@ -1,29 +1,11 @@ package com.shifthackz.aisdv1.presentation.utils +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute.HomeNavigation + object Constants { const val PAGINATION_PAYLOAD_SIZE = 1000 const val DEBUG_MENU_ACCESS_TAPS = 7 - const val PARAM_ITEM_ID = "itemId" - const val PARAM_SOURCE = "source" - - //todo: Migrate ROUTES to NavigationRoute - const val ROUTE_SERVER_SETUP = "server_setup" - const val ROUTE_SERVER_SETUP_FULL = "$ROUTE_SERVER_SETUP/{$PARAM_SOURCE}" - const val ROUTE_CONFIG_LOADER = "config_loader" - const val ROUTE_HOME = "home" - const val ROUTE_WEB_UI = "webui" - const val ROUTE_TXT_TO_IMG = "text_to_image" - const val ROUTE_IMG_TO_IMG = "image_to_image" - const val ROUTE_GALLERY = "gallery" - const val ROUTE_GALLERY_DETAIL = "gallery_detail" - const val ROUTE_GALLERY_DETAIL_FULL = "$ROUTE_GALLERY_DETAIL/{$PARAM_ITEM_ID}" - const val ROUTE_SETTINGS = "settings" - const val ROUTE_DEBUG = "debug" - const val ROUTE_LOGGER = "logger" - const val ROUTE_IN_PAINT = "in_paint" - const val ROUTE_DONATE = "donate" - const val SUB_SEED_STRENGTH_MIN = 0f const val SUB_SEED_STRENGTH_MAX = 1f @@ -62,10 +44,10 @@ object Constants { val sizes = listOf("64", "128", "256", "320", "384", "448", "512") val homeRoutes = listOf( - ROUTE_TXT_TO_IMG, - ROUTE_IMG_TO_IMG, - ROUTE_GALLERY, - ROUTE_SETTINGS + HomeNavigation.TxtToImg, + HomeNavigation.ImgToImg, + HomeNavigation.Gallery, + HomeNavigation.Settings, ) fun lora(alias: String) = "" diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt index da2766fb..cfdcc8c6 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt +++ b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt @@ -9,6 +9,7 @@ import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.presentation.core.CoreViewModelInitializeStrategy import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter @@ -95,9 +96,9 @@ class AiStableDiffusionViewModelTest : CoreViewModelTest actual is NavigationEffect.Navigate.RouteBuilder - && actual.route == Constants.ROUTE_CONFIG_LOADER + && actual.navRoute == NavigationRoute.ConfigLoader } } @Test - fun `given user navigates to home screen, expected router emits RoutePopUp event with ROUTE_HOME route`() { + fun `given user navigates to home screen, expected router emits RoutePopUp event with Home route`() { router .observe() .test() .also { router.navigateToHomeScreen() } .assertNoErrors() .assertValueAt(0) { actual -> - val expectedRoute = Constants.ROUTE_HOME + val expectedRoute = NavigationRoute.Home actual is NavigationEffect.Navigate.RouteBuilder - && actual.route == expectedRoute + && actual.navRoute == expectedRoute } } @Test - fun `given user navigates to server setup from splash, expected router emits RouteBuilder event with ROUTE_SERVER_SETUP route and SPLASH source`() { + fun `given user navigates to server setup from splash, expected router emits RouteBuilder event with ServerSetup route and SPLASH source`() { router .observe() .test() .also { router.navigateToServerSetup(LaunchSource.SPLASH) } .assertNoErrors() .assertValueAt(0) { actual -> - val expectedRoute = - "${Constants.ROUTE_SERVER_SETUP}/${LaunchSource.SPLASH.ordinal}" + val expectedRoute = NavigationRoute.ServerSetup(source = LaunchSource.SPLASH) actual is NavigationEffect.Navigate.RouteBuilder - && actual.route == expectedRoute + && actual.navRoute == expectedRoute } } @Test - fun `given user navigates to server setup from settings, expected router emits RouteBuilder event with ROUTE_SERVER_SETUP route and SETTINGS source`() { + fun `given user navigates to server setup from settings, expected router emits RouteBuilder event with ServerSetup route and SETTINGS source`() { router .observe() .test() .also { router.navigateToServerSetup(LaunchSource.SETTINGS) } .assertNoErrors() .assertValueAt(0) { actual -> - val expectedRoute = - "${Constants.ROUTE_SERVER_SETUP}/${LaunchSource.SETTINGS.ordinal}" + val expectedRoute = NavigationRoute.ServerSetup(source = LaunchSource.SETTINGS) actual is NavigationEffect.Navigate.RouteBuilder - && actual.route == expectedRoute + && actual.navRoute == expectedRoute } } @Test - fun `given user navigates to gallery details for item 5598, expected router emits Route event with ROUTE_GALLERY_DETAIL route and id 5598`() { + fun `given user navigates to gallery details for item 5598, expected router emits Route event with GalleryDetail route and id 5598`() { router .observe() .test() @@ -85,12 +83,12 @@ class MainRouterImplTest { .assertNoErrors() .assertValueAt( 0, - NavigationEffect.Navigate.Route("${Constants.ROUTE_GALLERY_DETAIL}/5598"), + NavigationEffect.Navigate.Route(NavigationRoute.GalleryDetail(itemId = 5598L)), ) } @Test - fun `given user navigates to in paint, expected router emits Route event with ROUTE_IN_PAINT route`() { + fun `given user navigates to in paint, expected router emits Route event with InPaint route`() { router .observe() .test() @@ -98,18 +96,18 @@ class MainRouterImplTest { .assertNoErrors() .assertValueAt( 0, - NavigationEffect.Navigate.Route(Constants.ROUTE_IN_PAINT), + NavigationEffect.Navigate.Route(navRoute = NavigationRoute.InPaint), ) } @Test - fun `given user tapped hidden menu 7 times, build is debuggable, expected router emits Route event with ROUTE_DEBUG route`() { + fun `given user tapped hidden menu 7 times, build is debuggable, expected router emits Route event with Debug route`() { val stubObserver = router.observe().test() router.navigateToDebugMenu() stubObserver .assertNoErrors() - .assertValueAt(0, NavigationEffect.Navigate.Route(Constants.ROUTE_DEBUG)) + .assertValueAt(0, NavigationEffect.Navigate.Route(navRoute = NavigationRoute.Debug)) } } From 0aae31c028e83330b340ad9b5567db6b2cb7ac9d Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Sun, 22 Sep 2024 14:17:54 +0300 Subject: [PATCH 3/3] Clean up code --- .../aisdv1/presentation/activity/AiStableDiffusionActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt index 92535155..8ced73d8 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt @@ -85,7 +85,6 @@ class AiStableDiffusionActivity : AppCompatActivity() { } LaunchedEffect(backStackEntry) { - println("TESTING | route=${backStackEntry?.destination?.route}") if (!viewModel.state.value.isShowSplash) return@LaunchedEffect backStackEntry?.let { entry -> if (entry.destination.hasRoute(NavigationRoute.Splash::class)) return@LaunchedEffect