diff --git a/app/build.gradle b/app/build.gradle
index f5445fb..9e69c13 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,6 +1,7 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
+ id 'kotlin-kapt'
}
android {
@@ -34,9 +35,13 @@ android {
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
- implementation 'androidx.appcompat:appcompat:1.3.1'
- implementation 'com.google.android.material:material:1.4.0'
- implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
+ implementation 'androidx.appcompat:appcompat:1.4.1'
+ implementation 'com.google.android.material:material:1.5.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
+
+ implementation 'com.google.dagger:dagger:2.39.1'
+ kapt 'com.google.dagger:dagger-compiler:2.39.1'
+
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 41253ba..49ab16f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt
index a91a1eb..9f43c01 100644
--- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt
@@ -1,14 +1,13 @@
package com.example.dependencyinjectionstart.example1
+import javax.inject.Inject
+
class Activity {
- val monitor = Monitor()
- val keyboard = Keyboard()
- val mouse = Mouse()
- val computerTower = ComputerTower(
- Storage(),
- Memory(),
- Processor()
- )
- val computer = Computer(monitor, computerTower, keyboard, mouse)
+ @Inject
+ lateinit var computer: Computer
+
+ init {
+ DaggerMyComponent.create().inject(this)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt
new file mode 100644
index 0000000..22a1e5c
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt
@@ -0,0 +1,20 @@
+package com.example.dependencyinjectionstart.example1
+
+class Component {
+
+ private fun getComputer() : Computer {
+ val monitor = Monitor()
+ val keyboard = Keyboard()
+ val mouse = Mouse()
+ val computerTower = ComputerTower(
+ Storage(),
+ Memory(),
+ Processor()
+ )
+ return Computer(monitor, computerTower, keyboard, mouse)
+ }
+
+ fun inject(activity: Activity) {
+// activity.keyboard = Keyboard()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt
index 30d1e0d..f301e18 100644
--- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt
@@ -1,6 +1,6 @@
package com.example.dependencyinjectionstart.example1
-class Computer(
+class Computer (
val monitor: Monitor,
val computerTower: ComputerTower,
val keyboard: Keyboard,
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt
new file mode 100644
index 0000000..57e24fb
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt
@@ -0,0 +1,60 @@
+package com.example.dependencyinjectionstart.example1
+
+import dagger.Module
+import dagger.Provides
+
+
+// Если у нас нет доступа к классу (например, из библиотеки), то с помощью модуля мы можем создать
+// экземпляр класса
+@Module
+class ComputerModule {
+
+ @Provides
+ fun provideMonitor(): Monitor {
+ return Monitor()
+ }
+
+ @Provides
+ fun provideProcessor(): Processor {
+ return Processor()
+ }
+
+ @Provides
+ fun provideMemory(): Memory {
+ return Memory()
+ }
+
+ @Provides
+ fun provideStorage(): Storage {
+ return Storage()
+ }
+
+ @Provides
+ fun provideMouse(): Mouse {
+ return Mouse()
+ }
+
+ @Provides
+ fun provideKeyboard(): Keyboard {
+ return Keyboard()
+ }
+
+ @Provides
+ fun provideComputerTower(
+ storage: Storage,
+ memory: Memory,
+ processor: Processor
+ ): ComputerTower {
+ return ComputerTower(storage, memory, processor)
+ }
+
+ @Provides
+ fun provideComputer(
+ monitor: Monitor,
+ computerTower: ComputerTower,
+ keyboard: Keyboard,
+ mouse: Mouse
+ ): Computer {
+ return Computer(monitor, computerTower, keyboard, mouse)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt
index 2cf8e18..8d742e8 100644
--- a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt
@@ -1,6 +1,6 @@
package com.example.dependencyinjectionstart.example1
-class ComputerTower(
+class ComputerTower (
val storage: Storage,
val memory: Memory,
val processor: Processor
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt
new file mode 100644
index 0000000..36cc7fe
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt
@@ -0,0 +1,9 @@
+package com.example.dependencyinjectionstart.example1
+
+import dagger.Component
+
+@Component(modules = [ComputerModule::class])
+interface MyComponent {
+
+ fun inject(activity: Activity)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/ExampleApp.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/ExampleApp.kt
new file mode 100644
index 0000000..1435c09
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/ExampleApp.kt
@@ -0,0 +1,11 @@
+package com.example.dependencyinjectionstart.example2
+
+import android.app.Application
+import com.example.dependencyinjectionstart.example2.di.DaggerApplicationComponent
+
+class ExampleApp: Application() {
+ val component by lazy {
+ DaggerApplicationComponent.factory()
+ .create(this, System.currentTimeMillis())
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleApiService.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleApiService.kt
deleted file mode 100644
index f9a50aa..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleApiService.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-class ExampleApiService {
-
- fun method() {
-
- }
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleDatabase.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleDatabase.kt
deleted file mode 100644
index 2a5faf9..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleDatabase.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-class ExampleDatabase {
-
- fun method() {
-
- }
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSource.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSource.kt
deleted file mode 100644
index a3426c2..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSource.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-interface ExampleLocalDataSource {
-
- fun method()
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSourceImpl.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSourceImpl.kt
deleted file mode 100644
index fa13972..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSourceImpl.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-class ExampleLocalDataSourceImpl(
- private val database: ExampleDatabase
-) : ExampleLocalDataSource {
-
- override fun method() {
-
- }
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleMapper.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleMapper.kt
deleted file mode 100644
index cc3c4c4..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleMapper.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-class ExampleMapper {
-
- fun map() {
-
- }
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSource.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSource.kt
deleted file mode 100644
index eb7016a..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSource.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-interface ExampleRemoteDataSource {
-
- fun method()
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSourceImpl.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSourceImpl.kt
deleted file mode 100644
index 89d9acd..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSourceImpl.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-class ExampleRemoteDataSourceImpl(
- private val apiService: ExampleApiService
-) : ExampleRemoteDataSource {
-
- override fun method() {
-
- }
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRepositoryImpl.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRepositoryImpl.kt
deleted file mode 100644
index bad06de..0000000
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRepositoryImpl.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.example.dependencyinjectionstart.example2.data
-
-import com.example.dependencyinjectionstart.example2.domain.ExampleRepository
-
-class ExampleRepositoryImpl(
- private val localDataSource: ExampleLocalDataSource,
- private val remoteDataSource: ExampleRemoteDataSource
-) : ExampleRepository {
-
- override fun method() {
-
- }
-}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/database/ExampleDatabase.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/database/ExampleDatabase.kt
new file mode 100644
index 0000000..9811abc
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/database/ExampleDatabase.kt
@@ -0,0 +1,22 @@
+package com.example.dependencyinjectionstart.example2.data.database
+
+import android.content.Context
+import android.util.Log
+import com.example.dependencyinjectionstart.R
+import javax.inject.Inject
+
+class ExampleDatabase @Inject constructor(
+ private val context: Context,
+ private val timeMillis: Long
+) {
+
+ fun method() {
+ Log.d(
+ LOG_TAG,
+ "ExampleDatabase ${context.getString(R.string.app_name)} $timeMillis $this")
+ }
+
+ companion object {
+ private const val LOG_TAG = "EXAMPLE_TEST"
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSource.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSource.kt
new file mode 100644
index 0000000..8e1a2ea
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSource.kt
@@ -0,0 +1,6 @@
+package com.example.dependencyinjectionstart.example2.data.datasource
+
+interface ExampleLocalDataSource {
+
+ fun method()
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSourceImpl.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSourceImpl.kt
new file mode 100644
index 0000000..53564b3
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSourceImpl.kt
@@ -0,0 +1,13 @@
+package com.example.dependencyinjectionstart.example2.data.datasource
+
+import com.example.dependencyinjectionstart.example2.data.database.ExampleDatabase
+import javax.inject.Inject
+
+class ExampleLocalDataSourceImpl @Inject constructor(
+ private val database: ExampleDatabase
+) : ExampleLocalDataSource {
+
+ override fun method() {
+ database.method()
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSource.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSource.kt
new file mode 100644
index 0000000..15f84d0
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSource.kt
@@ -0,0 +1,6 @@
+package com.example.dependencyinjectionstart.example2.data.datasource
+
+interface ExampleRemoteDataSource {
+
+ fun method()
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSourceImpl.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSourceImpl.kt
new file mode 100644
index 0000000..fbae057
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSourceImpl.kt
@@ -0,0 +1,13 @@
+package com.example.dependencyinjectionstart.example2.data.datasource
+
+import com.example.dependencyinjectionstart.example2.data.network.ExampleApiService
+import javax.inject.Inject
+
+class ExampleRemoteDataSourceImpl @Inject constructor(
+ private val apiService: ExampleApiService
+) : ExampleRemoteDataSource {
+
+ override fun method() {
+ apiService.method()
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/mapper/ExampleMapper.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/mapper/ExampleMapper.kt
new file mode 100644
index 0000000..e4543e4
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/mapper/ExampleMapper.kt
@@ -0,0 +1,10 @@
+package com.example.dependencyinjectionstart.example2.data.mapper
+
+import javax.inject.Inject
+
+class ExampleMapper @Inject constructor() {
+
+ fun map() {
+
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/network/ExampleApiService.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/network/ExampleApiService.kt
new file mode 100644
index 0000000..f89efc6
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/network/ExampleApiService.kt
@@ -0,0 +1,23 @@
+package com.example.dependencyinjectionstart.example2.data.network
+
+import android.content.Context
+import android.util.Log
+import com.example.dependencyinjectionstart.R
+import javax.inject.Inject
+
+class ExampleApiService @Inject constructor(
+ private val context: Context,
+ private val timeMillis: Long
+) {
+
+ fun method() {
+ Log.d(
+ LOG_TAG,
+ "ExampleApiService ${context.getString(R.string.app_name)} $timeMillis $this"
+ )
+ }
+
+ companion object {
+ private const val LOG_TAG = "EXAMPLE_TEST"
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/data/repository/ExampleRepositoryImpl.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/repository/ExampleRepositoryImpl.kt
new file mode 100644
index 0000000..deeb3ac
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/repository/ExampleRepositoryImpl.kt
@@ -0,0 +1,20 @@
+package com.example.dependencyinjectionstart.example2.data.repository
+
+import com.example.dependencyinjectionstart.example2.data.datasource.ExampleLocalDataSource
+import com.example.dependencyinjectionstart.example2.data.datasource.ExampleRemoteDataSource
+import com.example.dependencyinjectionstart.example2.data.mapper.ExampleMapper
+import com.example.dependencyinjectionstart.example2.domain.ExampleRepository
+import javax.inject.Inject
+
+class ExampleRepositoryImpl @Inject constructor(
+ private val localDataSource: ExampleLocalDataSource,
+ private val remoteDataSource: ExampleRemoteDataSource,
+ private val mapper: ExampleMapper
+) : ExampleRepository {
+
+ override fun method() {
+ mapper.map()
+ localDataSource.method()
+ remoteDataSource.method()
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt
new file mode 100644
index 0000000..5474a5b
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt
@@ -0,0 +1,41 @@
+package com.example.dependencyinjectionstart.example2.di
+
+import android.content.Context
+import com.example.dependencyinjectionstart.example2.data.database.ExampleDatabase
+import com.example.dependencyinjectionstart.example2.data.network.ExampleApiService
+import com.example.dependencyinjectionstart.example2.presentation.ExampleViewModel
+import com.example.dependencyinjectionstart.example2.presentation.MainActivity
+import com.example.dependencyinjectionstart.example2.presentation.MainActivity2
+import dagger.BindsInstance
+import dagger.Component
+import javax.inject.Singleton
+
+@ApplicationScope
+@Component(modules = [DataModule::class, DomainModule::class, ViewModelModule::class])
+interface ApplicationComponent {
+
+ fun inject(activity: MainActivity)
+
+ fun inject(activity: MainActivity2)
+
+// @Component.Builder
+// interface ApplicationComponentBuilder {
+//
+// @BindsInstance
+// fun context(context: Context): ApplicationComponentBuilder
+//
+// @BindsInstance
+// fun time(timeMillis: Long): ApplicationComponentBuilder
+//
+// fun build(): ApplicationComponent
+// }
+
+ @Component.Factory
+ interface ApplicationComponentFactory {
+
+ fun create(
+ @BindsInstance context: Context,
+ @BindsInstance timeMillis: Long
+ ): ApplicationComponent
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationScope.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationScope.kt
new file mode 100644
index 0000000..a566f7a
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationScope.kt
@@ -0,0 +1,7 @@
+package com.example.dependencyinjectionstart.example2.di
+
+import javax.inject.Scope
+
+@Scope
+@Retention(AnnotationRetention.RUNTIME)
+annotation class ApplicationScope
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt
new file mode 100644
index 0000000..6927877
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt
@@ -0,0 +1,25 @@
+package com.example.dependencyinjectionstart.example2.di
+
+import com.example.dependencyinjectionstart.example2.data.datasource.ExampleLocalDataSource
+import com.example.dependencyinjectionstart.example2.data.datasource.ExampleLocalDataSourceImpl
+import com.example.dependencyinjectionstart.example2.data.datasource.ExampleRemoteDataSource
+import com.example.dependencyinjectionstart.example2.data.datasource.ExampleRemoteDataSourceImpl
+import dagger.Binds
+import dagger.Module
+
+
+@Module
+interface DataModule {
+
+ @ApplicationScope
+ @Binds
+ fun bindLocalDataSource(
+ localDataSource: ExampleLocalDataSourceImpl
+ ): ExampleLocalDataSource
+
+ @ApplicationScope
+ @Binds
+ fun bindExampleRemoteDataSource (
+ remoteDataSource: ExampleRemoteDataSourceImpl
+ ): ExampleRemoteDataSource
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt
new file mode 100644
index 0000000..f764eff
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt
@@ -0,0 +1,14 @@
+package com.example.dependencyinjectionstart.example2.di
+
+import com.example.dependencyinjectionstart.example2.data.repository.ExampleRepositoryImpl
+import com.example.dependencyinjectionstart.example2.domain.ExampleRepository
+import dagger.Binds
+import dagger.Module
+import dagger.Provides
+
+@Module
+interface DomainModule {
+
+ @Binds
+ fun bindRepository(impl: ExampleRepositoryImpl): ExampleRepository
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ViewModelModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ViewModelModule.kt
new file mode 100644
index 0000000..e6606da
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ViewModelModule.kt
@@ -0,0 +1,23 @@
+package com.example.dependencyinjectionstart.example2.di
+
+import androidx.lifecycle.ViewModel
+import com.example.dependencyinjectionstart.example2.presentation.ExampleViewModel
+import com.example.dependencyinjectionstart.example2.presentation.ExampleViewModel2
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.IntoMap
+import dagger.multibindings.StringKey
+
+@Module
+interface ViewModelModule {
+
+ @IntoMap
+ @StringKey("ExampleViewModel")
+ @Binds
+ fun bindExampleViewModel(impl: ExampleViewModel): ViewModel
+
+ @IntoMap
+ @StringKey("ExampleViewModel2")
+ @Binds
+ fun bindExampleViewModel2(impl: ExampleViewModel2): ViewModel
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/domain/ExampleUseCase.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/domain/ExampleUseCase.kt
index eff238d..5d4a148 100644
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/domain/ExampleUseCase.kt
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/domain/ExampleUseCase.kt
@@ -1,10 +1,12 @@
package com.example.dependencyinjectionstart.example2.domain
-class ExampleUseCase(
+import javax.inject.Inject
+
+class ExampleUseCase @Inject constructor(
private val repository: ExampleRepository
) {
operator fun invoke() {
-
+ repository.method()
}
}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel.kt
index f0ab118..32bcd12 100644
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel.kt
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel.kt
@@ -1,12 +1,16 @@
package com.example.dependencyinjectionstart.example2.presentation
+import android.util.Log
+import androidx.lifecycle.ViewModel
import com.example.dependencyinjectionstart.example2.domain.ExampleUseCase
+import javax.inject.Inject
-class ExampleViewModel(
+class ExampleViewModel @Inject constructor(
private val useCase: ExampleUseCase
-) {
+) : ViewModel() {
fun method() {
-
+ useCase()
+ Log.d("ExampleViewModel", "$this")
}
}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel2.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel2.kt
new file mode 100644
index 0000000..b5a5180
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel2.kt
@@ -0,0 +1,17 @@
+package com.example.dependencyinjectionstart.example2.presentation
+
+import android.util.Log
+import androidx.lifecycle.ViewModel
+import com.example.dependencyinjectionstart.example2.domain.ExampleRepository
+import com.example.dependencyinjectionstart.example2.domain.ExampleUseCase
+import javax.inject.Inject
+
+class ExampleViewModel2 @Inject constructor(
+ private val repository: ExampleRepository
+) : ViewModel() {
+
+ fun method() {
+ repository.method()
+ Log.d("ExampleViewModel", "$this")
+ }
+}
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt
index 84775ec..493a66d 100644
--- a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt
@@ -1,12 +1,41 @@
package com.example.dependencyinjectionstart.example2.presentation
+import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import android.widget.TextView
+import androidx.lifecycle.ViewModelProvider
import com.example.dependencyinjectionstart.R
+import com.example.dependencyinjectionstart.example2.ExampleApp
+import javax.inject.Inject
class MainActivity : AppCompatActivity() {
+
+ @Inject
+ lateinit var viewModelFactory: ViewModelFactory
+
+ private val viewModel by lazy {
+ ViewModelProvider(this, viewModelFactory) [ExampleViewModel::class.java]
+ }
+
+ private val viewModel2 by lazy {
+ ViewModelProvider(this, viewModelFactory) [ExampleViewModel2::class.java]
+ }
+
+ private val component by lazy {
+ (application as ExampleApp).component
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
+ component.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
+ viewModel.method()
+ viewModel2.method()
+ findViewById(R.id.tv_hello_world).setOnClickListener {
+ Intent(this, MainActivity2::class.java).apply {
+ startActivity(this)
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity2.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity2.kt
new file mode 100644
index 0000000..3fc3cd8
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity2.kt
@@ -0,0 +1,34 @@
+package com.example.dependencyinjectionstart.example2.presentation
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import androidx.lifecycle.ViewModelProvider
+import com.example.dependencyinjectionstart.R
+import com.example.dependencyinjectionstart.example2.ExampleApp
+import javax.inject.Inject
+
+class MainActivity2 : AppCompatActivity() {
+
+ @Inject
+ lateinit var viewModelFactory: ViewModelFactory
+
+ private val viewModel by lazy {
+ ViewModelProvider(this, viewModelFactory) [ExampleViewModel::class.java]
+ }
+
+ private val viewModel2 by lazy {
+ ViewModelProvider(this, viewModelFactory) [ExampleViewModel2::class.java]
+ }
+
+ private val component by lazy {
+ (application as ExampleApp).component
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ component.inject(this)
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+ viewModel.method()
+ viewModel2.method()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt
new file mode 100644
index 0000000..c11a347
--- /dev/null
+++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt
@@ -0,0 +1,16 @@
+package com.example.dependencyinjectionstart.example2.presentation
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.example.dependencyinjectionstart.example2.di.ApplicationScope
+import javax.inject.Inject
+import javax.inject.Provider
+
+@ApplicationScope
+class ViewModelFactory @Inject constructor(
+ private val viewModelProviders: @JvmSuppressWildcards Map>
+): ViewModelProvider.Factory {
+ override fun create(modelClass: Class): T {
+ return viewModelProviders[modelClass.simpleName]?.get() as T
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 881bf8f..d05e417 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -7,6 +7,7 @@
tools:context=".example2.presentation.MainActivity">