Skip to content

Commit 6123de5

Browse files
committed
Refactor navigation with parcelable data
1 parent 813a2ea commit 6123de5

File tree

13 files changed

+74
-62
lines changed

13 files changed

+74
-62
lines changed

common/presentation/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ dependencies {
5252
implementation(commonPresentationLibs.ui.graphics)
5353
implementation(commonPresentationLibs.ui.tooling.preview)
5454
implementation(commonPresentationLibs.material3)
55+
implementation(commonPresentationLibs.navigation.common.ktx)
56+
implementation(commonPresentationLibs.gson)
5557
debugImplementation(commonPresentationLibs.ui.tooling)
5658
debugImplementation(commonPresentationLibs.ui.test.manifest)
5759
androidTestImplementation(commonPresentationLibs.ui.test.junit4)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.emirhanemmez.common.presentation.util
2+
3+
import com.google.gson.Gson
4+
5+
object GsonHelper {
6+
private var gson: Gson? = null
7+
8+
fun gson(): Gson {
9+
if (gson == null)
10+
gson = Gson()
11+
return gson!!
12+
}
13+
14+
fun clear() {
15+
gson = null
16+
}
17+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.emirhanemmez.common.presentation.util
2+
3+
import android.os.Bundle
4+
import android.os.Parcelable
5+
import androidx.navigation.NavType
6+
import com.emirhanemmez.common.presentation.util.extension.getSafeParcelable
7+
8+
class ParcelableType<T : Parcelable>(
9+
private val clazz: Class<T>
10+
) : NavType<T>(isNullableAllowed = true) {
11+
12+
override fun get(bundle: Bundle, key: String): T? =
13+
bundle.getSafeParcelable(key, clazz)
14+
15+
override fun parseValue(value: String): T =
16+
GsonHelper.gson().fromJson(value, clazz)
17+
18+
override fun put(bundle: Bundle, key: String, value: T) {
19+
GsonHelper.clear()
20+
bundle.putParcelable(key, value)
21+
}
22+
}

common/presentation/src/main/java/com/emirhanemmez/common/presentation/util/extension/NavExtensions.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.emirhanemmez.common.presentation.util.extension
22

3+
import android.net.Uri
34
import android.os.Build
45
import android.os.Bundle
56
import android.os.Parcelable
7+
import com.emirhanemmez.common.presentation.util.GsonHelper
68

79
@Suppress("DEPRECATION")
810
fun <T : Parcelable> Bundle.getSafeParcelable(key: String, clazz: Class<T>): T? {
@@ -12,3 +14,9 @@ fun <T : Parcelable> Bundle.getSafeParcelable(key: String, clazz: Class<T>): T?
1214
getParcelable(key)
1315
}
1416
}
17+
18+
fun Parcelable.parcelableString(): String {
19+
val str = Uri.encode(GsonHelper.gson().toJson(this))
20+
GsonHelper.clear()
21+
return str
22+
}

feature/detail/presentation/src/main/java/com/emirhanemmez/feature/detail/presentation/DetailNavigation.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
package com.emirhanemmez.feature.detail.presentation
22

33
import androidx.navigation.NavGraphBuilder
4-
import androidx.navigation.NavType
54
import androidx.navigation.compose.composable
65
import androidx.navigation.navArgument
6+
import com.emirhanemmez.common.presentation.util.ParcelableType
77
import com.emirhanemmez.common.presentation.util.extension.getSafeParcelable
88
import com.emirhanemmez.feature.detail.presentation.data.DetailItem
99

1010
object DetailNavigation {
11-
const val route = "detail/{detailEntityArg}"
12-
const val detailEntityArg = "detailEntityArg"
11+
internal const val detailEntityArg = "detailEntityArg"
12+
const val route = "detail"
13+
internal const val routeWithArgs = "$route/{$detailEntityArg}"
1314
}
1415

1516
fun NavGraphBuilder.detailRoute() =
1617
composable(
17-
route = DetailNavigation.route,
18+
route = DetailNavigation.routeWithArgs,
1819
arguments = listOf(
1920
navArgument(DetailNavigation.detailEntityArg) {
20-
type = NavType.ParcelableType(DetailItem::class.java)
21+
type = ParcelableType(DetailItem::class.java)
2122
}
2223
)
2324
) {

feature/favourite/presentation/src/main/java/com/emirhanemmez/feature/favourite/presentation/FavouriteNavigation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ object FavouriteNavigation {
99
const val route = "favourite"
1010
}
1111

12-
fun NavGraphBuilder.favouriteRoute(onDetailNavigation: (FavouriteItem) -> Unit) =
12+
fun NavGraphBuilder.favouriteRoute(navigateToDetail: (FavouriteItem) -> Unit) =
1313
composable(FavouriteNavigation.route) {
1414
val favouriteViewModel = hiltViewModel<FavouriteViewModel>()
1515
FavouriteRoute(
1616
onItemClick = { favouriteItem ->
17-
onDetailNavigation.invoke(favouriteItem)
17+
navigateToDetail.invoke(favouriteItem)
1818
},
1919
viewModel = favouriteViewModel
2020
)

feature/home/presentation/src/main/java/com/emirhanemmez/feature/home/presentation/HomeNavigation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ object HomeNavigation {
88
const val route = "home"
99
}
1010

11-
fun NavGraphBuilder.homeRoute(onDetailNavigation: (HomeListItem) -> Unit) {
11+
fun NavGraphBuilder.homeRoute(navigateToDetail: (HomeListItem) -> Unit) {
1212
composable(HomeNavigation.route) {
1313
HomeRoute(
1414
onItemClick = {
15-
onDetailNavigation.invoke(it)
15+
navigateToDetail.invoke(it)
1616
}
1717
)
1818
}

gradle/dependencies/common/presentation.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx
33
lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" }
44
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
55
material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" }
6-
hilt = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
7-
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
6+
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
7+
navigation-common-ktx = { group = "androidx.navigation", name = "navigation-common-ktx", version.ref = "navigation" }
88
ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose" }
99
ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics", version.ref = "compose" }
1010
ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose" }
@@ -17,9 +17,10 @@ espresso-core = { group = "androidx.test.espresso", name = "espresso-core", vers
1717
[versions]
1818
core-ktx = "1.10.1"
1919
lifecycle = "2.6.1"
20-
compose = "1.4.3"
21-
hilt = "2.47"
20+
compose = "1.5.0"
2221
compose-bom = "2023.06.01"
22+
gson = "2.10.1"
23+
navigation = "2.7.0"
2324
material3 = "1.1.1"
2425
androidx-test-ext-junit = "1.1.5"
2526
espresso-core = "3.5.1"

navigation/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
plugins {
33
alias(appLibs.plugins.androidLibrary)
44
alias(appLibs.plugins.kotlin.android)
5-
alias(appLibs.plugins.kotlin.kapt)
6-
alias(appLibs.plugins.hilt)
75
}
86

97
android {
@@ -47,17 +45,14 @@ android {
4745
}
4846

4947
dependencies {
48+
implementation(project(":common:presentation"))
5049
implementation(project(":feature:home:domain"))
5150
implementation(project(":feature:favourite:domain"))
5251
implementation(project(":feature:detail:domain"))
5352
implementation(project(":feature:home:presentation"))
5453
implementation(project(":feature:favourite:presentation"))
5554
implementation(project(":feature:detail:presentation"))
5655
implementation(navigationLibs.core.ktx)
57-
implementation(navigationLibs.hilt)
58-
kapt(navigationLibs.hilt.compiler)
59-
implementation(navigationLibs.hilt.navigation)
60-
implementation(navigationLibs.gson)
6156
implementation(navigationLibs.navigation.compose)
6257
implementation(navigationLibs.compose.bom)
6358
implementation(navigationLibs.material3)
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.emirhanemmez.navigation
22

33
import androidx.compose.runtime.Composable
4-
import androidx.hilt.navigation.compose.hiltViewModel
54
import androidx.navigation.NavHostController
65
import androidx.navigation.compose.NavHost
6+
import com.emirhanemmez.common.presentation.util.extension.parcelableString
77
import com.emirhanemmez.feature.detail.presentation.DetailNavigation
88
import com.emirhanemmez.feature.detail.presentation.detailRoute
99
import com.emirhanemmez.feature.favourite.presentation.favouriteRoute
@@ -13,27 +13,24 @@ import com.emirhanemmez.navigation.mapper.toDetailItem
1313

1414
@Composable
1515
fun Navigation(
16-
navController: NavHostController,
17-
viewModel: NavigationViewModel = hiltViewModel()
16+
navController: NavHostController
1817
) {
1918
NavHost(
2019
navController = navController,
2120
startDestination = HomeNavigation.route
2221
) {
2322
homeRoute(
24-
onDetailNavigation = { homeListItem ->
25-
val detailEntityArg = viewModel.getParcelableString(homeListItem.toDetailItem())
23+
navigateToDetail = { homeListItem ->
24+
val detailEntityArg = homeListItem.toDetailItem().parcelableString()
2625
navController.navigate("${DetailNavigation.route}/$detailEntityArg")
2726
}
2827
)
2928
favouriteRoute(
30-
onDetailNavigation = { favouriteItem ->
31-
val detailEntityArg = viewModel.getParcelableString(favouriteItem.toDetailItem())
29+
navigateToDetail = { favouriteItem ->
30+
val detailEntityArg = favouriteItem.toDetailItem().parcelableString()
3231
navController.navigate("${DetailNavigation.route}/$detailEntityArg")
3332
}
3433
)
35-
detailRoute(
36-
37-
)
34+
detailRoute()
3835
}
3936
}

0 commit comments

Comments
 (0)