From 703957e2b7a77ef4ccb86a76ed189417833175d2 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Wed, 10 Feb 2021 15:46:58 +0530 Subject: [PATCH 1/8] navigation: do not pass navController to composables Signed-off-by: Aditya Wasan --- .../lobsters/ui/main/MainActivity.kt | 34 +++++++++++-------- .../lobsters/ui/navigation/Destination.kt | 10 ++++++ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt index 9119ff01..4f3dc985 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt @@ -18,7 +18,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavHostController import androidx.navigation.compose.KEY_ROUTE import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -31,13 +30,13 @@ import dev.msfjarvis.lobsters.ui.navigation.Destination import dev.msfjarvis.lobsters.ui.posts.HottestPosts import dev.msfjarvis.lobsters.ui.posts.SavedPosts import dev.msfjarvis.lobsters.ui.theme.LobstersTheme -import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher +import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel import dev.msfjarvis.lobsters.util.IconResource +import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import javax.inject.Inject @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -64,12 +63,24 @@ fun LobstersApp() { val savedPosts by viewModel.savedPosts.collectAsState() val hottestPostsListState = rememberLazyListState() + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = + navBackStackEntry?.arguments?.getString(KEY_ROUTE) ?: Destination.startDestination.route + val currentDestination = Destination.getDestinationFromRoute(currentRoute) + val navigateToDestination: (destination: Destination) -> Unit = { destination -> + navController.navigate(destination.route) { + launchSingleTop = true + popUpTo(navController.graph.startDestination) { inclusive = false } + } + } + Scaffold( bottomBar = { LobstersBottomNav( - navController, hottestPostsListState, coroutineScope, + currentDestination, + navigateToDestination, ) }, ) { innerPadding -> @@ -96,14 +107,12 @@ fun LobstersApp() { @Composable fun LobstersBottomNav( - navController: NavHostController, hottestPostsListState: LazyListState, coroutineScope: CoroutineScope, + currentDestination: Destination, + navigateToDestination: (destination: Destination) -> Unit, ) { BottomNavigation { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = - navBackStackEntry?.arguments?.getString(KEY_ROUTE) ?: Destination.startDestination.route Destination.values().forEach { screen -> BottomNavigationItem( icon = { @@ -113,14 +122,11 @@ fun LobstersBottomNav( ) }, label = { Text(stringResource(id = screen.labelRes)) }, - selected = currentRoute == screen.route, + selected = currentDestination == screen, alwaysShowLabels = false, onClick = { - if (screen.route != currentRoute) { - navController.navigate(screen.route) { - launchSingleTop = true - popUpTo(navController.graph.startDestination) { inclusive = false } - } + if (screen != currentDestination) { + navigateToDestination(screen) } else if (screen.route == Destination.Hottest.route) { coroutineScope.launch { hottestPostsListState.snapToItemIndex(0) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt index 083c0763..c4ad34f2 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt @@ -18,5 +18,15 @@ enum class Destination( companion object { val startDestination = Hottest + + fun getDestinationFromRoute(route: String): Destination { + values().forEach { + if (it.route == route) { + return it + } + } + + throw IllegalStateException("Incorrect route passed") + } } } From 98866ee4070f4888e933b4795d73862fe171139f Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Wed, 10 Feb 2021 18:03:56 +0530 Subject: [PATCH 2/8] Simplify getDestinationFromRoute Signed-off-by: Harsh Shandilya --- .../dev/msfjarvis/lobsters/ui/navigation/Destination.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt index c4ad34f2..ba0c5901 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt @@ -20,13 +20,7 @@ enum class Destination( val startDestination = Hottest fun getDestinationFromRoute(route: String): Destination { - values().forEach { - if (it.route == route) { - return it - } - } - - throw IllegalStateException("Incorrect route passed") + return values().firstOrNull { it.route == route } ?: error("Incorrect route password") } } } From 1a6174b1c8ade57e5069735b60f1138226cf70c8 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Wed, 10 Feb 2021 18:44:04 +0530 Subject: [PATCH 3/8] fix typo --- .../java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt index ba0c5901..44d5708a 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt @@ -20,7 +20,7 @@ enum class Destination( val startDestination = Hottest fun getDestinationFromRoute(route: String): Destination { - return values().firstOrNull { it.route == route } ?: error("Incorrect route password") + return values().firstOrNull { it.route == route } ?: error("Incorrect route passed") } } } From aff52e7d5f6254a87d1d309f73d7ebedb49fb146 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 11 Feb 2021 16:46:50 +0530 Subject: [PATCH 4/8] all: reformat Signed-off-by: Harsh Shandilya --- .../lobsters/ui/viewmodel/LobstersViewModel.kt | 2 +- buildSrc/src/main/java/BaseProjectConfig.kt | 12 ++++++------ buildSrc/src/main/java/Dependencies.kt | 6 ++++-- buildSrc/src/main/java/SigningConfig.kt | 2 +- buildSrc/src/main/java/VersioningPlugin.kt | 4 ++-- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt index e63564fc..043006ce 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt @@ -9,12 +9,12 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.msfjarvis.lobsters.data.local.LobstersPost import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource import dev.msfjarvis.lobsters.data.repo.LobstersRepository +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class LobstersViewModel @Inject constructor( diff --git a/buildSrc/src/main/java/BaseProjectConfig.kt b/buildSrc/src/main/java/BaseProjectConfig.kt index 09c8729d..de70edec 100644 --- a/buildSrc/src/main/java/BaseProjectConfig.kt +++ b/buildSrc/src/main/java/BaseProjectConfig.kt @@ -39,12 +39,12 @@ internal fun Project.configureForAllProjects() { google() mavenCentral() jcenter() { - content { - // Indirect dependencies - // https://youtrack.jetbrains.com/issue/IDEA-261387 - includeModule("org.jetbrains.trove4j", "trove4j") - includeGroup("org.jetbrains.kotlinx") - } + content { + // Indirect dependencies + // https://youtrack.jetbrains.com/issue/IDEA-261387 + includeModule("org.jetbrains.trove4j", "trove4j") + includeGroup("org.jetbrains.kotlinx") + } } } tasks.withType { diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index d1cded46..acd130ea 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -8,7 +8,8 @@ private const val DAGGER_HILT_VERSION = "2.32-alpha" object Plugins { const val androidGradlePlugin = "com.android.tools.build:gradle:7.0.0-alpha05" const val androidGradlePlugin_lintModel = "com.android.tools.lint:lint-model:30.0.0-alpha05" - const val daggerGradlePlugin = "com.google.dagger:hilt-android-gradle-plugin:${DAGGER_HILT_VERSION}" + const val daggerGradlePlugin = + "com.google.dagger:hilt-android-gradle-plugin:${DAGGER_HILT_VERSION}" const val kotlinGradlePlugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.30" const val jsemver = "com.github.zafarkhaja:java-semver:0.9.0" const val sqldelightGradlePlugin = "com.squareup.sqldelight:gradle-plugin:1.4.4" @@ -37,7 +38,8 @@ object Dependencies { const val activity = "androidx.activity:activity-compose:1.3.0-alpha02" const val compiler = "androidx.compose.compiler:compiler:$COMPOSE_VERSION" - const val constraintLayout = "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02" + const val constraintLayout = + "androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02" const val foundation = "androidx.compose.foundation:foundation:$COMPOSE_VERSION" const val foundationLayout = "androidx.compose.foundation:foundation-layout:$COMPOSE_VERSION" const val lifecycleViewModel = "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" diff --git a/buildSrc/src/main/java/SigningConfig.kt b/buildSrc/src/main/java/SigningConfig.kt index 50b86c47..74979f72 100644 --- a/buildSrc/src/main/java/SigningConfig.kt +++ b/buildSrc/src/main/java/SigningConfig.kt @@ -4,8 +4,8 @@ */ import com.android.build.gradle.internal.dsl.BaseAppModuleExtension -import org.gradle.api.Project import java.util.* +import org.gradle.api.Project private const val KEYSTORE_CONFIG_PATH = "keystore.properties" diff --git a/buildSrc/src/main/java/VersioningPlugin.kt b/buildSrc/src/main/java/VersioningPlugin.kt index 8601f7f1..cbf0ea69 100644 --- a/buildSrc/src/main/java/VersioningPlugin.kt +++ b/buildSrc/src/main/java/VersioningPlugin.kt @@ -6,10 +6,10 @@ import com.android.build.gradle.internal.plugins.AppPlugin import com.github.zafarkhaja.semver.Version -import org.gradle.api.Plugin -import org.gradle.api.Project import java.io.OutputStream import java.util.* +import org.gradle.api.Plugin +import org.gradle.api.Project private const val VERSIONING_PROP_FILE = "version.properties" private const val VERSIONING_PROP_VERSION_NAME = "versioning-plugin.versionName" From 97eaf20dbc9942d0895488760dce3528c2cdb1bf Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 28 Jan 2021 13:58:00 +0530 Subject: [PATCH 5/8] build(app): add compose testing dependencies Signed-off-by: Harsh Shandilya --- app/build.gradle.kts | 3 ++- buildSrc/src/main/java/Dependencies.kt | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5423777d..c61d32fd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(Dependencies.ThirdParty.accompanist) implementation(Dependencies.ThirdParty.Moshi.lib) testImplementation(Dependencies.Testing.junit) + androidTestImplementation(Dependencies.AndroidX.Compose.activity) androidTestImplementation(Dependencies.Testing.daggerHilt) - androidTestImplementation(Dependencies.Testing.uiTest) + androidTestImplementation(Dependencies.Testing.AndroidX.Compose.uiTestJunit4) } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index acd130ea..b25d0c2b 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -96,13 +96,16 @@ object Dependencies { const val daggerHilt = "com.google.dagger:hilt-android-testing:$DAGGER_HILT_VERSION" const val junit = "junit:junit:4.13.1" const val mockWebServer = "com.squareup.okhttp3:mockwebserver3-junit4:5.0.0-alpha.2" - const val uiTest = "androidx.compose.ui:ui-test:$COMPOSE_VERSION" object AndroidX { private const val version = "1.3.1-alpha02" const val runner = "androidx.test:runner:$version" - const val rules = "androidx.test:rules:$version" + + object Compose { + + const val uiTestJunit4 = "androidx.compose.ui:ui-test-junit4:$COMPOSE_VERSION" + } } } } From 7da2cfd4565d8e84fdc97b823936ae9edd6b8355 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 28 Jan 2021 14:11:18 +0530 Subject: [PATCH 6/8] buildSrc: exclude duplicate license file from packaging Signed-off-by: Harsh Shandilya --- buildSrc/src/main/java/BaseProjectConfig.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildSrc/src/main/java/BaseProjectConfig.kt b/buildSrc/src/main/java/BaseProjectConfig.kt index de70edec..f298d778 100644 --- a/buildSrc/src/main/java/BaseProjectConfig.kt +++ b/buildSrc/src/main/java/BaseProjectConfig.kt @@ -107,6 +107,8 @@ internal fun TestedExtension.configureCommonAndroidOptions() { exclude("**/*.txt") exclude("**/*.kotlin_module") exclude("**/plugin.properties") + exclude("META-INF/AL2.0") + exclude("META-INF/LGPL2.1") } compileOptions { From 91cfb0b2d250c1c84ebe9cfbd1a9dd7e83cc51c9 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 28 Jan 2021 15:02:56 +0530 Subject: [PATCH 7/8] github: prep for running instrumentation tests Signed-off-by: Harsh Shandilya --- .github/workflows/pull_request.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index def00d26..ac600ff2 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -18,13 +18,24 @@ jobs: with: java-version: '11' - name: Checkout repository - uses: actions/checkout@c952173edf28a2bd22e1a4926590c1ac39630461 + uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - - uses: burrunan/gradle-cache-action@v1 + - uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6 name: Run unit tests with: arguments: testDebug --stacktrace + - name: Run instrumentation tests + uses: reactivecircus/android-emulator-runner@08b092e904025fada32a01b711af1e7ff7b7a4a3 + with: + api-level: 23 + target: default + script: | + adb shell settings put global animator_duration_scale 0 + adb shell settings put global transition_animation_scale 0 + adb shell settings put global window_animation_scale 0 + ./gradlew :app:connectedDebugAndroidTest + - name: (Fail-only) upload test report if: failure() uses: actions/upload-artifact@27bce4eee761b5bc643f46a8dfb41b430c8d05f6 From 25b3ad4f8e860e6d6e2d973c2a37251622e63130 Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Fri, 12 Feb 2021 13:24:38 +0530 Subject: [PATCH 8/8] Add test for BottomNavigationLayout Signed-off-by: Aditya Wasan --- .../lobsters/BottomNavigationLayoutTest.kt | 115 ++++++++++++++++++ .../lobsters/ui/main/MainActivity.kt | 20 +-- 2 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 app/src/androidTest/java/dev/msfjarvis/lobsters/BottomNavigationLayoutTest.kt diff --git a/app/src/androidTest/java/dev/msfjarvis/lobsters/BottomNavigationLayoutTest.kt b/app/src/androidTest/java/dev/msfjarvis/lobsters/BottomNavigationLayoutTest.kt new file mode 100644 index 00000000..d5aa53e2 --- /dev/null +++ b/app/src/androidTest/java/dev/msfjarvis/lobsters/BottomNavigationLayoutTest.kt @@ -0,0 +1,115 @@ +package dev.msfjarvis.lobsters + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.test.assertContentDescriptionEquals +import androidx.compose.ui.test.assertCountEquals +import androidx.compose.ui.test.assertHasClickAction +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsNotSelected +import androidx.compose.ui.test.assertIsSelected +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onChildAt +import androidx.compose.ui.test.onChildren +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import dev.msfjarvis.lobsters.ui.main.LobstersBottomNav +import dev.msfjarvis.lobsters.ui.navigation.Destination +import dev.msfjarvis.lobsters.ui.theme.LobstersTheme +import org.junit.Before +import org.junit.Rule +import org.junit.Test + + +class BottomNavigationLayoutTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Before + fun setUp() { + composeTestRule.setContent { + LobstersTheme { + var mutableDestination by remember { mutableStateOf(Destination.startDestination) } + + LobstersBottomNav( + currentDestination = mutableDestination, + navigateToDestination = { mutableDestination = it }, + jumpToIndex = {} + ) + } + } + } + + @Test + fun bottomNavItemCountTest() { + // Test to make sure total items are equal to enum objects present in Destination + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildren() + .assertCountEquals(Destination.values().size) + } + + @Test + fun bottomNavItemTest() { + // Check hottest BottomNavItem is rendered correctly + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildAt(0) + .assertTextEquals("Hottest") + .assertContentDescriptionEquals("Hottest") + .assertHasClickAction() + + // Check saved BottomNavItem is rendered correctly + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildAt(1) + .assertTextEquals("Saved") + .assertContentDescriptionEquals("Saved") + .assertHasClickAction() + } + + @Test + fun bottomNavItemSelectedTest() { + // Check hottest BottomNav item is selected + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildAt(0) + .assertIsSelected() + .assertTextEquals("Hottest") + + // Check saved BottomNav item is not selected + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildAt(1) + .assertIsNotSelected() + + // Select the saved BottomNav item + composeTestRule.onNodeWithTag("LobstersBottomNav") + .onChildAt(1) + .performClick() + + // Check hottest BottomNav item is not selected + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildAt(0) + .assertIsNotSelected() + + // Check saved BottomNav item is selected + composeTestRule.onNodeWithTag("LobstersBottomNav") + .assertExists() + .assertIsDisplayed() + .onChildAt(1) + .assertIsSelected() + .assertTextEquals("Saved") + } +} diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt index 4f3dc985..e85fccc2 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt @@ -4,7 +4,6 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem @@ -16,6 +15,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.KEY_ROUTE @@ -35,7 +35,6 @@ import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel import dev.msfjarvis.lobsters.util.IconResource import javax.inject.Inject -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @AndroidEntryPoint @@ -73,14 +72,18 @@ fun LobstersApp() { popUpTo(navController.graph.startDestination) { inclusive = false } } } + val jumpToIndex: (Int) -> Unit = { + coroutineScope.launch { + hottestPostsListState.snapToItemIndex(it) + } + } Scaffold( bottomBar = { LobstersBottomNav( - hottestPostsListState, - coroutineScope, currentDestination, navigateToDestination, + jumpToIndex, ) }, ) { innerPadding -> @@ -107,12 +110,11 @@ fun LobstersApp() { @Composable fun LobstersBottomNav( - hottestPostsListState: LazyListState, - coroutineScope: CoroutineScope, currentDestination: Destination, navigateToDestination: (destination: Destination) -> Unit, + jumpToIndex: (index: Int) -> Unit, ) { - BottomNavigation { + BottomNavigation(modifier = Modifier.testTag("LobstersBottomNav")) { Destination.values().forEach { screen -> BottomNavigationItem( icon = { @@ -128,9 +130,7 @@ fun LobstersBottomNav( if (screen != currentDestination) { navigateToDestination(screen) } else if (screen.route == Destination.Hottest.route) { - coroutineScope.launch { - hottestPostsListState.snapToItemIndex(0) - } + jumpToIndex(0) } } )