Skip to content

Commit 2a7449c

Browse files
committed
[#617] Replace log with timber, rename callback, remove serializable from home, and move destination to screens
1 parent 5a85ea0 commit 2a7449c

File tree

11 files changed

+52
-44
lines changed

11 files changed

+52
-44
lines changed

sample-compose/app/src/androidTest/java/co/nimblehq/sample/compose/ui/screens/main/home/HomeScreenTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import co.nimblehq.sample.compose.test.MockUtil
1515
import co.nimblehq.sample.compose.test.TestDispatchersProvider
1616
import co.nimblehq.sample.compose.ui.screens.FakeNavigator
1717
import co.nimblehq.sample.compose.ui.screens.MainActivity
18-
import co.nimblehq.sample.compose.ui.screens.main.MainDestination
18+
import co.nimblehq.sample.compose.ui.screens.main.second.Second
1919
import co.nimblehq.sample.compose.ui.theme.ComposeTheme
2020
import io.mockk.every
2121
import io.mockk.mockk
@@ -74,7 +74,7 @@ class HomeScreenTest {
7474
fun when_clicking_on_a_list_item__it_navigates_to_Second_screen() = initComposable {
7575
onNodeWithText("1").performClick()
7676

77-
assertEquals("1", (fakeNavigator.currentScreen() as? MainDestination.Second)?.id)
77+
assertEquals("1", (fakeNavigator.currentScreen() as? Second)?.id)
7878
}
7979

8080
private fun initComposable(

sample-compose/app/src/main/java/co/nimblehq/sample/compose/di/modules/main/MainActivityModule.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import co.nimblehq.sample.compose.extensions.showToast
77
import co.nimblehq.sample.compose.navigation.EntryProviderInstaller
88
import co.nimblehq.sample.compose.navigation.Navigator
99
import co.nimblehq.sample.compose.navigation.NavigatorImpl
10-
import co.nimblehq.sample.compose.ui.screens.main.MainDestination
10+
import co.nimblehq.sample.compose.ui.screens.main.home.Home
1111
import co.nimblehq.sample.compose.ui.screens.main.home.HomeScreen
12+
import co.nimblehq.sample.compose.ui.screens.main.second.Second
1213
import co.nimblehq.sample.compose.ui.screens.main.second.SecondScreen
14+
import co.nimblehq.sample.compose.ui.screens.main.third.Third
1315
import co.nimblehq.sample.compose.ui.screens.main.third.ThirdScreen
1416
import co.nimblehq.sample.compose.util.LocalResultEventBus
1517
import co.nimblehq.sample.compose.util.ResultEffect
@@ -26,13 +28,13 @@ object MainActivityModule {
2628

2729
@Provides
2830
@ActivityRetainedScoped
29-
fun provideNavigator(): Navigator = NavigatorImpl(startDestination = MainDestination.Home)
31+
fun provideNavigator(): Navigator = NavigatorImpl(startDestination = Home)
3032

3133
@IntoSet
3234
@Provides
3335
fun provideEntryProviderInstaller(navigator: Navigator): EntryProviderInstaller =
3436
{
35-
entry<MainDestination.Home> {
37+
entry<Home> {
3638
val eventBus = LocalResultEventBus.current
3739
val context = LocalContext.current
3840

@@ -49,21 +51,21 @@ object MainActivityModule {
4951
)
5052
}
5153

52-
entry<MainDestination.Second> { key ->
54+
entry<Second> { key ->
5355
val eventBus = LocalResultEventBus.current
5456

5557
SecondScreen(
5658
id = key.id,
5759
navigator = navigator,
5860
viewModel = hiltViewModel(),
59-
onUpdate = {
61+
onUpdateClick = {
6062
eventBus.sendResult<Boolean>(result = true)
6163
navigator.goBack()
6264
}
6365
)
6466
}
6567

66-
entry<MainDestination.Third> { key ->
68+
entry<Third> { key ->
6769
ThirdScreen(
6870
model = key.model,
6971
navigator = navigator,

sample-compose/app/src/main/java/co/nimblehq/sample/compose/ui/screens/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import co.nimblehq.sample.compose.extensions.setEdgeToEdgeConfig
2020
import co.nimblehq.sample.compose.navigation.EntryProviderInstaller
2121
import co.nimblehq.sample.compose.navigation.Navigator
2222
import co.nimblehq.sample.compose.ui.common.URL_SECOND_SCREEN
23-
import co.nimblehq.sample.compose.ui.screens.main.MainDestination
23+
import co.nimblehq.sample.compose.ui.screens.main.second.Second
2424
import co.nimblehq.sample.compose.ui.theme.ComposeTheme
2525
import co.nimblehq.sample.compose.util.DeepLinkMatcher
2626
import co.nimblehq.sample.compose.util.DeepLinkPattern
@@ -43,7 +43,7 @@ class MainActivity : ComponentActivity() {
4343
lateinit var entryProviderScopes: Set<@JvmSuppressWildcards EntryProviderInstaller>
4444

4545
internal val deepLinkPatterns: List<DeepLinkPattern<out Any>> = listOf(
46-
DeepLinkPattern(MainDestination.Second.serializer(), URL_SECOND_SCREEN.toUri()),
46+
DeepLinkPattern(Second.serializer(), URL_SECOND_SCREEN.toUri()),
4747
)
4848

4949
override fun onCreate(savedInstanceState: Bundle?) {

sample-compose/app/src/main/java/co/nimblehq/sample/compose/ui/screens/main/MainDestination.kt

Lines changed: 0 additions & 16 deletions
This file was deleted.

sample-compose/app/src/main/java/co/nimblehq/sample/compose/ui/screens/main/home/HomeScreen.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.ui.platform.LocalContext
1515
import androidx.compose.ui.tooling.preview.Preview
1616
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
1717
import androidx.lifecycle.compose.collectAsStateWithLifecycle
18+
import androidx.navigation3.runtime.NavKey
1819
import co.nimblehq.sample.compose.R
1920
import co.nimblehq.sample.compose.extensions.collectAsEffect
2021
import co.nimblehq.sample.compose.extensions.showToast
@@ -32,6 +33,8 @@ import com.google.accompanist.permissions.shouldShowRationale
3233
import kotlinx.collections.immutable.ImmutableList
3334
import kotlinx.collections.immutable.persistentListOf
3435

36+
data object Home : NavKey
37+
3538
@Composable
3639
fun HomeScreen(
3740
navigator: Navigator,

sample-compose/app/src/main/java/co/nimblehq/sample/compose/ui/screens/main/home/HomeViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import co.nimblehq.sample.compose.domain.usecases.UpdateFirstTimeLaunchPreferenc
77
import co.nimblehq.sample.compose.ui.base.BaseViewModel
88
import co.nimblehq.sample.compose.ui.models.UiModel
99
import co.nimblehq.sample.compose.ui.models.toUiModel
10-
import co.nimblehq.sample.compose.ui.screens.main.MainDestination
10+
import co.nimblehq.sample.compose.ui.screens.main.second.Second
11+
import co.nimblehq.sample.compose.ui.screens.main.third.Third
1112
import co.nimblehq.sample.compose.util.DispatchersProvider
1213
import dagger.hilt.android.lifecycle.HiltViewModel
1314
import kotlinx.collections.immutable.ImmutableList
@@ -63,10 +64,10 @@ class HomeViewModel @Inject constructor(
6364
}
6465

6566
fun navigateToSecond(uiModel: UiModel) {
66-
launch { _navigator.emit(MainDestination.Second(uiModel.id)) }
67+
launch { _navigator.emit(Second(uiModel.id)) }
6768
}
6869

6970
fun navigateToThird(uiModel: UiModel) {
70-
launch { _navigator.emit(MainDestination.Third(uiModel)) }
71+
launch { _navigator.emit(Third(uiModel)) }
7172
}
7273
}

sample-compose/app/src/main/java/co/nimblehq/sample/compose/ui/screens/main/second/SecondScreen.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,31 @@ import androidx.compose.ui.Modifier
1313
import androidx.compose.ui.res.stringResource
1414
import androidx.compose.ui.tooling.preview.Preview
1515
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
16+
import androidx.navigation3.runtime.NavKey
1617
import co.nimblehq.sample.compose.R
1718
import co.nimblehq.sample.compose.navigation.Navigator
1819
import co.nimblehq.sample.compose.ui.base.BaseScreen
1920
import co.nimblehq.sample.compose.ui.common.AppBar
2021
import co.nimblehq.sample.compose.ui.theme.AppTheme.dimensions
2122
import co.nimblehq.sample.compose.ui.theme.ComposeTheme
23+
import kotlinx.serialization.Serializable
24+
25+
@Serializable
26+
data class Second(val id: String) : NavKey
2227

2328
@Suppress("UnusedPrivateMember")
2429
@Composable
2530
fun SecondScreen(
2631
id: String,
2732
navigator: Navigator,
2833
viewModel: SecondViewModel = hiltViewModel(),
29-
onUpdate: () -> Unit = {},
34+
onUpdateClick: () -> Unit = {},
3035
) = BaseScreen(
3136
isDarkStatusBarIcons = false,
3237
) {
3338
SecondScreenContent(
3439
id = id,
35-
onUpdateClick = onUpdate,
40+
onUpdateClick = onUpdateClick,
3641
)
3742
}
3843

sample-compose/app/src/main/java/co/nimblehq/sample/compose/ui/screens/main/third/ThirdScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,17 @@ import androidx.compose.ui.res.stringResource
1212
import androidx.compose.ui.text.style.TextAlign
1313
import androidx.compose.ui.tooling.preview.Preview
1414
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
15+
import androidx.navigation3.runtime.NavKey
1516
import co.nimblehq.sample.compose.R
1617
import co.nimblehq.sample.compose.navigation.Navigator
1718
import co.nimblehq.sample.compose.ui.base.BaseScreen
1819
import co.nimblehq.sample.compose.ui.common.AppBar
1920
import co.nimblehq.sample.compose.ui.models.UiModel
2021
import co.nimblehq.sample.compose.ui.theme.ComposeTheme
22+
import kotlinx.serialization.Serializable
23+
24+
@Serializable
25+
data class Third(val model: UiModel) : NavKey
2126

2227
@Suppress("UnusedPrivateMember")
2328
@Composable

sample-compose/app/src/main/java/co/nimblehq/sample/compose/util/DeepLinkMatcher.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package co.nimblehq.sample.compose.util
22

3-
import android.util.Log
43
import kotlinx.serialization.KSerializer
4+
import timber.log.Timber
55

66
internal class DeepLinkMatcher<T : Any>(
77
val request: DeepLinkRequest,
@@ -35,7 +35,7 @@ internal class DeepLinkMatcher<T : Any>(
3535
val parsedValue = try {
3636
candidateSegment.typeParser.invoke(requestedSegment)
3737
} catch (e: IllegalArgumentException) {
38-
Log.e(TAG_LOG_ERROR, "Failed to parse path value:[$requestedSegment].", e)
38+
Timber.e(e, "Failed to parse path value:[$requestedSegment].")
3939
return null
4040
}
4141
args[candidateSegment.stringValue] = parsedValue
@@ -52,7 +52,7 @@ internal class DeepLinkMatcher<T : Any>(
5252
val queryParsedValue = try {
5353
queryStringParser.invoke(query.value)
5454
} catch (e: IllegalArgumentException) {
55-
Log.e(TAG_LOG_ERROR, "Failed to parse query name:[$name] value:[${query.value}].", e)
55+
Timber.e(e, "Failed to parse query name:[$name] value:[${query.value}].")
5656
return null
5757
}
5858
args[name] = queryParsedValue
@@ -77,5 +77,3 @@ internal data class DeepLinkMatchResult<T : Any>(
7777
val serializer: KSerializer<T>,
7878
val args: Map<String, Any>,
7979
)
80-
81-
const val TAG_LOG_ERROR = "SampleComposeDeepLink"

sample-compose/app/src/test/java/co/nimblehq/sample/compose/ui/screens/main/home/HomeScreenTest.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,35 @@
11
package co.nimblehq.sample.compose.ui.screens.main.home
22

33
import androidx.activity.compose.setContent
4-
import androidx.compose.ui.test.*
4+
import androidx.compose.ui.test.assertIsDisplayed
55
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
66
import androidx.compose.ui.test.junit4.createAndroidComposeRule
7+
import androidx.compose.ui.test.onNodeWithText
8+
import androidx.compose.ui.test.performClick
79
import androidx.test.ext.junit.rules.ActivityScenarioRule
810
import androidx.test.rule.GrantPermissionRule
911
import co.nimblehq.sample.compose.R
10-
import co.nimblehq.sample.compose.domain.usecases.*
12+
import co.nimblehq.sample.compose.domain.usecases.GetModelsUseCase
13+
import co.nimblehq.sample.compose.domain.usecases.IsFirstTimeLaunchPreferencesUseCase
14+
import co.nimblehq.sample.compose.domain.usecases.UpdateFirstTimeLaunchPreferencesUseCase
1115
import co.nimblehq.sample.compose.test.MockUtil
1216
import co.nimblehq.sample.compose.ui.screens.BaseScreenTest
1317
import co.nimblehq.sample.compose.ui.screens.FakeNavigator
1418
import co.nimblehq.sample.compose.ui.screens.MainActivity
15-
import co.nimblehq.sample.compose.ui.screens.main.MainDestination
19+
import co.nimblehq.sample.compose.ui.screens.main.second.Second
1620
import co.nimblehq.sample.compose.ui.theme.ComposeTheme
1721
import io.kotest.matchers.shouldBe
18-
import io.mockk.*
22+
import io.mockk.Runs
23+
import io.mockk.coEvery
24+
import io.mockk.every
25+
import io.mockk.just
26+
import io.mockk.mockk
1927
import kotlinx.coroutines.flow.flow
2028
import kotlinx.coroutines.flow.flowOf
21-
import org.junit.*
2229
import org.junit.Assert.assertEquals
30+
import org.junit.Before
31+
import org.junit.Rule
32+
import org.junit.Test
2333
import org.junit.runner.RunWith
2434
import org.robolectric.RobolectricTestRunner
2535
import org.robolectric.shadows.ShadowToast
@@ -106,7 +116,7 @@ class HomeScreenTest : BaseScreenTest() {
106116
fun `When clicking on a list item, it navigates to Second screen`() = initComposable {
107117
onNodeWithText("1").performClick()
108118

109-
assertEquals("1", (fakeNavigator.currentScreen() as? MainDestination.Second)?.id)
119+
assertEquals("1", (fakeNavigator.currentScreen() as? Second)?.id)
110120
}
111121

112122
private fun initComposable(

0 commit comments

Comments
 (0)