diff --git a/android/build.gradle.kts b/android/build.gradle.kts index f28c58b4..6e254fd3 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -37,6 +37,8 @@ dependencies { implementation(libs.androidx.paging.compose) implementation(libs.copydown) implementation(libs.dagger.hilt.android) + implementation(libs.material.motion.core) + implementation(libs.material.motion.navigation) implementation(libs.sqldelight.extensions.coroutines) implementation(libs.kotlin.coroutines.core) implementation(libs.kotlinx.serialization.json) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 44d76491..3709497c 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -1,5 +1,6 @@ package dev.msfjarvis.claw.android.ui +import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState @@ -25,9 +26,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavType -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import androidx.navigation.navDeepLink import androidx.paging.compose.collectAsLazyPagingItems @@ -48,8 +46,15 @@ import dev.msfjarvis.claw.common.res.ClawIcons import dev.msfjarvis.claw.common.theme.LobstersTheme import dev.msfjarvis.claw.common.urllauncher.UrlLauncher import kotlinx.coroutines.launch +import soup.compose.material.motion.materialElevationScaleIn +import soup.compose.material.motion.materialElevationScaleOut +import soup.compose.material.motion.navigation.MaterialMotionNavHost +import soup.compose.material.motion.navigation.composable +import soup.compose.material.motion.navigation.rememberMaterialMotionNavController +import soup.compose.material.motion.translateXIn +import soup.compose.material.motion.translateXOut -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class) @Composable fun LobstersApp( viewModel: ClawViewModel = viewModel(), @@ -61,7 +66,7 @@ fun LobstersApp( val hottestListState = rememberLazyListState() val newestListState = rememberLazyListState() val savedListState = rememberLazyListState() - val navController = rememberNavController() + val navController = rememberMaterialMotionNavController() val coroutineScope = rememberCoroutineScope() val postActions = rememberPostActions(urlLauncher, navController, viewModel) val currentDestination by currentNavigationDestination(navController) @@ -142,7 +147,7 @@ fun LobstersApp( ) }, ) { paddingValues -> - NavHost( + MaterialMotionNavHost( navController, startDestination = Destinations.startDestination.getRoute(), ) { @@ -193,6 +198,10 @@ fun LobstersApp( navDeepLink { uriPattern = "$uri/s/{postId}/.*" }, navDeepLink { uriPattern = "$uri/s/{postId}" }, ), + enterMotionSpec = { translateXIn { it } }, + exitMotionSpec = { materialElevationScaleOut() }, + popEnterMotionSpec = { materialElevationScaleIn() }, + popExitMotionSpec = { translateXOut { it } }, ) { backStackEntry -> val postId = requireNotNull(backStackEntry.arguments?.getString("postId")) setWebUri("https://lobste.rs/s/$postId") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f4d5115..ae56a3bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,6 +5,7 @@ coroutines = "1.6.1" dagger = "2.41" hilt = "1.0.0" kotlin = "1.6.10" +material_motion = "0.8.4" richtext = "0.11.0" serialization = "1.3.2" sqldelight = "2.0.0-alpha02" @@ -45,6 +46,8 @@ kamel-image = "com.alialbaali.kamel:kamel-image:0.3.0" kotlin-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } +material_motion-core = { module = "io.github.fornewid:material-motion-compose-core", version.ref = "material_motion" } +material_motion-navigation = { module = "io.github.fornewid:material-motion-compose-navigation", version.ref = "material_motion" } multiplatform-paging = "io.github.kuuuurt:multiplatform-paging:0.4.7" napier = "io.github.aakira:napier:2.5.0" r8 = "com.android.tools:r8:3.3.28"