From cf795eb6a575a4e9ef1c1caa11c0c88af0b63342 Mon Sep 17 00:00:00 2001 From: Boris Kazakov Date: Fri, 2 Feb 2024 15:59:54 +0600 Subject: [PATCH 1/2] Dagger2Homework --- README.md | 10 +++++-- app/build.gradle | 4 +++ app/src/main/AndroidManifest.xml | 6 ++-- .../main/java/ru/otus/daggerhomework/App.kt | 4 +++ .../daggerhomework/ApplicationComponent.kt | 19 +++++++++++++ .../ru/otus/daggerhomework/ColorGenerator.kt | 5 ++-- .../otus/daggerhomework/FragmentProducer.kt | 15 +++++++++- .../FragmentProducerComponent.kt | 18 ++++++++++++ .../otus/daggerhomework/FragmentReceiver.kt | 17 +++++++++++ .../FragmentReceiverComponent.kt | 18 ++++++++++++ .../ru/otus/daggerhomework/MainActivity.kt | 14 ++++++++++ .../ru/otus/daggerhomework/MyViewModel.kt | 28 +++++++++++++++++++ .../ru/otus/daggerhomework/ViewModelModule.kt | 16 +++++++++++ .../otus/daggerhomework/ViewModelProducer.kt | 9 ++++-- .../otus/daggerhomework/ViewModelReceiver.kt | 17 +++++++++-- build.gradle | 2 +- gradle.properties | 5 +++- gradle/wrapper/gradle-wrapper.properties | 2 +- 18 files changed, 192 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/MyViewModel.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ViewModelModule.kt diff --git a/README.md b/README.md index 4d77164a..1a8ba145 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,13 @@ ### Реализуйте MainActivityComponent Инициализируется в MainActivity. Прокидывает следующие сущности: - Context(Activity). Проброс в граф реализуйте через BindsInstance + ComponentFactory -- Ваша реализация обсервера(Coroutine Channel/StateFlow/Subject либо другую реализацию обсервера). Он понадобится нам чтобы отправлять евенты из одного фрагмента и принимать их в другом, в обоих фрагментах должен быть один и тот же инстанс обсервера. +- Ваша реализация обсервера(Coroutine Channel/StateFlow/Subject либо другую реализацию обсервера). +- Он понадобится нам чтобы отправлять евенты из одного фрагмента и принимать их в другом, в обоих фрагментах должен быть один и тот же инстанс обсервера. ### Реализуйте FragmentReceiverComponent/FragmentProducerComponent -Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую реализацию обсервера которая уже есть в графе. ViewModelProducer должна отправлять эвенты, ViewModelReceiver должна получать эвенты. Обсерверы должны прокидываться в конструкторы вьюмоделей и существовать в единственном экземпляре в Activity. +Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую реализацию обсервера которая уже есть в графе. +ViewModelProducer должна отправлять эвенты, ViewModelReceiver должна получать эвенты. +Обсерверы должны прокидываться в конструкторы вьюмоделей и существовать в единственном экземпляре в Activity. Флоу отправки эвента выглядит следующим образом: -Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер -> евент ловится на стороне ViewModelReceiver -> евент передается FragmentReceiver и вызывается функция ru.otus.daggerhomework.FragmentReceiver#populateColor +Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер -> евент ловится на стороне ViewModelReceiver -> евент передается +FragmentReceiver и вызывается функция ru.otus.daggerhomework.FragmentReceiver#populateColor diff --git a/app/build.gradle b/app/build.gradle index 705d0941..40a464b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ android { kotlinOptions { jvmTarget = '1.8' } + namespace 'ru.otus.daggerhomework' } dependencies { @@ -40,4 +41,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'com.google.dagger:dagger:2.42' kapt 'com.google.dagger:dagger-compiler:2.42' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..83f6c1dc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,16 +1,16 @@ + xmlns:android="http://schemas.android.com/apk/res/android"> - + diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..b9731e32 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -3,4 +3,8 @@ package ru.otus.daggerhomework import android.app.Application class App :Application() { + + val component by lazy { + DaggerApplicationComponent.factory().create(applicationContext) + } } \ 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..ababc7ac 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,23 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import dagger.Module + +@Component(modules = [ViewModelModule::class]) interface ApplicationComponent { + + fun inject(activity: MainActivity) + + fun provideMyViewModel(): MyViewModel + fun provideColorGenerator(): ColorGenerator + fun provideContext(): Context + @Component.Factory + interface AppComponentFactory { + + fun create( + @BindsInstance context: Context + ): ApplicationComponent + } } \ 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..f66f85c4 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -4,14 +4,15 @@ import android.graphics.Color import androidx.annotation.ColorInt import androidx.annotation.ColorRes import java.util.* +import javax.inject.Inject -interface ColorGenerator { +interface ColorGenerator{ @ColorInt 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/FragmentProducer.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt index 00dd10dc..dcf7d6c9 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -1,14 +1,27 @@ package ru.otus.daggerhomework +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.fragment.app.Fragment +import javax.inject.Inject class FragmentProducer : Fragment() { + private val subcomponent by lazy { + FragmentProducerComponent.getFragmentProducerComponent((requireContext() as App).component) + } + + @Inject + lateinit var viewModelProducer: ViewModelProducer + + override fun onAttach(context: Context) { + super.onAttach(context) + subcomponent.inject(this) + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -20,7 +33,7 @@ class FragmentProducer : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.findViewById