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">