Skip to content

Commit 2710fb1

Browse files
committed
Refactor ViewModel and introduce basic navigation
This commit refactors the ViewModel structure and introduces basic navigation capabilities using Jetpack Navigation Compose. Key changes: - Renamed `MainViewModel.kt` to `DiffCheckerViewModel.kt` and moved it to the `presentation.viewmodel` package. - `DiffCheckerViewModel` now takes a `NavigationRouter` in its constructor. - Introduced a `NavigationRouter` interface and a `NavControllerRouter` implementation for managing navigation actions. - Added `Screen.kt` to define navigation routes for `DiffChecker` and a new `DiffViewer` screen. - Created a placeholder `DiffViewerScreen.kt`. - Updated `MainActivity.kt` to set up `NavHost` with routes for `DiffCheckerScreen` and `DiffViewerScreen`. - `DiffCheckerScreen.kt` now uses `DiffCheckerViewModel`. - Added `navigation-compose` dependency to `build.gradle.kts` and `libs.versions.toml`.
1 parent 650fe7f commit 2710fb1

File tree

9 files changed

+84
-12
lines changed

9 files changed

+84
-12
lines changed

app/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ dependencies {
6868
implementation(libs.androidx.material3)
6969
implementation(libs.androidx.material.icons.core)
7070
implementation(libs.androidx.material.icons.extended)
71+
implementation(libs.navigation.compose)
72+
73+
7174
androidTestImplementation(libs.androidx.espresso.core)
7275
androidTestImplementation(platform(libs.androidx.compose.bom))
7376
debugImplementation(libs.androidx.ui.tooling)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.jahidhasanco.diffly.navigation
2+
3+
import androidx.navigation.NavController
4+
5+
class NavControllerRouter(private val navController: NavController) : NavigationRouter {
6+
7+
override fun navigateToDiffChecker() {
8+
navController.navigate(Screen.DiffChecker.route)
9+
}
10+
11+
override fun navigateToDiffViewer() {
12+
navController.navigate(Screen.DiffViewer.route)
13+
}
14+
15+
override fun goBack() {
16+
navController.popBackStack()
17+
}
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.jahidhasanco.diffly.navigation
2+
3+
interface NavigationRouter {
4+
fun navigateToDiffChecker()
5+
fun navigateToDiffViewer()
6+
fun goBack()
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package dev.jahidhasanco.diffly.navigation
2+
3+
sealed class Screen(val route: String) {
4+
object DiffChecker : Screen("diff_checker")
5+
object DiffViewer : Screen("diff_viewer")
6+
}

app/src/main/java/dev/jahidhasanco/diffly/presentation/MainActivity.kt

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@ import android.app.Activity
44
import android.os.Bundle
55
import androidx.activity.ComponentActivity
66
import androidx.activity.compose.setContent
7+
import androidx.compose.runtime.Composable
78
import androidx.compose.runtime.SideEffect
89
import androidx.compose.ui.platform.LocalView
910
import androidx.core.view.WindowCompat
1011
import androidx.core.view.WindowInsetsControllerCompat
12+
import androidx.navigation.compose.NavHost
13+
import androidx.navigation.compose.composable
14+
import androidx.navigation.compose.rememberNavController
1115
import dev.jahidhasanco.diffly.di.AppModule
16+
import dev.jahidhasanco.diffly.navigation.NavControllerRouter
17+
import dev.jahidhasanco.diffly.navigation.Screen
1218
import dev.jahidhasanco.diffly.presentation.screen.DiffCheckerScreen
19+
import dev.jahidhasanco.diffly.presentation.screen.DiffViewerScreen
20+
import dev.jahidhasanco.diffly.presentation.viewmodel.DiffCheckerViewModel
1321

1422
class MainActivity : ComponentActivity() {
15-
private val viewModel by lazy {
16-
MainViewModel(AppModule.calculateDiffUseCase)
17-
}
18-
1923
override fun onCreate(savedInstanceState: Bundle?) {
2024
super.onCreate(savedInstanceState)
2125
setContent {
@@ -24,11 +28,34 @@ class MainActivity : ComponentActivity() {
2428
SideEffect {
2529
val window = (view.context as Activity).window
2630
WindowCompat.setDecorFitsSystemWindows(window, true)
27-
WindowInsetsControllerCompat(window, view).isAppearanceLightStatusBars = true
31+
WindowInsetsControllerCompat(
32+
window, view
33+
).isAppearanceLightStatusBars = true
2834
}
2935
}
36+
AppNavHost()
37+
}
38+
}
39+
}
40+
41+
@Composable
42+
fun AppNavHost() {
43+
val navController = rememberNavController()
44+
val router = NavControllerRouter(navController)
45+
46+
NavHost(
47+
navController = navController,
48+
startDestination = Screen.DiffChecker.route
49+
) {
50+
composable(Screen.DiffChecker.route) {
51+
val viewModel by lazy {
52+
DiffCheckerViewModel(AppModule.calculateDiffUseCase, router)
53+
}
3054
DiffCheckerScreen(viewModel)
3155
}
56+
composable(Screen.DiffViewer.route) {
57+
DiffViewerScreen()
58+
}
3259
}
3360
}
3461

app/src/main/java/dev/jahidhasanco/diffly/presentation/screen/DiffCheckerScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ import androidx.compose.ui.graphics.Color
4949
import androidx.compose.ui.text.font.FontWeight
5050
import androidx.compose.ui.unit.dp
5151
import dev.jahidhasanco.diffly.domain.model.DiffViewType
52-
import dev.jahidhasanco.diffly.presentation.MainViewModel
5352
import dev.jahidhasanco.diffly.presentation.component.ColumCharDiffText
5453
import dev.jahidhasanco.diffly.presentation.component.TwoSideCharDiffText
5554
import dev.jahidhasanco.diffly.presentation.component.UnifiedCharDiffText
5655
import dev.jahidhasanco.diffly.presentation.theme.background
5756
import dev.jahidhasanco.diffly.presentation.theme.primary
57+
import dev.jahidhasanco.diffly.presentation.viewmodel.DiffCheckerViewModel
5858

5959
@OptIn(ExperimentalMaterial3Api::class)
6060
@Composable
61-
fun DiffCheckerScreen(viewModel: MainViewModel) {
61+
fun DiffCheckerScreen(viewModel: DiffCheckerViewModel) {
6262
var oldText by remember { mutableStateOf("") }
6363
var newText by remember { mutableStateOf("") }
6464
val diffResult by viewModel.diffResult.collectAsState()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.jahidhasanco.diffly.presentation.screen
2+
3+
import androidx.compose.runtime.Composable
4+
5+
@Composable
6+
fun DiffViewerScreen() {
7+
}

app/src/main/java/dev/jahidhasanco/diffly/presentation/MainViewModel.kt renamed to app/src/main/java/dev/jahidhasanco/diffly/presentation/viewmodel/DiffCheckerViewModel.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
package dev.jahidhasanco.diffly.presentation
1+
package dev.jahidhasanco.diffly.presentation.viewmodel
22

33
import android.util.Log
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
66
import dev.jahidhasanco.diffly.domain.model.DiffEntry
77
import dev.jahidhasanco.diffly.domain.usecase.CalculateDiffUseCase
8+
import dev.jahidhasanco.diffly.navigation.NavigationRouter
89
import kotlinx.coroutines.flow.MutableStateFlow
910
import kotlinx.coroutines.flow.StateFlow
1011
import kotlinx.coroutines.launch
1112

12-
class MainViewModel(
13-
private val calculateDiffUseCase: CalculateDiffUseCase
13+
class DiffCheckerViewModel(
14+
private val calculateDiffUseCase: CalculateDiffUseCase,
15+
private val router: NavigationRouter
1416
) : ViewModel() {
1517

1618
private val _diffResult = MutableStateFlow<List<DiffEntry>>(emptyList())
@@ -23,4 +25,4 @@ class MainViewModel(
2325
_diffResult.value = result
2426
}
2527
}
26-
}
28+
}

gradle/libs.versions.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ composeBom = "2024.09.00"
99
materialIconsCore = "1.7.8"
1010
materialIconsExtended = "1.7.8"
1111
material = "1.8.3"
12+
navigation = "2.7.3"
13+
1214

1315
[libraries]
1416
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -25,7 +27,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
2527
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
2628
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
2729
androidx-material = { group = "androidx.compose.material", name = "material", version.ref = "material" }
28-
30+
navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" }
2931

3032

3133
[plugins]

0 commit comments

Comments
 (0)