From 8ac8cbbb4fde5cb7604e4ddd8817878ed9c8d837 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sat, 19 Feb 2022 16:44:13 +0300 Subject: [PATCH 01/13] Create Component and inject() --- .../example1/Activity.kt | 14 +++++-------- .../example1/Component.kt | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt 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..b0c1740 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt @@ -2,13 +2,9 @@ package com.example.dependencyinjectionstart.example1 class Activity { - val monitor = Monitor() - val keyboard = Keyboard() - val mouse = Mouse() - val computerTower = ComputerTower( - Storage(), - Memory(), - Processor() - ) - val computer = Computer(monitor, computerTower, keyboard, mouse) + lateinit var computer: Computer + + init { + Component().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..f821dcc --- /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.computer = getComputer() + } +} \ No newline at end of file From 6513715a9b581478c8630625487a90a5c517ca1f Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sat, 19 Feb 2022 16:59:35 +0300 Subject: [PATCH 02/13] Add dagger 2 dependencies --- app/build.gradle | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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' From f3982b199b1b2c9e814dc42e0309120bcb565db0 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sat, 19 Feb 2022 17:40:26 +0300 Subject: [PATCH 03/13] create dagger component --- .../dependencyinjectionstart/example1/Activity.kt | 13 +++++++++++-- .../dependencyinjectionstart/example1/Component.kt | 2 +- .../dependencyinjectionstart/example1/Keyboard.kt | 4 +++- .../dependencyinjectionstart/example1/Monitor.kt | 4 +++- .../dependencyinjectionstart/example1/Mouse.kt | 4 +++- .../example1/MyComponent.kt | 13 +++++++++++++ .../example2/presentation/MainActivity.kt | 5 +++++ 7 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt 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 b0c1740..c9fdea5 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt @@ -1,10 +1,19 @@ package com.example.dependencyinjectionstart.example1 +import javax.inject.Inject + class Activity { - lateinit var computer: Computer + private val component = DaggerMyComponent.create() + + val keyboard: Keyboard = component.getKeyboard() + + @Inject + lateinit var mouse: Mouse + + val monitor: Monitor = component.getMonitor() init { - Component().inject(this) + 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 index f821dcc..22a1e5c 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt @@ -15,6 +15,6 @@ class Component { } fun inject(activity: Activity) { - activity.computer = getComputer() +// activity.keyboard = Keyboard() } } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt index a0e524d..d46cf82 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt @@ -1,4 +1,6 @@ package com.example.dependencyinjectionstart.example1 -class Keyboard { +import javax.inject.Inject + +class Keyboard @Inject constructor() { } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt index bf8220b..bd04e5f 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt @@ -1,4 +1,6 @@ package com.example.dependencyinjectionstart.example1 -class Monitor { +import javax.inject.Inject + +class Monitor @Inject constructor() { } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt index 858c800..ca6d11d 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt @@ -1,4 +1,6 @@ package com.example.dependencyinjectionstart.example1 -class Mouse { +import javax.inject.Inject + +class Mouse @Inject constructor() { } \ No newline at end of file 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..b7a648a --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt @@ -0,0 +1,13 @@ +package com.example.dependencyinjectionstart.example1 + +import dagger.Component + +@Component +interface MyComponent { + + fun getMonitor(): Monitor + + fun getKeyboard(): Keyboard + + fun inject(activity: Activity) +} \ No newline at end of file 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..21fb800 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 @@ -3,10 +3,15 @@ package com.example.dependencyinjectionstart.example2.presentation import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.dependencyinjectionstart.R +import com.example.dependencyinjectionstart.example1.Activity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + val activity = Activity() + activity.keyboard.toString() + activity.mouse.toString() + activity.monitor.toString() } } \ No newline at end of file From 5e30b133533018079c039170c858655409922f77 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sat, 19 Feb 2022 22:58:54 +0300 Subject: [PATCH 04/13] create Module and Provides --- .../example1/Activity.kt | 8 +-- .../example1/Computer.kt | 2 +- .../example1/ComputerModule.kt | 60 +++++++++++++++++++ .../example1/ComputerTower.kt | 2 +- .../example1/Keyboard.kt | 4 +- .../example1/Monitor.kt | 4 +- .../example1/Mouse.kt | 4 +- .../example1/MyComponent.kt | 6 +- .../example2/presentation/MainActivity.kt | 4 +- 9 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt 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 c9fdea5..9f43c01 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt @@ -4,14 +4,8 @@ import javax.inject.Inject class Activity { - private val component = DaggerMyComponent.create() - - val keyboard: Keyboard = component.getKeyboard() - @Inject - lateinit var mouse: Mouse - - val monitor: Monitor = component.getMonitor() + lateinit var computer: Computer init { DaggerMyComponent.create().inject(this) 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..e737dd1 --- /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/Keyboard.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt index d46cf82..a0e524d 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Keyboard.kt @@ -1,6 +1,4 @@ package com.example.dependencyinjectionstart.example1 -import javax.inject.Inject - -class Keyboard @Inject constructor() { +class Keyboard { } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt index bd04e5f..bf8220b 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Monitor.kt @@ -1,6 +1,4 @@ package com.example.dependencyinjectionstart.example1 -import javax.inject.Inject - -class Monitor @Inject constructor() { +class Monitor { } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt index ca6d11d..858c800 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Mouse.kt @@ -1,6 +1,4 @@ package com.example.dependencyinjectionstart.example1 -import javax.inject.Inject - -class Mouse @Inject constructor() { +class Mouse { } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt index b7a648a..36cc7fe 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt @@ -2,12 +2,8 @@ package com.example.dependencyinjectionstart.example1 import dagger.Component -@Component +@Component(modules = [ComputerModule::class]) interface MyComponent { - fun getMonitor(): Monitor - - fun getKeyboard(): Keyboard - fun inject(activity: Activity) } \ No newline at end of file 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 21fb800..e81bcaf 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 @@ -10,8 +10,6 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val activity = Activity() - activity.keyboard.toString() - activity.mouse.toString() - activity.monitor.toString() + activity.computer.toString() } } \ No newline at end of file From 9025a7ebbc5d12dd5d89dedba743ce389a452503 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sun, 20 Feb 2022 13:22:21 +0300 Subject: [PATCH 05/13] use Binds --- .../example1/ComputerModule.kt | 4 ++-- .../example2/data/ExampleApiService.kt | 8 ------- .../example2/data/ExampleDatabase.kt | 8 ------- .../example2/data/ExampleLocalDataSource.kt | 6 ----- .../data/ExampleLocalDataSourceImpl.kt | 10 --------- .../example2/data/ExampleMapper.kt | 8 ------- .../example2/data/ExampleRemoteDataSource.kt | 6 ----- .../data/ExampleRemoteDataSourceImpl.kt | 10 --------- .../example2/data/ExampleRepositoryImpl.kt | 13 ----------- .../example2/data/database/ExampleDatabase.kt | 15 +++++++++++++ .../data/datasource/ExampleLocalDataSource.kt | 6 +++++ .../datasource/ExampleLocalDataSourceImpl.kt | 13 +++++++++++ .../datasource/ExampleRemoteDataSource.kt | 6 +++++ .../datasource/ExampleRemoteDataSourceImpl.kt | 13 +++++++++++ .../example2/data/mapper/ExampleMapper.kt | 10 +++++++++ .../data/network/ExampleApiService.kt | 15 +++++++++++++ .../data/repository/ExampleRepositoryImpl.kt | 20 +++++++++++++++++ .../example2/di/ApplicationComponent.kt | 11 ++++++++++ .../example2/di/DataModule.kt | 22 +++++++++++++++++++ .../example2/di/DomainModule.kt | 13 +++++++++++ .../example2/domain/ExampleUseCase.kt | 6 +++-- .../example2/presentation/ExampleViewModel.kt | 5 +++-- .../example2/presentation/MainActivity.kt | 12 ++++++++-- 23 files changed, 163 insertions(+), 77 deletions(-) delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleApiService.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleDatabase.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSource.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleLocalDataSourceImpl.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleMapper.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSource.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRemoteDataSourceImpl.kt delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/ExampleRepositoryImpl.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/database/ExampleDatabase.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSource.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleLocalDataSourceImpl.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSource.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/datasource/ExampleRemoteDataSourceImpl.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/mapper/ExampleMapper.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/network/ExampleApiService.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/data/repository/ExampleRepositoryImpl.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt index e737dd1..57e24fb 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt @@ -4,8 +4,8 @@ import dagger.Module import dagger.Provides -// Если у нас нет доступа к классу (например, библиотеку), то с помощью модуля мы можем создать -// экземпляр класса с помощью Модуля и его провайдера +// Если у нас нет доступа к классу (например, из библиотеки), то с помощью модуля мы можем создать +// экземпляр класса @Module class ComputerModule { 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..912dbab --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/database/ExampleDatabase.kt @@ -0,0 +1,15 @@ +package com.example.dependencyinjectionstart.example2.data.database + +import android.util.Log +import javax.inject.Inject + +class ExampleDatabase @Inject constructor() { + + fun method() { + Log.d(LOG_TAG, "ExampleDatabase") + } + + 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..7754bcb --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/data/network/ExampleApiService.kt @@ -0,0 +1,15 @@ +package com.example.dependencyinjectionstart.example2.data.network + +import android.util.Log +import javax.inject.Inject + +class ExampleApiService @Inject constructor() { + + fun method() { + Log.d(LOG_TAG, "ExampleApiService") + } + + 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..bfa60ca --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -0,0 +1,11 @@ +package com.example.dependencyinjectionstart.example2.di + +import android.app.Activity +import com.example.dependencyinjectionstart.example2.presentation.MainActivity +import dagger.Component + +@Component(modules = [DataModule::class, DomainModule::class]) +interface ApplicationComponent { + + fun inject(activity: MainActivity) +} \ No newline at end of file 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..e9a1ef3 --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt @@ -0,0 +1,22 @@ +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 { + + @Binds + fun bindLocalDataSource( + localDataSource: ExampleLocalDataSourceImpl + ): ExampleLocalDataSource + + @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..769e5a0 --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt @@ -0,0 +1,13 @@ +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 + +@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/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..8461d84 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,13 @@ package com.example.dependencyinjectionstart.example2.presentation import com.example.dependencyinjectionstart.example2.domain.ExampleUseCase +import javax.inject.Inject -class ExampleViewModel( +class ExampleViewModel @Inject constructor( private val useCase: ExampleUseCase ) { fun method() { - + useCase() } } 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 e81bcaf..f76e157 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 @@ -4,12 +4,20 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.dependencyinjectionstart.R import com.example.dependencyinjectionstart.example1.Activity +import com.example.dependencyinjectionstart.example2.di.DaggerApplicationComponent +import javax.inject.Inject class MainActivity : AppCompatActivity() { + + @Inject + lateinit var viewModel: ExampleViewModel + + private val component = DaggerApplicationComponent.create() + override fun onCreate(savedInstanceState: Bundle?) { + component.inject(this) super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val activity = Activity() - activity.computer.toString() + viewModel.method() } } \ No newline at end of file From 636778a1e2c235aa8c89ce2bc01aae810434eac2 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sun, 20 Feb 2022 15:19:58 +0300 Subject: [PATCH 06/13] use Component Builder --- .../example2/data/database/ExampleDatabase.kt | 8 ++++++-- .../example2/data/network/ExampleApiService.kt | 12 ++++++++++-- .../example2/di/ApplicationComponent.kt | 2 +- .../example2/di/ContextModule.kt | 15 +++++++++++++++ .../example2/di/DataModule.kt | 2 ++ .../example2/di/DomainModule.kt | 1 + .../example2/presentation/MainActivity.kt | 9 ++++++++- 7 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt 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 index 912dbab..acf67b5 100644 --- 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 @@ -1,12 +1,16 @@ 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() { +class ExampleDatabase @Inject constructor( + private val context: Context +) { fun method() { - Log.d(LOG_TAG, "ExampleDatabase") + Log.d(LOG_TAG, "ExampleDatabase ${context.getString(R.string.app_name)}") } companion object { 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 index 7754bcb..0ab95f8 100644 --- 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 @@ -1,12 +1,20 @@ package com.example.dependencyinjectionstart.example2.data.network +import android.app.Application +import android.content.Context import android.util.Log +import com.example.dependencyinjectionstart.R import javax.inject.Inject -class ExampleApiService @Inject constructor() { +class ExampleApiService @Inject constructor( + private val context: Context +) { fun method() { - Log.d(LOG_TAG, "ExampleApiService") + Log.d( + LOG_TAG, + "ExampleApiService ${context.getString(R.string.app_name)}" + ) } companion object { 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 index bfa60ca..477861f 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -4,7 +4,7 @@ import android.app.Activity import com.example.dependencyinjectionstart.example2.presentation.MainActivity import dagger.Component -@Component(modules = [DataModule::class, DomainModule::class]) +@Component(modules = [DataModule::class, DomainModule::class, ContextModule::class]) interface ApplicationComponent { fun inject(activity: MainActivity) diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt new file mode 100644 index 0000000..7063e72 --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt @@ -0,0 +1,15 @@ +package com.example.dependencyinjectionstart.example2.di + +import android.app.Application +import android.content.Context +import dagger.Module +import dagger.Provides + +@Module +class ContextModule(private val application: Application) { + + @Provides + fun provideContext(): Context { + return application + } +} \ No newline at end of file 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 index e9a1ef3..68151dc 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt @@ -1,11 +1,13 @@ package com.example.dependencyinjectionstart.example2.di +import android.content.Context 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 +import dagger.Provides @Module interface DataModule { 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 index 769e5a0..f764eff 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DomainModule.kt @@ -4,6 +4,7 @@ import com.example.dependencyinjectionstart.example2.data.repository.ExampleRepo import com.example.dependencyinjectionstart.example2.domain.ExampleRepository import dagger.Binds import dagger.Module +import dagger.Provides @Module interface DomainModule { 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 f76e157..07042b8 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 @@ -4,7 +4,10 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.dependencyinjectionstart.R import com.example.dependencyinjectionstart.example1.Activity +import com.example.dependencyinjectionstart.example1.DaggerMyComponent +import com.example.dependencyinjectionstart.example2.di.ContextModule import com.example.dependencyinjectionstart.example2.di.DaggerApplicationComponent +import com.example.dependencyinjectionstart.example2.di.DataModule import javax.inject.Inject class MainActivity : AppCompatActivity() { @@ -12,7 +15,11 @@ class MainActivity : AppCompatActivity() { @Inject lateinit var viewModel: ExampleViewModel - private val component = DaggerApplicationComponent.create() + private val component by lazy { + DaggerApplicationComponent.builder() + .contextModule(ContextModule( application)) + .build() + } override fun onCreate(savedInstanceState: Bundle?) { component.inject(this) From 0f6f1474d1b186223a8f03099b669b1ede40873e Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sun, 20 Feb 2022 21:55:40 +0300 Subject: [PATCH 07/13] use ApplicationComponentBuilder --- .../example2/data/database/ExampleDatabase.kt | 7 +++++-- .../example2/data/network/ExampleApiService.kt | 5 +++-- .../example2/di/ApplicationComponent.kt | 16 +++++++++++++++- .../example2/di/ContextModule.kt | 15 --------------- .../example2/presentation/MainActivity.kt | 7 ++----- 5 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt 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 index acf67b5..7601980 100644 --- 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 @@ -6,11 +6,14 @@ import com.example.dependencyinjectionstart.R import javax.inject.Inject class ExampleDatabase @Inject constructor( - private val context: Context + private val context: Context, + private val timeMillis: Long ) { fun method() { - Log.d(LOG_TAG, "ExampleDatabase ${context.getString(R.string.app_name)}") + Log.d( + LOG_TAG, + "ExampleDatabase ${context.getString(R.string.app_name)} $timeMillis") } companion object { 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 index 0ab95f8..5a135f4 100644 --- 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 @@ -7,13 +7,14 @@ import com.example.dependencyinjectionstart.R import javax.inject.Inject class ExampleApiService @Inject constructor( - private val context: Context + private val context: Context, + private val timeMillis: Long ) { fun method() { Log.d( LOG_TAG, - "ExampleApiService ${context.getString(R.string.app_name)}" + "ExampleApiService ${context.getString(R.string.app_name)} $timeMillis" ) } 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 index 477861f..b33b59a 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -1,11 +1,25 @@ package com.example.dependencyinjectionstart.example2.di import android.app.Activity +import android.content.Context import com.example.dependencyinjectionstart.example2.presentation.MainActivity +import dagger.BindsInstance import dagger.Component -@Component(modules = [DataModule::class, DomainModule::class, ContextModule::class]) +@Component(modules = [DataModule::class, DomainModule::class]) interface ApplicationComponent { fun inject(activity: MainActivity) + + @Component.Builder + interface ApplicationComponentBuilder { + + @BindsInstance + fun context(context: Context): ApplicationComponentBuilder + + @BindsInstance + fun time(timeMillis: Long): ApplicationComponentBuilder + + fun build(): ApplicationComponent + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt deleted file mode 100644 index 7063e72..0000000 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ContextModule.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.dependencyinjectionstart.example2.di - -import android.app.Application -import android.content.Context -import dagger.Module -import dagger.Provides - -@Module -class ContextModule(private val application: Application) { - - @Provides - fun provideContext(): Context { - return application - } -} \ No newline at end of file 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 07042b8..535edfa 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 @@ -3,11 +3,7 @@ package com.example.dependencyinjectionstart.example2.presentation import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.dependencyinjectionstart.R -import com.example.dependencyinjectionstart.example1.Activity -import com.example.dependencyinjectionstart.example1.DaggerMyComponent -import com.example.dependencyinjectionstart.example2.di.ContextModule import com.example.dependencyinjectionstart.example2.di.DaggerApplicationComponent -import com.example.dependencyinjectionstart.example2.di.DataModule import javax.inject.Inject class MainActivity : AppCompatActivity() { @@ -17,7 +13,8 @@ class MainActivity : AppCompatActivity() { private val component by lazy { DaggerApplicationComponent.builder() - .contextModule(ContextModule( application)) + .context(application) + .time(System.currentTimeMillis()) .build() } From a0aa0b7111b550798497239258755bd99847d076 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sun, 20 Feb 2022 21:56:47 +0300 Subject: [PATCH 08/13] use ApplicationComponentBuilder --- .../dependencyinjectionstart/example2/di/ApplicationComponent.kt | 1 - 1 file changed, 1 deletion(-) 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 index b33b59a..66fe8d7 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -1,6 +1,5 @@ package com.example.dependencyinjectionstart.example2.di -import android.app.Activity import android.content.Context import com.example.dependencyinjectionstart.example2.presentation.MainActivity import dagger.BindsInstance From d170b26253c765673171cc75e8a3810bdc4a750c Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sun, 20 Feb 2022 21:57:53 +0300 Subject: [PATCH 09/13] use ApplicationComponentBuilder --- .../example2/data/network/ExampleApiService.kt | 1 - 1 file changed, 1 deletion(-) 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 index 5a135f4..3116f89 100644 --- 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 @@ -1,6 +1,5 @@ package com.example.dependencyinjectionstart.example2.data.network -import android.app.Application import android.content.Context import android.util.Log import com.example.dependencyinjectionstart.R From 28e360a530c277589c481fe45ec896d3249419be Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Sun, 20 Feb 2022 23:45:23 +0300 Subject: [PATCH 10/13] use Component.Factory and Singleton --- app/src/main/AndroidManifest.xml | 1 + .../example2/ExampleApp.kt | 11 +++++++ .../example2/data/database/ExampleDatabase.kt | 4 ++- .../data/network/ExampleApiService.kt | 4 ++- .../example2/di/ApplicationComponent.kt | 30 ++++++++++++++----- .../example2/presentation/MainActivity.kt | 8 ++--- 6 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/ExampleApp.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 41253ba..d5d4f63 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ Date: Fri, 4 Mar 2022 12:12:02 +0300 Subject: [PATCH 11/13] create custom annotation scope --- .../example2/data/database/ExampleDatabase.kt | 2 -- .../example2/data/network/ExampleApiService.kt | 2 -- .../example2/di/ApplicationComponent.kt | 2 +- .../example2/di/ApplicationScope.kt | 7 +++++++ .../dependencyinjectionstart/example2/di/DataModule.kt | 5 +++-- 5 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationScope.kt 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 index 19fa09e..9811abc 100644 --- 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 @@ -4,9 +4,7 @@ import android.content.Context import android.util.Log import com.example.dependencyinjectionstart.R import javax.inject.Inject -import javax.inject.Singleton -@Singleton class ExampleDatabase @Inject constructor( private val context: Context, private val timeMillis: Long 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 index 99c8785..f89efc6 100644 --- 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 @@ -4,9 +4,7 @@ import android.content.Context import android.util.Log import com.example.dependencyinjectionstart.R import javax.inject.Inject -import javax.inject.Singleton -@Singleton class ExampleApiService @Inject constructor( private val context: Context, private val timeMillis: Long 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 index 1f631a5..0effb64 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -9,7 +9,7 @@ import dagger.BindsInstance import dagger.Component import javax.inject.Singleton -@Singleton +@ApplicationScope @Component(modules = [DataModule::class, DomainModule::class]) interface ApplicationComponent { 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 index 68151dc..6927877 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/DataModule.kt @@ -1,22 +1,23 @@ package com.example.dependencyinjectionstart.example2.di -import android.content.Context 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 -import dagger.Provides + @Module interface DataModule { + @ApplicationScope @Binds fun bindLocalDataSource( localDataSource: ExampleLocalDataSourceImpl ): ExampleLocalDataSource + @ApplicationScope @Binds fun bindExampleRemoteDataSource ( remoteDataSource: ExampleRemoteDataSourceImpl From 26423bba0c444fed3ab242df1383a5ea6ef20379 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Fri, 4 Mar 2022 12:57:13 +0300 Subject: [PATCH 12/13] Inject ViewModel --- .../example2/di/ApplicationComponent.kt | 2 +- .../example2/di/ViewModelModule.kt | 23 +++++++++++++++++++ .../example2/presentation/ExampleViewModel.kt | 5 +++- .../presentation/ExampleViewModel2.kt | 17 ++++++++++++++ .../example2/presentation/MainActivity.kt | 13 +++++++++-- .../example2/presentation/ViewModelFactory.kt | 13 +++++++++++ 6 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/di/ViewModelModule.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel2.kt create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt 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 index 0effb64..1822021 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -10,7 +10,7 @@ import dagger.Component import javax.inject.Singleton @ApplicationScope -@Component(modules = [DataModule::class, DomainModule::class]) +@Component(modules = [DataModule::class, DomainModule::class, ViewModelModule::class]) interface ApplicationComponent { fun inject(activity: MainActivity) 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/presentation/ExampleViewModel.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ExampleViewModel.kt index 8461d84..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,13 +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 @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 501dff1..152d04b 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 @@ -2,6 +2,7 @@ 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 @@ -9,7 +10,15 @@ import javax.inject.Inject class MainActivity : AppCompatActivity() { @Inject - lateinit var viewModel: ExampleViewModel + 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 @@ -20,6 +29,6 @@ class MainActivity : AppCompatActivity() { 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..12d57a3 --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt @@ -0,0 +1,13 @@ +package com.example.dependencyinjectionstart.example2.presentation + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import javax.inject.Inject + +class ViewModelFactory @Inject constructor( + private val viewModels: @JvmSuppressWildcards Map +): ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return viewModels[modelClass.simpleName] as T + } +} \ No newline at end of file From 918feea9efebbbd6a64b3d84cc7c1ad5759aba89 Mon Sep 17 00:00:00 2001 From: Cavc13 <13liver@mail.ru> Date: Fri, 4 Mar 2022 13:24:38 +0300 Subject: [PATCH 13/13] Used inject.Provider --- app/src/main/AndroidManifest.xml | 1 + .../example2/di/ApplicationComponent.kt | 3 ++ .../example2/presentation/MainActivity.kt | 7 ++++ .../example2/presentation/MainActivity2.kt | 34 +++++++++++++++++++ .../example2/presentation/ViewModelFactory.kt | 7 ++-- app/src/main/res/layout/activity_main.xml | 1 + 6 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity2.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5d4f63..49ab16f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ + \ No newline at end of file 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 index 1822021..5474a5b 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/di/ApplicationComponent.kt @@ -5,6 +5,7 @@ import com.example.dependencyinjectionstart.example2.data.database.ExampleDataba 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 @@ -15,6 +16,8 @@ interface ApplicationComponent { fun inject(activity: MainActivity) + fun inject(activity: MainActivity2) + // @Component.Builder // interface ApplicationComponentBuilder { // 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 152d04b..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,7 +1,9 @@ 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 @@ -30,5 +32,10 @@ class MainActivity : AppCompatActivity() { 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 index 12d57a3..c11a347 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/ViewModelFactory.kt @@ -2,12 +2,15 @@ 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 viewModels: @JvmSuppressWildcards Map + private val viewModelProviders: @JvmSuppressWildcards Map> ): ViewModelProvider.Factory { override fun create(modelClass: Class): T { - return viewModels[modelClass.simpleName] as 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">