diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..d9fa80f
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+Tasker
\ No newline at end of file
diff --git a/.idea/ChatHistory_schema_v2.xml b/.idea/ChatHistory_schema_v2.xml
index b8bdf60..dac3521 100644
--- a/.idea/ChatHistory_schema_v2.xml
+++ b/.idea/ChatHistory_schema_v2.xml
@@ -23,6 +23,7 @@
+
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index 7ae67ff..662610d 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -13,20 +13,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 35eb320..b591185 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -15,7 +15,6 @@
-
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 5c28ccb..079393f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -5,9 +5,9 @@ plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
- kotlin("kapt")
- kotlin("plugin.serialization") version "2.0.21"
- id("com.google.devtools.ksp")
+ alias(libs.plugins.kotlinx.serialization)
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -131,7 +131,6 @@ dependencies {
implementation(project(":core:database"))
implementation(project(":core:common"))
implementation(project(":core:domain"))
- implementation(project(":core:feature_api"))
implementation(project(":feature:notes:data"))
implementation(project(":feature:notes:domain"))
@@ -160,9 +159,9 @@ dependencies {
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger-hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
// navigation compose
implementation(libs.androidx.navigation.compose)
diff --git a/app/src/main/java/com/vicky7230/tasker2/BaseApplication.kt b/app/src/main/java/com/vicky7230/tasker2/BaseApplication.kt
index ab48c4c..5c439a1 100644
--- a/app/src/main/java/com/vicky7230/tasker2/BaseApplication.kt
+++ b/app/src/main/java/com/vicky7230/tasker2/BaseApplication.kt
@@ -1,17 +1,11 @@
package com.vicky7230.tasker2
import android.app.Application
-import com.vicky7230.tasker2.di.component.ApplicationComponent
-import com.vicky7230.tasker2.di.component.DaggerApplicationComponent
+import dagger.hilt.android.HiltAndroidApp
+@HiltAndroidApp
class BaseApplication : Application() {
- lateinit var applicationComponent: ApplicationComponent
-
override fun onCreate() {
super.onCreate()
- applicationComponent =
- DaggerApplicationComponent
- .factory()
- .create(context = this, isDebug = BuildConfig.DEBUG)
}
}
diff --git a/app/src/main/java/com/vicky7230/tasker2/MainActivity.kt b/app/src/main/java/com/vicky7230/tasker2/MainActivity.kt
index 55fd5f8..d556ab5 100644
--- a/app/src/main/java/com/vicky7230/tasker2/MainActivity.kt
+++ b/app/src/main/java/com/vicky7230/tasker2/MainActivity.kt
@@ -18,23 +18,21 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.luminance
import androidx.core.view.WindowCompat
-import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavHostController
+import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
+import com.core.common.navigation.SubGraph
import com.core.common.theme.TaskerTheme
-import com.vicky7230.tasker2.navigation.AppNavGraph
-import com.vicky7230.tasker2.navigation.NavigationProvider
+import com.vicky7230.tasker2.navigation.DefaultNavigator
+import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
+@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject
- lateinit var navigationProvider: NavigationProvider
-
- @Inject
- lateinit var viewModelFactory: ViewModelProvider.Factory
+ lateinit var defaultNavigator: DefaultNavigator
override fun onCreate(savedInstanceState: Bundle?) {
- (application as BaseApplication).applicationComponent.inject(this)
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
@@ -51,7 +49,7 @@ class MainActivity : ComponentActivity() {
}
val navController = rememberNavController()
- App(navHostController = navController, navigationProvider = navigationProvider, viewModelFactory = viewModelFactory)
+ App(navHostController = navController, defaultNavigator = defaultNavigator)
}
}
}
@@ -60,8 +58,7 @@ class MainActivity : ComponentActivity() {
@Composable
fun App(
navHostController: NavHostController,
- navigationProvider: NavigationProvider,
- viewModelFactory: ViewModelProvider.Factory,
+ defaultNavigator: DefaultNavigator,
modifier: Modifier = Modifier,
) {
Surface(
@@ -72,10 +69,19 @@ fun App(
.windowInsetsPadding(WindowInsets.navigationBars),
color = MaterialTheme.colorScheme.background,
) {
- AppNavGraph(
- navController = navHostController,
- navigationProvider = navigationProvider,
- viewModelFactory = viewModelFactory,
- )
+ NavHost(navController = navHostController, startDestination = SubGraph.Notes) {
+ defaultNavigator.notesFeature.registerGraph(
+ navHostController = navHostController,
+ navGraphBuilder = this,
+ )
+ defaultNavigator.addEditNoteFeature.registerGraph(
+ navHostController = navHostController,
+ navGraphBuilder = this,
+ )
+ defaultNavigator.tagsFeature.registerGraph(
+ navHostController = navHostController,
+ navGraphBuilder = this,
+ )
+ }
}
}
diff --git a/app/src/main/java/com/vicky7230/tasker2/di/ViewModelFactory.kt b/app/src/main/java/com/vicky7230/tasker2/di/ViewModelFactory.kt
deleted file mode 100644
index 1d63442..0000000
--- a/app/src/main/java/com/vicky7230/tasker2/di/ViewModelFactory.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.vicky7230.tasker2.di
-
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewmodel.CreationExtras
-import javax.inject.Inject
-import javax.inject.Provider
-import javax.inject.Singleton
-
-@Singleton
-class ViewModelFactory
- @Inject
- constructor(
- private val viewModelProviders: Map, @JvmSuppressWildcards Provider>,
- ) : ViewModelProvider.Factory {
- override fun create(
- modelClass: Class,
- extras: CreationExtras,
- ): T {
- val creator =
- viewModelProviders[modelClass]
- ?: viewModelProviders.entries.firstOrNull { modelClass.isAssignableFrom(it.key) }?.value
- ?: throw IllegalArgumentException("Unknown ViewModel class: $modelClass")
-
- @Suppress("UNCHECKED_CAST")
- return creator.get() as T
- }
-
- @Deprecated(
- "Use create(modelClass: Class, extras: CreationExtras) instead",
- ReplaceWith("create(modelClass, CreationExtras.Empty)"),
- )
- override fun create(modelClass: Class): T = create(modelClass, CreationExtras.Empty)
- }
diff --git a/app/src/main/java/com/vicky7230/tasker2/di/ViewModelKey.kt b/app/src/main/java/com/vicky7230/tasker2/di/ViewModelKey.kt
deleted file mode 100644
index 10f6fb9..0000000
--- a/app/src/main/java/com/vicky7230/tasker2/di/ViewModelKey.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.vicky7230.tasker2.di
-
-import androidx.lifecycle.ViewModel
-import dagger.MapKey
-import kotlin.reflect.KClass
-
-@MustBeDocumented
-@Target(AnnotationTarget.FUNCTION)
-@Retention(AnnotationRetention.RUNTIME)
-@MapKey
-annotation class ViewModelKey(
- val value: KClass,
-)
diff --git a/app/src/main/java/com/vicky7230/tasker2/di/component/ApplicationComponent.kt b/app/src/main/java/com/vicky7230/tasker2/di/component/ApplicationComponent.kt
deleted file mode 100644
index 7fedc5b..0000000
--- a/app/src/main/java/com/vicky7230/tasker2/di/component/ApplicationComponent.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.vicky7230.tasker2.di.component
-
-import android.content.Context
-import androidx.lifecycle.ViewModelProvider
-import com.core.database.di.DatabaseModule
-import com.core.network.di.NetworkModule
-import com.feature.add_edit_note.ui.di.AddEditNoteUiModule
-import com.feature.notes.data.di.NotesDataModule
-import com.feature.notes.ui.di.NotesUiModule
-import com.feature.tags.data.di.TagsDataModule
-import com.feature.tags.ui.di.TagsUiModule
-import com.vicky7230.tasker2.MainActivity
-import com.vicky7230.tasker2.di.module.AppModule
-import com.vicky7230.tasker2.di.module.ViewModelModule
-import dagger.BindsInstance
-import dagger.Component
-import javax.inject.Singleton
-
-@Singleton
-@Component(
- modules = [
- NetworkModule::class,
- DatabaseModule::class,
- NotesDataModule::class,
- NotesUiModule::class,
- AddEditNoteUiModule::class,
- TagsUiModule::class,
- TagsDataModule::class,
- AppModule::class,
- ViewModelModule::class,
- ],
-)
-interface ApplicationComponent {
- @Component.Factory
- interface Factory {
- fun create(
- @BindsInstance context: Context,
- @BindsInstance isDebug: Boolean,
- ): ApplicationComponent
- }
-
- fun viewModelFactory(): ViewModelProvider.Factory
-
- fun inject(mainActivity: MainActivity)
-}
diff --git a/app/src/main/java/com/vicky7230/tasker2/di/module/AppModule.kt b/app/src/main/java/com/vicky7230/tasker2/di/module/AppModule.kt
index 5998e88..ef72598 100644
--- a/app/src/main/java/com/vicky7230/tasker2/di/module/AppModule.kt
+++ b/app/src/main/java/com/vicky7230/tasker2/di/module/AppModule.kt
@@ -1,18 +1,26 @@
package com.vicky7230.tasker2.di.module
-import com.feature.add_edit_note.ui.navigation.AddEditNoteApi
-import com.feature.notes.ui.navigation.NotesApi
-import com.feature.tags.ui.navigation.TagsApi
-import com.vicky7230.tasker2.navigation.NavigationProvider
+import com.feature.add_edit_note.ui.navigation.AddEditNoteFeature
+import com.feature.notes.ui.navigation.NotesFeature
+import com.feature.tags.ui.navigation.TagsFeature
+import com.vicky7230.tasker2.navigation.DefaultNavigator
import dagger.Module
import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+@InstallIn(SingletonComponent::class)
@Module
class AppModule {
@Provides
- fun provideNavigationProvider(
- notesApi: NotesApi,
- addEditNoteApi: AddEditNoteApi,
- tagsApi: TagsApi,
- ): NavigationProvider = NavigationProvider(notesApi = notesApi, addEditNoteApi = addEditNoteApi, tagsApi = tagsApi)
+ fun provideDefaultNavigator(
+ notesFeature: NotesFeature,
+ addEditNoteFeature: AddEditNoteFeature,
+ tagsFeature: TagsFeature,
+ ): DefaultNavigator =
+ DefaultNavigator(
+ notesFeature = notesFeature,
+ addEditNoteFeature = addEditNoteFeature,
+ tagsFeature = tagsFeature,
+ )
}
diff --git a/app/src/main/java/com/vicky7230/tasker2/di/module/ViewModelModule.kt b/app/src/main/java/com/vicky7230/tasker2/di/module/ViewModelModule.kt
deleted file mode 100644
index eac669d..0000000
--- a/app/src/main/java/com/vicky7230/tasker2/di/module/ViewModelModule.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.vicky7230.tasker2.di.module
-
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import com.feature.notes.ui.screen.NotesViewModel
-import com.vicky7230.tasker2.di.ViewModelFactory
-import com.vicky7230.tasker2.di.ViewModelKey
-import dagger.Binds
-import dagger.Module
-import dagger.multibindings.IntoMap
-
-@Module
-abstract class ViewModelModule {
- @Binds
- abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
-
- @Binds
- @IntoMap
- @ViewModelKey(NotesViewModel::class)
- abstract fun bindNotesViewModel(notesViewModel: NotesViewModel): ViewModel
-}
diff --git a/app/src/main/java/com/vicky7230/tasker2/navigation/AppNavigation.kt b/app/src/main/java/com/vicky7230/tasker2/navigation/AppNavigation.kt
deleted file mode 100644
index 74722ec..0000000
--- a/app/src/main/java/com/vicky7230/tasker2/navigation/AppNavigation.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.vicky7230.tasker2.navigation
-
-import androidx.compose.runtime.Composable
-import androidx.lifecycle.ViewModelProvider
-import androidx.navigation.NavHostController
-import androidx.navigation.compose.NavHost
-import com.core.common.navigation.NotesGraph
-
-@Composable
-fun AppNavGraph(
- navController: NavHostController,
- navigationProvider: NavigationProvider,
- viewModelFactory: ViewModelProvider.Factory,
-) {
- NavHost(navController = navController, startDestination = NotesGraph) {
- navigationProvider.notesApi.registerGraph(
- navHostController = navController,
- navGraphBuilder = this,
- viewModelFactory = viewModelFactory,
- )
- navigationProvider.addEditNoteApi.registerGraph(
- navHostController = navController,
- navGraphBuilder = this,
- viewModelFactory = viewModelFactory,
- )
- navigationProvider.tagsApi.registerGraph(
- navHostController = navController,
- navGraphBuilder = this,
- viewModelFactory = viewModelFactory,
- )
- }
-}
diff --git a/app/src/main/java/com/vicky7230/tasker2/navigation/DefaultNavigator.kt b/app/src/main/java/com/vicky7230/tasker2/navigation/DefaultNavigator.kt
new file mode 100644
index 0000000..0158e02
--- /dev/null
+++ b/app/src/main/java/com/vicky7230/tasker2/navigation/DefaultNavigator.kt
@@ -0,0 +1,11 @@
+package com.vicky7230.tasker2.navigation
+
+import com.feature.add_edit_note.ui.navigation.AddEditNoteFeature
+import com.feature.notes.ui.navigation.NotesFeature
+import com.feature.tags.ui.navigation.TagsFeature
+
+data class DefaultNavigator(
+ val notesFeature: NotesFeature,
+ val addEditNoteFeature: AddEditNoteFeature,
+ val tagsFeature: TagsFeature,
+)
diff --git a/app/src/main/java/com/vicky7230/tasker2/navigation/NavigationProvider.kt b/app/src/main/java/com/vicky7230/tasker2/navigation/NavigationProvider.kt
deleted file mode 100644
index 611e259..0000000
--- a/app/src/main/java/com/vicky7230/tasker2/navigation/NavigationProvider.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.vicky7230.tasker2.navigation
-
-import com.feature.add_edit_note.ui.navigation.AddEditNoteApi
-import com.feature.notes.ui.navigation.NotesApi
-import com.feature.tags.ui.navigation.TagsApi
-
-data class NavigationProvider(
- val notesApi: NotesApi,
- val addEditNoteApi: AddEditNoteApi,
- val tagsApi: TagsApi,
-)
diff --git a/build.gradle.kts b/build.gradle.kts
index e933d7e..0d6a27f 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,6 +13,7 @@ plugins {
alias(libs.plugins.room) apply false
alias(libs.plugins.ktlint) apply false
alias(libs.plugins.detekt) apply false
+ alias(libs.plugins.hilt.android) apply false
jacoco
}
diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
index b8b53bd..d30a6be 100644
--- a/core/common/build.gradle.kts
+++ b/core/common/build.gradle.kts
@@ -2,7 +2,7 @@ plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
- kotlin("plugin.serialization") version "2.0.21"
+ alias(libs.plugins.kotlinx.serialization)
}
android {
@@ -67,4 +67,7 @@ dependencies {
// Immutable persistent collections for Kotlin
implementation(libs.kotlinx.collections.immutable)
+
+ // navigation compose
+ implementation(libs.androidx.navigation.compose)
}
diff --git a/core/feature_api/src/main/java/com/core/feature_api/FeatureApi.kt b/core/common/src/main/java/com/core/common/navigation/Feature.kt
similarity index 58%
rename from core/feature_api/src/main/java/com/core/feature_api/FeatureApi.kt
rename to core/common/src/main/java/com/core/common/navigation/Feature.kt
index 505d695..fd040e9 100644
--- a/core/feature_api/src/main/java/com/core/feature_api/FeatureApi.kt
+++ b/core/common/src/main/java/com/core/common/navigation/Feature.kt
@@ -1,13 +1,11 @@
-package com.core.feature_api
+package com.core.common.navigation
-import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
-interface FeatureApi {
+interface Feature {
fun registerGraph(
navHostController: NavHostController,
navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
)
}
diff --git a/core/common/src/main/java/com/core/common/navigation/NavigationConstants.kt b/core/common/src/main/java/com/core/common/navigation/NavigationConstants.kt
deleted file mode 100644
index eb5c399..0000000
--- a/core/common/src/main/java/com/core/common/navigation/NavigationConstants.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.core.common.navigation
-
-import kotlinx.serialization.Serializable
-
-@Serializable
-object NotesGraph
-
-@Serializable
-object NotesScreen
-
-@Serializable
-object AddEditNoteGraph
-
-@Serializable
-data class AddEditNoteScreen(
- val noteId: Long,
-)
-
-@Serializable
-object TagGraph
-
-@Serializable
-data class TagScreen(
- val tagId: Long,
-)
diff --git a/core/common/src/main/java/com/core/common/navigation/NavigationUtils.kt b/core/common/src/main/java/com/core/common/navigation/NavigationUtils.kt
new file mode 100644
index 0000000..7016e71
--- /dev/null
+++ b/core/common/src/main/java/com/core/common/navigation/NavigationUtils.kt
@@ -0,0 +1,29 @@
+package com.core.common.navigation
+
+import kotlinx.serialization.Serializable
+
+sealed class SubGraph {
+ @Serializable
+ data object Notes : SubGraph()
+
+ @Serializable
+ data object AddEditNote : SubGraph()
+
+ @Serializable
+ data object Tags : SubGraph()
+}
+
+sealed class Dest {
+ @Serializable
+ data object Notes : Dest()
+
+ @Serializable
+ data class AddEditNote(
+ val noteId: Long,
+ ) : Dest()
+
+ @Serializable
+ data class Tags(
+ val tagId: Long,
+ ) : Dest()
+}
diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts
index ad79606..c9da697 100644
--- a/core/database/build.gradle.kts
+++ b/core/database/build.gradle.kts
@@ -1,9 +1,9 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.room)
kotlin("kapt")
- id("com.google.devtools.ksp")
- id("androidx.room")
}
android {
@@ -13,8 +13,7 @@ android {
defaultConfig {
minSdk = 24
- // testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
- testInstrumentationRunner = "com.core.database.CustomTestRunner"
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
@@ -47,9 +46,12 @@ dependencies {
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ androidTestImplementation("com.google.dagger:hilt-android-testing:2.56.2")
+ // ...with Kotlin.
+ kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.56.2")
// room
implementation(libs.androidx.room.runtime)
diff --git a/core/database/src/androidTest/java/com/core/database/CustomTestRunner.kt b/core/database/src/androidTest/java/com/core/database/CustomTestRunner.kt
deleted file mode 100644
index 6504815..0000000
--- a/core/database/src/androidTest/java/com/core/database/CustomTestRunner.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.core.database
-
-import android.app.Application
-import android.content.Context
-import androidx.test.runner.AndroidJUnitRunner
-import com.core.database.di.BaseApplicationTest
-
-class CustomTestRunner : AndroidJUnitRunner() {
- override fun newApplication(
- cl: ClassLoader?,
- name: String?,
- context: Context?,
- ): Application = super.newApplication(cl, BaseApplicationTest::class.java.name, context)
-}
diff --git a/core/database/src/androidTest/java/com/core/database/NotesDaoTest.kt b/core/database/src/androidTest/java/com/core/database/NotesDaoTest.kt
index c350f5e..2c611dc 100644
--- a/core/database/src/androidTest/java/com/core/database/NotesDaoTest.kt
+++ b/core/database/src/androidTest/java/com/core/database/NotesDaoTest.kt
@@ -1,33 +1,34 @@
package com.core.database
-import androidx.test.core.app.ApplicationProvider
import com.core.database.dao.NotesDao
import com.core.database.dao.TagsDao
-import com.core.database.di.BaseApplicationTest
import com.core.database.entity.NoteEntity
import com.core.database.entity.NoteWithTagEntity
import com.core.database.entity.TagEntity
import com.core.database.entity.UpdateNoteDeleted
import com.core.database.entity.UpdateNoteDone
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
import junit.framework.TestCase.assertEquals
import junit.framework.TestCase.assertNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
+@HiltAndroidTest
class NotesDaoTest {
+ @get:Rule
+ val hiltRule = HiltAndroidRule(this)
private lateinit var notesDb: NotesDb
private lateinit var notesDao: NotesDao
private lateinit var tagsDao: TagsDao
@Before
fun setUp() {
- val appContext = ApplicationProvider.getApplicationContext()
- notesDb = appContext.applicationComponentTest.notesDb()
- notesDao = notesDb.getNotesDao()
- tagsDao = notesDb.getTagsDao()
+ hiltRule.inject()
}
@After
diff --git a/core/database/src/androidTest/java/com/core/database/TagsDaoTest.kt b/core/database/src/androidTest/java/com/core/database/TagsDaoTest.kt
index 6a518bc..5c4d521 100644
--- a/core/database/src/androidTest/java/com/core/database/TagsDaoTest.kt
+++ b/core/database/src/androidTest/java/com/core/database/TagsDaoTest.kt
@@ -1,32 +1,33 @@
package com.core.database
-import androidx.test.core.app.ApplicationProvider
import com.core.database.dao.NotesDao
import com.core.database.dao.TagsDao
-import com.core.database.di.BaseApplicationTest
import com.core.database.entity.NoteEntity
import com.core.database.entity.TagEntity
import com.core.database.entity.TagWithNotesEntity
import com.core.database.entity.UpdateTagName
import com.core.database.entity.toActiveNoteEntity
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
import junit.framework.TestCase.assertEquals
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
+@HiltAndroidTest
class TagsDaoTest {
+ @get:Rule
+ val hiltRule = HiltAndroidRule(this)
private lateinit var notesDb: NotesDb
private lateinit var tagsDao: TagsDao
private lateinit var notesDao: NotesDao
@Before
fun setUp() {
- val appContext = ApplicationProvider.getApplicationContext()
- notesDb = appContext.applicationComponentTest.notesDb()
- tagsDao = notesDb.getTagsDao()
- notesDao = notesDb.getNotesDao()
+ hiltRule.inject()
}
@After
@@ -107,8 +108,20 @@ class TagsDaoTest {
// Assert
assertEquals(result.size, 2)
- assertEquals(TagWithNotesEntity(tag = tags[0], notes = listOf(note1.toActiveNoteEntity())), result[0])
- assertEquals(TagWithNotesEntity(tag = tags[1], notes = listOf(note2.toActiveNoteEntity())), result[1])
+ assertEquals(
+ TagWithNotesEntity(
+ tag = tags[0],
+ notes = listOf(note1.toActiveNoteEntity()),
+ ),
+ result[0],
+ )
+ assertEquals(
+ TagWithNotesEntity(
+ tag = tags[1],
+ notes = listOf(note2.toActiveNoteEntity()),
+ ),
+ result[1],
+ )
}
@Test
@@ -133,7 +146,10 @@ class TagsDaoTest {
val result = tagsDao.getTagWithNotes(1).first()
// Assert
- assertEquals(TagWithNotesEntity(tag = tag, notes = listOf(note.toActiveNoteEntity())), result)
+ assertEquals(
+ TagWithNotesEntity(tag = tag, notes = listOf(note.toActiveNoteEntity())),
+ result,
+ )
}
@Test
diff --git a/core/database/src/androidTest/java/com/core/database/di/ApplicationComponentTest.kt b/core/database/src/androidTest/java/com/core/database/di/ApplicationComponentTest.kt
deleted file mode 100644
index 2487ceb..0000000
--- a/core/database/src/androidTest/java/com/core/database/di/ApplicationComponentTest.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.core.database.di
-
-import android.content.Context
-import com.core.database.NotesDb
-import com.core.database.dao.NotesDao
-import com.core.database.dao.TagsDao
-import dagger.BindsInstance
-import dagger.Component
-import javax.inject.Singleton
-
-@Singleton
-@Component(modules = [DatabaseModuleTest::class])
-interface ApplicationComponentTest {
- @Component.Factory
- interface Factory {
- fun create(
- @BindsInstance context: Context,
- ): ApplicationComponentTest
- }
-
- fun notesDb(): NotesDb
-
- fun notesDao(): NotesDao
-
- fun tagsDao(): TagsDao
-}
diff --git a/core/database/src/androidTest/java/com/core/database/di/BaseApplicationTest.kt b/core/database/src/androidTest/java/com/core/database/di/BaseApplicationTest.kt
deleted file mode 100644
index 5efe897..0000000
--- a/core/database/src/androidTest/java/com/core/database/di/BaseApplicationTest.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.core.database.di
-
-import android.app.Application
-
-class BaseApplicationTest : Application() {
- lateinit var applicationComponentTest: ApplicationComponentTest
-
- override fun onCreate() {
- super.onCreate()
-
- applicationComponentTest = DaggerApplicationComponentTest.factory().create(this)
- }
-}
diff --git a/core/database/src/androidTest/java/com/core/database/di/DatabaseModuleTest.kt b/core/database/src/androidTest/java/com/core/database/di/DatabaseModuleTest.kt
index 39496a5..b999109 100644
--- a/core/database/src/androidTest/java/com/core/database/di/DatabaseModuleTest.kt
+++ b/core/database/src/androidTest/java/com/core/database/di/DatabaseModuleTest.kt
@@ -3,21 +3,32 @@ package com.core.database.di
import android.content.Context
import androidx.room.Room
import com.core.database.NotesDb
+import com.core.database.dao.NotesDao
+import com.core.database.dao.TagsDao
import dagger.Module
import dagger.Provides
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import dagger.hilt.testing.TestInstallIn
@Module
-class DatabaseModuleTest {
+@TestInstallIn(
+ components = [SingletonComponent::class],
+ replaces = [DatabaseModule::class],
+)
+object DatabaseModuleTest {
@Provides
- fun provideInMemoryDatabase(context: Context): NotesDb =
+ fun provideInMemoryDatabase(
+ @ApplicationContext context: Context,
+ ): NotesDb =
Room
.inMemoryDatabaseBuilder(context, NotesDb::class.java)
.allowMainThreadQueries()
.build()
@Provides
- fun provideNotesDao(notesDb: NotesDb) = notesDb.getNotesDao()
+ fun provideNotesDao(notesDb: NotesDb): NotesDao = notesDb.getNotesDao()
@Provides
- fun provideTagsDao(notesDb: NotesDb) = notesDb.getTagsDao()
+ fun provideTagsDao(notesDb: NotesDb): TagsDao = notesDb.getTagsDao()
}
diff --git a/core/database/src/main/java/com/core/database/di/DatabaseModule.kt b/core/database/src/main/java/com/core/database/di/DatabaseModule.kt
index d1e0cc5..719d055 100644
--- a/core/database/src/main/java/com/core/database/di/DatabaseModule.kt
+++ b/core/database/src/main/java/com/core/database/di/DatabaseModule.kt
@@ -10,15 +10,21 @@ import androidx.sqlite.db.SupportSQLiteDatabase
import com.core.database.NotesDb
import dagger.Module
import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import javax.inject.Singleton
+@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
- fun provideProductsDb(context: Context): NotesDb =
+ fun provideProductsDb(
+ @ApplicationContext context: Context,
+ ): NotesDb =
Room
.databaseBuilder(context, NotesDb::class.java, "NotesDb")
.addCallback(
diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts
index 3d92e49..5b91f43 100644
--- a/core/domain/build.gradle.kts
+++ b/core/domain/build.gradle.kts
@@ -1,7 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -45,8 +46,7 @@ dependencies {
// Immutable persistent collections for Kotlin
implementation(libs.kotlinx.collections.immutable)
- // dagger2
- implementation(libs.dagger)
-
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
}
diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts
index 6c3605d..e625c9d 100644
--- a/core/network/build.gradle.kts
+++ b/core/network/build.gradle.kts
@@ -1,8 +1,9 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
- kotlin("plugin.serialization") version "2.0.21" // match the Kotlin version
+ alias(libs.plugins.kotlinx.serialization)
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -43,9 +44,9 @@ dependencies {
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger-hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
// retrofit
implementation(libs.retrofit)
diff --git a/core/network/src/main/java/com/core/network/di/NetworkModule.kt b/core/network/src/main/java/com/core/network/di/NetworkModule.kt
index 8fbe9f3..34fdb4f 100644
--- a/core/network/src/main/java/com/core/network/di/NetworkModule.kt
+++ b/core/network/src/main/java/com/core/network/di/NetworkModule.kt
@@ -6,6 +6,8 @@ import com.core.network.ApiService
import com.core.network.utils.Constants
import dagger.Module
import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
@@ -15,6 +17,7 @@ import retrofit2.converter.kotlinx.serialization.asConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
+@InstallIn(SingletonComponent::class)
@Module
class NetworkModule {
@Singleton
diff --git a/feature/add_edit_note/domain/build.gradle.kts b/feature/add_edit_note/domain/build.gradle.kts
index 987fd6a..3c27827 100644
--- a/feature/add_edit_note/domain/build.gradle.kts
+++ b/feature/add_edit_note/domain/build.gradle.kts
@@ -1,7 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -44,6 +45,6 @@ dependencies {
androidTestImplementation(libs.androidx.espresso.core)
// dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
}
diff --git a/feature/add_edit_note/ui/build.gradle.kts b/feature/add_edit_note/ui/build.gradle.kts
index e626bfa..b7c998c 100644
--- a/feature/add_edit_note/ui/build.gradle.kts
+++ b/feature/add_edit_note/ui/build.gradle.kts
@@ -2,7 +2,8 @@ plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
- kotlin("kapt")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -52,7 +53,6 @@ android {
dependencies {
implementation(project(":core:common"))
implementation(project(":core:domain"))
- implementation(project(":core:feature_api"))
implementation(project(":feature:notes:domain"))
implementation(project(":feature:add_edit_note:domain"))
@@ -78,9 +78,10 @@ dependencies {
// navigation compose
implementation(libs.androidx.navigation.compose)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.hilt.navigation.compose)
// mockito
testImplementation(libs.mockito.core)
diff --git a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/di/AddEditNoteUiModule.kt b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/di/AddEditNoteUiModule.kt
index e6d5afa..41d7033 100644
--- a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/di/AddEditNoteUiModule.kt
+++ b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/di/AddEditNoteUiModule.kt
@@ -1,12 +1,15 @@
package com.feature.add_edit_note.ui.di
-import com.feature.add_edit_note.ui.navigation.AddEditNoteApi
-import com.feature.add_edit_note.ui.navigation.AddEditNoteApiImpl
+import com.feature.add_edit_note.ui.navigation.AddEditNoteFeature
+import com.feature.add_edit_note.ui.navigation.AddEditNoteFeatureImpl
import dagger.Binds
import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+@InstallIn(SingletonComponent::class)
@Module
abstract class AddEditNoteUiModule {
@Binds
- abstract fun bindAddEditNoteUi(addEditNoteApiImpl: AddEditNoteApiImpl): AddEditNoteApi
+ abstract fun bindAddEditNoteUi(addEditNoteApiImpl: AddEditNoteFeatureImpl): AddEditNoteFeature
}
diff --git a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/AddEditNoteApi.kt b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/AddEditNoteApi.kt
deleted file mode 100644
index 734585b..0000000
--- a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/AddEditNoteApi.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.feature.add_edit_note.ui.navigation
-
-import androidx.lifecycle.ViewModelProvider
-import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavHostController
-import com.core.feature_api.FeatureApi
-import javax.inject.Inject
-
-interface AddEditNoteApi : FeatureApi
-
-class AddEditNoteApiImpl
- @Inject
- internal constructor(
- private val internalAddEditNoteApi: InternalAddEditNoteApi,
- ) : AddEditNoteApi {
- override fun registerGraph(
- navHostController: NavHostController,
- navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
- ) {
- internalAddEditNoteApi.registerGraph(
- navHostController,
- navGraphBuilder,
- viewModelFactory,
- )
- }
- }
diff --git a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/InternalAddEditNoteApi.kt b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/AddEditNoteFeatureNavigation.kt
similarity index 54%
rename from feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/InternalAddEditNoteApi.kt
rename to feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/AddEditNoteFeatureNavigation.kt
index 760cbe5..f935f6b 100644
--- a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/InternalAddEditNoteApi.kt
+++ b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/navigation/AddEditNoteFeatureNavigation.kt
@@ -5,52 +5,36 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
+import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.lifecycle.createSavedStateHandle
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.navigation
-import com.core.common.navigation.AddEditNoteGraph
-import com.core.common.navigation.AddEditNoteScreen
-import com.core.feature_api.FeatureApi
+import com.core.common.navigation.Dest
+import com.core.common.navigation.Feature
+import com.core.common.navigation.SubGraph
import com.feature.add_edit_note.ui.ui.AddEditNoteScreen
import com.feature.add_edit_note.ui.ui.AddEditNoteSideEffect
import com.feature.add_edit_note.ui.ui.AddEditNoteViewModel
import javax.inject.Inject
-internal class InternalAddEditNoteApi
+interface AddEditNoteFeature : Feature
+
+class AddEditNoteFeatureImpl
@Inject
- constructor(
- private val addEditNoteViewModelFactory: AddEditNoteViewModel.Factory,
- ) : FeatureApi {
+ constructor() : AddEditNoteFeature {
override fun registerGraph(
navHostController: NavHostController,
navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
) {
- navGraphBuilder.navigation(startDestination = AddEditNoteScreen(noteId = 0L)) {
- composable { navBackStackEntry ->
+ navGraphBuilder.navigation(
+ startDestination = Dest.AddEditNote(noteId = 0L),
+ ) {
+ composable { navBackStackEntry ->
val noteId = navBackStackEntry.arguments?.getLong("noteId") ?: 0L
Log.d("Note Id: ", noteId.toString())
- val addEditNoteViewModel =
- viewModel(
- viewModelStoreOwner = navBackStackEntry,
- factory =
- object : ViewModelProvider.Factory {
- override fun create(
- modelClass: Class,
- extras: CreationExtras,
- ): T {
- @Suppress("UNCHECKED_CAST")
- return addEditNoteViewModelFactory.create(extras.createSavedStateHandle()) as T
- }
- },
- )
+ val addEditNoteViewModel: AddEditNoteViewModel = hiltViewModel()
val state by addEditNoteViewModel.addEditeNoteUiState.collectAsStateWithLifecycle()
LaunchedEffect(Unit) {
addEditNoteViewModel.sideEffect.collect { sideEffect ->
diff --git a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/ui/AddEditNoteViewModel.kt b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/ui/AddEditNoteViewModel.kt
index de2f7b9..f886fba 100644
--- a/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/ui/AddEditNoteViewModel.kt
+++ b/feature/add_edit_note/ui/src/main/java/com/feature/add_edit_note/ui/ui/AddEditNoteViewModel.kt
@@ -8,14 +8,12 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
-import com.core.common.navigation.AddEditNoteScreen
+import com.core.common.navigation.Dest
import com.core.domain.model.NoteWithTag
import com.core.domain.usecase.GetAllTagsWithNotesUseCase
import com.feature.add_edit_note.domain.usecase.GetNoteWithTagByIdUseCase
import com.feature.add_edit_note.domain.usecase.UpsertNotesUseCase
-import dagger.assisted.Assisted
-import dagger.assisted.AssistedFactory
-import dagger.assisted.AssistedInject
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -28,22 +26,19 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import java.time.LocalDate
import java.time.format.DateTimeFormatter
+import javax.inject.Inject
private const val TAG = "NoteContent"
+@HiltViewModel
class AddEditNoteViewModel
- @AssistedInject
+ @Inject
constructor(
- @Assisted private val savedStateHandle: SavedStateHandle,
+ private val savedStateHandle: SavedStateHandle,
private val getNoteWithTagByIdUseCase: GetNoteWithTagByIdUseCase,
private val upsertNotesUseCase: UpsertNotesUseCase,
private val getAllTagsWithNotesUseCase: GetAllTagsWithNotesUseCase,
) : ViewModel() {
- @AssistedFactory
- interface Factory {
- fun create(savedStateHandle: SavedStateHandle): AddEditNoteViewModel
- }
-
private val _addEditeNoteUiState: MutableStateFlow =
MutableStateFlow(AddEditNoteUiState.Idle)
val addEditeNoteUiState: StateFlow =
@@ -55,7 +50,7 @@ class AddEditNoteViewModel
private var currentNote: NoteWithTag? = null
init {
- val addEditNoteScreen = savedStateHandle.toRoute()
+ val addEditNoteScreen = savedStateHandle.toRoute()
getNoteAndTags(addEditNoteScreen.noteId)
}
diff --git a/feature/notes/data/build.gradle.kts b/feature/notes/data/build.gradle.kts
index 9d76da5..e68f5dc 100644
--- a/feature/notes/data/build.gradle.kts
+++ b/feature/notes/data/build.gradle.kts
@@ -1,8 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
- id("com.google.devtools.ksp")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -48,9 +48,9 @@ dependencies {
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
// room
implementation(libs.androidx.room.runtime)
diff --git a/feature/notes/data/src/main/java/com/feature/notes/data/di/NotesDataModule.kt b/feature/notes/data/src/main/java/com/feature/notes/data/di/NotesDataModule.kt
index 7e83dc9..6d29f82 100644
--- a/feature/notes/data/src/main/java/com/feature/notes/data/di/NotesDataModule.kt
+++ b/feature/notes/data/src/main/java/com/feature/notes/data/di/NotesDataModule.kt
@@ -4,7 +4,10 @@ import com.core.domain.repo.NotesRepository
import com.feature.notes.data.repo.NotesRepositoryImpl
import dagger.Binds
import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+@InstallIn(SingletonComponent::class)
@Module
abstract class NotesDataModule {
@Binds
diff --git a/feature/notes/domain/build.gradle.kts b/feature/notes/domain/build.gradle.kts
index 46f5887..8c0e7a2 100644
--- a/feature/notes/domain/build.gradle.kts
+++ b/feature/notes/domain/build.gradle.kts
@@ -1,7 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -45,6 +46,6 @@ dependencies {
androidTestImplementation(libs.androidx.espresso.core)
// dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
}
diff --git a/feature/notes/ui/build.gradle.kts b/feature/notes/ui/build.gradle.kts
index a52c4eb..bd3d556 100644
--- a/feature/notes/ui/build.gradle.kts
+++ b/feature/notes/ui/build.gradle.kts
@@ -1,9 +1,10 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
- kotlin("plugin.serialization") version "2.0.21"
alias(libs.plugins.kotlin.compose)
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.kotlinx.serialization)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -39,7 +40,6 @@ android {
}
dependencies {
- implementation(project(":core:feature_api"))
implementation(project(":core:common"))
implementation(project(":core:domain"))
implementation(project(":feature:notes:domain"))
@@ -61,9 +61,10 @@ dependencies {
// navigation compose
implementation(libs.androidx.navigation.compose)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.hilt.navigation.compose)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
diff --git a/feature/notes/ui/src/main/java/com/feature/notes/ui/di/NotesUiModule.kt b/feature/notes/ui/src/main/java/com/feature/notes/ui/di/NotesUiModule.kt
index e87d4fe..b593f92 100644
--- a/feature/notes/ui/src/main/java/com/feature/notes/ui/di/NotesUiModule.kt
+++ b/feature/notes/ui/src/main/java/com/feature/notes/ui/di/NotesUiModule.kt
@@ -1,12 +1,15 @@
package com.feature.notes.ui.di
-import com.feature.notes.ui.navigation.NotesApi
-import com.feature.notes.ui.navigation.NotesApiImpl
+import com.feature.notes.ui.navigation.NotesFeature
+import com.feature.notes.ui.navigation.NotesFeatureImpl
import dagger.Binds
import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+@InstallIn(SingletonComponent::class)
@Module
abstract class NotesUiModule {
@Binds
- abstract fun bindNotesApi(notesApiImpl: NotesApiImpl): NotesApi
+ abstract fun bindNotesApi(notesFeatureImpl: NotesFeatureImpl): NotesFeature
}
diff --git a/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/InternalNotesFeatureApi.kt b/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/InternalNotesFeatureApi.kt
deleted file mode 100644
index 5de28fb..0000000
--- a/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/InternalNotesFeatureApi.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.feature.notes.ui.navigation
-
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.runtime.getValue
-import androidx.compose.ui.Modifier
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.lifecycle.viewmodel.compose.viewModel
-import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavHostController
-import androidx.navigation.compose.composable
-import androidx.navigation.navigation
-import com.core.common.navigation.AddEditNoteScreen
-import com.core.common.navigation.NotesGraph
-import com.core.common.navigation.NotesScreen
-import com.core.common.navigation.TagScreen
-import com.core.feature_api.FeatureApi
-import com.feature.notes.ui.screen.NotesScreen
-import com.feature.notes.ui.screen.NotesUiBottomSheet
-import com.feature.notes.ui.screen.NotesViewModel
-
-internal object InternalNotesFeatureApi : FeatureApi {
- override fun registerGraph(
- navHostController: NavHostController,
- navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
- ) {
- navGraphBuilder.navigation(
- startDestination = NotesScreen,
- ) {
- composable { navBackStackEntry ->
- val notesViewModel =
- viewModel(
- viewModelStoreOwner = navBackStackEntry,
- factory = viewModelFactory,
- )
- val state by notesViewModel.notesUiState.collectAsStateWithLifecycle()
- NotesScreen(
- modifier = Modifier.fillMaxSize(),
- notesUiState = state,
- onNoteClick = { note ->
- navHostController.navigate(AddEditNoteScreen(noteId = note.id))
- },
- onTagClick = { tag ->
- navHostController.navigate(TagScreen(tagId = tag.id))
- },
- onAddNoteClick = {
- notesViewModel.onFabClick()
- navHostController.navigate(AddEditNoteScreen(noteId = 0L))
- },
- onAddTagClick = {
- notesViewModel.onFabClick()
- notesViewModel.showCreateTagBottomSheet(NotesUiBottomSheet.CreateTagBottomSheet())
- },
- onFabClick = notesViewModel::onFabClick,
- onBottomSheetColorItemClick = { color ->
- notesViewModel.showCreateTagBottomSheet(NotesUiBottomSheet.CreateTagBottomSheet(selectedColor = color))
- },
- hideCreateTagBottomSheet = {
- notesViewModel.showCreateTagBottomSheet(NotesUiBottomSheet.None)
- },
- onSaveTagNameClick = notesViewModel::createTag,
- onNoteDoneClick = notesViewModel::markNoteAsDone,
- onNoteDeleteClick = notesViewModel::markNoteAsDeleted,
- )
- }
- }
- }
-}
diff --git a/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/NotesApi.kt b/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/NotesApi.kt
deleted file mode 100644
index 4292fe8..0000000
--- a/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/NotesApi.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.feature.notes.ui.navigation
-
-import androidx.lifecycle.ViewModelProvider
-import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavHostController
-import com.core.feature_api.FeatureApi
-import javax.inject.Inject
-
-interface NotesApi : FeatureApi
-
-class NotesApiImpl
- @Inject
- constructor() : NotesApi {
- override fun registerGraph(
- navHostController: NavHostController,
- navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
- ) {
- InternalNotesFeatureApi.registerGraph(navHostController, navGraphBuilder, viewModelFactory)
- }
- }
diff --git a/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/NotesFeatureNavigation.kt b/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/NotesFeatureNavigation.kt
new file mode 100644
index 0000000..684d1bf
--- /dev/null
+++ b/feature/notes/ui/src/main/java/com/feature/notes/ui/navigation/NotesFeatureNavigation.kt
@@ -0,0 +1,70 @@
+package com.feature.notes.ui.navigation
+
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import androidx.hilt.navigation.compose.hiltViewModel
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.navigation.NavGraphBuilder
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.composable
+import androidx.navigation.navigation
+import com.core.common.navigation.Dest
+import com.core.common.navigation.Feature
+import com.core.common.navigation.SubGraph
+import com.feature.notes.ui.screen.NotesScreen
+import com.feature.notes.ui.screen.NotesUiBottomSheet
+import com.feature.notes.ui.screen.NotesViewModel
+import javax.inject.Inject
+
+interface NotesFeature : Feature
+
+class NotesFeatureImpl
+ @Inject
+ constructor() : NotesFeature {
+ override fun registerGraph(
+ navHostController: NavHostController,
+ navGraphBuilder: NavGraphBuilder,
+ ) {
+ navGraphBuilder.navigation(
+ startDestination = Dest.Notes,
+ ) {
+ composable { navBackStackEntry ->
+ val notesViewModel: NotesViewModel = hiltViewModel()
+ val state by notesViewModel.notesUiState.collectAsStateWithLifecycle()
+ NotesScreen(
+ modifier = Modifier.fillMaxSize(),
+ notesUiState = state,
+ onNoteClick = { note ->
+ navHostController.navigate(Dest.AddEditNote(noteId = note.id))
+ },
+ onTagClick = { tag ->
+ navHostController.navigate(Dest.Tags(tagId = tag.id))
+ },
+ onAddNoteClick = {
+ notesViewModel.onFabClick()
+ navHostController.navigate(Dest.AddEditNote(noteId = 0L))
+ },
+ onAddTagClick = {
+ notesViewModel.onFabClick()
+ notesViewModel.showCreateTagBottomSheet(NotesUiBottomSheet.CreateTagBottomSheet())
+ },
+ onFabClick = notesViewModel::onFabClick,
+ onBottomSheetColorItemClick = { color ->
+ notesViewModel.showCreateTagBottomSheet(
+ NotesUiBottomSheet.CreateTagBottomSheet(
+ selectedColor = color,
+ ),
+ )
+ },
+ hideCreateTagBottomSheet = {
+ notesViewModel.showCreateTagBottomSheet(NotesUiBottomSheet.None)
+ },
+ onSaveTagNameClick = notesViewModel::createTag,
+ onNoteDoneClick = notesViewModel::markNoteAsDone,
+ onNoteDeleteClick = notesViewModel::markNoteAsDeleted,
+ )
+ }
+ }
+ }
+ }
diff --git a/feature/notes/ui/src/main/java/com/feature/notes/ui/screen/NotesViewModel.kt b/feature/notes/ui/src/main/java/com/feature/notes/ui/screen/NotesViewModel.kt
index e4426e4..4ae5027 100644
--- a/feature/notes/ui/src/main/java/com/feature/notes/ui/screen/NotesViewModel.kt
+++ b/feature/notes/ui/src/main/java/com/feature/notes/ui/screen/NotesViewModel.kt
@@ -14,6 +14,7 @@ import com.core.domain.usecase.UpdateNoteDeletedUseCase
import com.core.domain.usecase.UpdateNoteDoneUseCase
import com.feature.notes.domain.usecase.CreateTagUseCase
import com.feature.notes.domain.usecase.GetAllNotesWithTagUseCase
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -26,6 +27,7 @@ import java.time.LocalDate
import java.time.ZoneId
import javax.inject.Inject
+@HiltViewModel
class NotesViewModel
@Inject
constructor(
diff --git a/feature/tags/data/build.gradle.kts b/feature/tags/data/build.gradle.kts
index 2588e6e..16b4d19 100644
--- a/feature/tags/data/build.gradle.kts
+++ b/feature/tags/data/build.gradle.kts
@@ -1,8 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
- id("com.google.devtools.ksp")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -54,9 +54,9 @@ dependencies {
testImplementation(libs.androidx.room.testing)
androidTestImplementation(libs.androidx.room.testing)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
// Immutable persistent collections for Kotlin
implementation(libs.kotlinx.collections.immutable)
diff --git a/feature/tags/data/src/main/java/com/feature/tags/data/di/TagsDataModule.kt b/feature/tags/data/src/main/java/com/feature/tags/data/di/TagsDataModule.kt
index 90c9044..28d8a82 100644
--- a/feature/tags/data/src/main/java/com/feature/tags/data/di/TagsDataModule.kt
+++ b/feature/tags/data/src/main/java/com/feature/tags/data/di/TagsDataModule.kt
@@ -4,7 +4,10 @@ import com.core.domain.repo.TagsRepository
import com.feature.tags.data.repo.TagsRepositoryImpl
import dagger.Binds
import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+@InstallIn(SingletonComponent::class)
@Module
abstract class TagsDataModule {
@Binds
diff --git a/feature/tags/domain/build.gradle.kts b/feature/tags/domain/build.gradle.kts
index fe1dadd..3310bb8 100644
--- a/feature/tags/domain/build.gradle.kts
+++ b/feature/tags/domain/build.gradle.kts
@@ -1,7 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
- kotlin("kapt")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -45,6 +46,6 @@ dependencies {
androidTestImplementation(libs.androidx.espresso.core)
// dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
}
diff --git a/feature/tags/ui/build.gradle.kts b/feature/tags/ui/build.gradle.kts
index 8d3e723..73d09b6 100644
--- a/feature/tags/ui/build.gradle.kts
+++ b/feature/tags/ui/build.gradle.kts
@@ -2,7 +2,8 @@ plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
- kotlin("kapt")
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.hilt.android)
}
android {
@@ -50,8 +51,6 @@ android {
}
dependencies {
-
- implementation(project(":core:feature_api"))
implementation(project(":core:common"))
implementation(project(":core:domain"))
@@ -74,9 +73,10 @@ dependencies {
// navigation compose
implementation(libs.androidx.navigation.compose)
- // dagger2
- implementation(libs.dagger)
- kapt(libs.dagger.compiler)
+ // dagger hilt
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.hilt.navigation.compose)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
diff --git a/feature/tags/ui/src/main/java/com/feature/tags/ui/di/TagsUiModule.kt b/feature/tags/ui/src/main/java/com/feature/tags/ui/di/TagsUiModule.kt
index ef22283..f4f04aa 100644
--- a/feature/tags/ui/src/main/java/com/feature/tags/ui/di/TagsUiModule.kt
+++ b/feature/tags/ui/src/main/java/com/feature/tags/ui/di/TagsUiModule.kt
@@ -1,12 +1,15 @@
package com.feature.tags.ui.di
-import com.feature.tags.ui.navigation.TagsApi
-import com.feature.tags.ui.navigation.TagsApiImpl
+import com.feature.tags.ui.navigation.TagsFeature
+import com.feature.tags.ui.navigation.TagsFeatureImpl
import dagger.Binds
import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+@InstallIn(SingletonComponent::class)
@Module
abstract class TagsUiModule {
@Binds
- abstract fun bindTagsApi(tagsApiImpl: TagsApiImpl): TagsApi
+ abstract fun bindTagsApi(tagsApiImpl: TagsFeatureImpl): TagsFeature
}
diff --git a/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/TagsApi.kt b/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/TagsApi.kt
deleted file mode 100644
index 9c1fc74..0000000
--- a/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/TagsApi.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.feature.tags.ui.navigation
-
-import androidx.lifecycle.ViewModelProvider
-import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavHostController
-import com.core.feature_api.FeatureApi
-import javax.inject.Inject
-
-interface TagsApi : FeatureApi
-
-class TagsApiImpl
- @Inject
- internal constructor(
- private val internalTagsFeatureApi: InternalTagsFeatureApi,
- ) : TagsApi {
- override fun registerGraph(
- navHostController: NavHostController,
- navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
- ) {
- internalTagsFeatureApi.registerGraph(
- navHostController,
- navGraphBuilder,
- viewModelFactory,
- )
- }
- }
diff --git a/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/InternalTagsFeatureApi.kt b/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/TagsFeatureNavigation.kt
similarity index 57%
rename from feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/InternalTagsFeatureApi.kt
rename to feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/TagsFeatureNavigation.kt
index 0ba3b7d..5665d4f 100644
--- a/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/InternalTagsFeatureApi.kt
+++ b/feature/tags/ui/src/main/java/com/feature/tags/ui/navigation/TagsFeatureNavigation.kt
@@ -4,57 +4,36 @@ import android.util.Log
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
+import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.lifecycle.createSavedStateHandle
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.navigation
-import com.core.common.navigation.AddEditNoteScreen
-import com.core.common.navigation.TagGraph
-import com.core.common.navigation.TagScreen
+import com.core.common.navigation.Dest
+import com.core.common.navigation.Feature
+import com.core.common.navigation.SubGraph
import com.core.domain.model.TagWithNotes
-import com.core.feature_api.FeatureApi
import com.feature.tags.ui.screen.TagScreenUi
import com.feature.tags.ui.screen.TagsUiBottomSheet
import com.feature.tags.ui.screen.TagsViewModel
import javax.inject.Inject
-internal class InternalTagsFeatureApi
+interface TagsFeature : Feature
+
+class TagsFeatureImpl
@Inject
- constructor(
- private val tagsViewModelFactory: TagsViewModel.Factory,
- ) : FeatureApi {
+ internal constructor() : TagsFeature {
override fun registerGraph(
navHostController: NavHostController,
navGraphBuilder: NavGraphBuilder,
- viewModelFactory: ViewModelProvider.Factory,
) {
- navGraphBuilder.navigation(
- startDestination = TagScreen(tagId = 0),
- ) {
- composable { navBackStackEntry: NavBackStackEntry ->
+ navGraphBuilder.navigation(startDestination = Dest.Tags(tagId = 0)) {
+ composable { navBackStackEntry: NavBackStackEntry ->
val tagId = navBackStackEntry.arguments?.getLong("tagId") ?: 0L
Log.d("Tag Id: ", tagId.toString())
- val tagsViewModel =
- viewModel(
- viewModelStoreOwner = navBackStackEntry,
- factory =
- object : ViewModelProvider.Factory {
- override fun create(
- modelClass: Class,
- extras: CreationExtras,
- ): T {
- @Suppress("UNCHECKED_CAST")
- return tagsViewModelFactory.create(extras.createSavedStateHandle()) as T
- }
- },
- )
+ val tagsViewModel: TagsViewModel = hiltViewModel()
val state by tagsViewModel.tagsUiState.collectAsStateWithLifecycle()
TagScreenUi(
modifier = Modifier.fillMaxSize(),
@@ -73,7 +52,7 @@ internal class InternalTagsFeatureApi
},
onSaveTagNameClick = tagsViewModel::updateTagName,
onNoteClick = { note ->
- navHostController.navigate(AddEditNoteScreen(noteId = note.id))
+ navHostController.navigate(Dest.AddEditNote(noteId = note.id))
},
onNoteDoneClick = tagsViewModel::markNoteAsDone,
onNoteDeleteClick = tagsViewModel::markNoteAsDeleted,
diff --git a/feature/tags/ui/src/main/java/com/feature/tags/ui/screen/TagsViewModel.kt b/feature/tags/ui/src/main/java/com/feature/tags/ui/screen/TagsViewModel.kt
index 660a6f6..348da59 100644
--- a/feature/tags/ui/src/main/java/com/feature/tags/ui/screen/TagsViewModel.kt
+++ b/feature/tags/ui/src/main/java/com/feature/tags/ui/screen/TagsViewModel.kt
@@ -7,26 +7,26 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
-import com.core.common.navigation.TagScreen
+import com.core.common.navigation.Dest
import com.core.domain.model.Note
import com.core.domain.usecase.UpdateNoteDeletedUseCase
import com.core.domain.usecase.UpdateNoteDoneUseCase
import com.feature.tags.domain.usecase.GetTagWithNotesUseCase
import com.feature.tags.domain.usecase.UpdateTagNameUseCase
import dagger.Lazy
-import dagger.assisted.Assisted
-import dagger.assisted.AssistedFactory
-import dagger.assisted.AssistedInject
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
+import javax.inject.Inject
+@HiltViewModel
class TagsViewModel
- @AssistedInject
+ @Inject
constructor(
- @Assisted private val savedStateHandle: SavedStateHandle,
+ private val savedStateHandle: SavedStateHandle,
private val getTagWithNotesUseCase: GetTagWithNotesUseCase,
private val updateTagNameUseCase: Lazy,
private val updateNoteDoneUseCase: Lazy,
@@ -36,16 +36,11 @@ class TagsViewModel
private val TAG = TagsViewModel::class.simpleName
}
- @AssistedFactory
- interface Factory {
- fun create(savedStateHandle: SavedStateHandle): TagsViewModel
- }
-
private val _tagsUiState: MutableStateFlow = MutableStateFlow(TagsUiState.Idle)
val tagsUiState: StateFlow = _tagsUiState.asStateFlow()
init {
- val tagsScreen = savedStateHandle.toRoute()
+ val tagsScreen = savedStateHandle.toRoute()
viewModelScope.launch {
_tagsUiState.value = TagsUiState.Loading
@Suppress("TooGenericExceptionCaught")
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index ee61541..4f9effe 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -24,13 +24,14 @@ retrofit = "2.11.0"
kotlinxSerializationJson = "1.8.1"
loggingInterceptor = "4.12.0"
converterKotlinxSerialization = "2.11.0"
-dagger = "2.56.2"
roomRuntime = "2.7.2"
turbine = "1.2.0"
calendar = "2.7.0"
ktlint = "12.3.0"
detekt = "1.23.8"
ksp = "2.0.21-1.0.27"
+hilt = "2.57"
+hiltNavigationCompose = "1.2.0"
[libraries]
androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutCompose" }
@@ -67,10 +68,11 @@ retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "loggingInterceptor" }
converter-kotlinx-serialization = { module = "com.squareup.retrofit2:converter-kotlinx-serialization", version.ref = "converterKotlinxSerialization" }
-dagger = { module = "com.google.dagger:dagger", version.ref = "dagger" }
-dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }
turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" }
-kizitonwose-calendar-compose = {module = "com.kizitonwose.calendar:compose", version.ref = "calendar"}
+kizitonwose-calendar-compose = { module = "com.kizitonwose.calendar:compose", version.ref = "calendar" }
+hilt = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
+hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
+hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
@@ -81,3 +83,5 @@ ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
room = { id = "androidx.room", version.ref = "roomRuntime" }
+hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
+kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 7483706..acae679 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -29,7 +29,6 @@ include(":feature:add_edit_note:domain")
include(":feature:add_edit_note:ui")
include(":core:network")
include(":core:common")
-include(":core:feature_api")
include(":core:database")
include(":core:domain")
include(":feature:tags:data")