From 824beb34454912a4ed415bb697d18fdd3ca957a0 Mon Sep 17 00:00:00 2001 From: Artem Nagorny Date: Tue, 28 May 2024 10:38:14 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=94=D0=97=20=D0=BF=D0=BE=20Dagger=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 4 +- .../main/java/ru/otus/daggerhomework/App.kt | 17 +++++- .../daggerhomework/ApplicationComponent.kt | 23 ++++++++ .../ru/otus/daggerhomework/ColorGenerator.kt | 4 +- .../ru/otus/daggerhomework/ColorObservable.kt | 29 +++++++++++ .../ru/otus/daggerhomework/FeatureScope.kt | 6 +++ .../otus/daggerhomework/FragmentProducer.kt | 19 ++++++- .../otus/daggerhomework/FragmentReceiver.kt | 23 +++++++- .../ru/otus/daggerhomework/MainActivity.kt | 23 ++++++++ .../daggerhomework/MainActivityComponent.kt | 52 +++++++++++++++++++ .../otus/daggerhomework/ProducerComponent.kt | 33 ++++++++++++ .../otus/daggerhomework/ReceiverComponent.kt | 30 +++++++++++ .../otus/daggerhomework/ViewModelProducer.kt | 31 +++++++++-- .../otus/daggerhomework/ViewModelReceiver.kt | 49 +++++++++++++++-- app/src/main/res/layout/activity_main.xml | 28 ++++++---- 16 files changed, 348 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/ColorObservable.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FeatureScope.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ProducerComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ReceiverComponent.kt diff --git a/app/build.gradle b/app/build.gradle index 705d0941..e1e81ed7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,12 @@ plugins { } android { - compileSdkVersion 31 + compileSdkVersion 34 defaultConfig { applicationId "ru.otus.daggerhomework" minSdkVersion 23 - targetSdkVersion 31 + targetSdkVersion 34 versionCode 1 versionName "1.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..89276e20 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,13 +4,15 @@ package="ru.otus.daggerhomework"> - + diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..731a4d0d 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -2,5 +2,20 @@ package ru.otus.daggerhomework import android.app.Application -class App :Application() { +class App : Application() { + override fun onCreate() { + super.onCreate() + initializeDI() + } + + fun getApplicationComponent(): ApplicationComponent = appComponent + + private fun initializeDI() { + appComponent = DaggerApplicationComponent.factory() + .create(this) + } + + companion object { + private lateinit var appComponent: ApplicationComponent + } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt index fc47f256..47e78804 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,27 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import javax.inject.Qualifier +import javax.inject.Singleton + +@Qualifier +annotation class ContextApplication + +@Singleton +@Component( + modules = [], +) interface ApplicationComponent { + + @Component.Factory + interface Factory { + fun create( + @BindsInstance @ContextApplication context: Context, + ): ApplicationComponent + } + + @ContextApplication + fun provideApplicationContext(): Context } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..9e2ff35a 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -2,8 +2,8 @@ package ru.otus.daggerhomework import android.graphics.Color import androidx.annotation.ColorInt -import androidx.annotation.ColorRes import java.util.* +import javax.inject.Inject interface ColorGenerator { @@ -11,7 +11,7 @@ interface ColorGenerator { fun generateColor(): Int } -class ColorGeneratorImpl : ColorGenerator { +class ColorGeneratorImpl @Inject constructor() : ColorGenerator { override fun generateColor(): Int { val rnd = Random() diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorObservable.kt b/app/src/main/java/ru/otus/daggerhomework/ColorObservable.kt new file mode 100644 index 00000000..6da8eaf1 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ColorObservable.kt @@ -0,0 +1,29 @@ +package ru.otus.daggerhomework + +interface IObserver { + fun notify(data: T) +} + +interface IColorObservable { + fun add(observer: IObserver) + + fun remove(observer: IObserver) + + fun notify(data: Int) +} + +class ColorObservableImpl: IColorObservable { + private val observers = mutableListOf>() + + override fun add(observer: IObserver) { + observers.add(observer) + } + + override fun remove(observer: IObserver) { + observers.remove(observer) + } + + override fun notify(data: Int) { + observers.forEach { it.notify(data) } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/FeatureScope.kt b/app/src/main/java/ru/otus/daggerhomework/FeatureScope.kt new file mode 100644 index 00000000..18985287 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FeatureScope.kt @@ -0,0 +1,6 @@ +package ru.otus.daggerhomework + +import javax.inject.Scope + +@Scope +annotation class FeatureScope \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt index 00dd10dc..0125494a 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -6,21 +6,38 @@ import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import javax.inject.Inject class FragmentProducer : Fragment() { + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var viewModelProducer: ViewModelProducer override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_a, container, true) + ProducerComponent + .getProducerComponent( + (requireActivity() as MainActivity).getMainActivityComponent(), + ) + .inject(this) + + return inflater.inflate(R.layout.fragment_a, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + viewModelProducer = ViewModelProvider(this, viewModelFactory) + .get(ViewModelProducer::class.java) + view.findViewById