From 02761f140d4bee1aec97b1bc8e53beb40db3fc0d Mon Sep 17 00:00:00 2001 From: avereshchaga Date: Wed, 12 Feb 2025 19:42:43 +0300 Subject: [PATCH 1/5] =?UTF-8?q?*=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D1=83=D0=B9=D1=82=D0=B5=20ApplicationComponent=20=D0=AD=D1=82?= =?UTF-8?q?=D0=BE=20=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D1=8C=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=88=D0=B5=D0=B3=D0=BE=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=BE?= =?UTF-8?q?=D0=B2.=20=D0=98=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B5=20App,=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=D0=B4=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D0=B2?= =?UTF-8?q?=20=D0=B3=D1=80=D0=B0=D1=84=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?Component=20Dependencies/Subcomponents=20=D0=BD=D0=B8=D0=B6?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=20=D0=B3=D1=80=D0=B0=D1=84=D1=83=20=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=D0=B4=D1=83=D1=8E=D1=89=D0=B8=D0=B5=20=D1=81=D1=83?= =?UTF-8?q?=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8:=20Context(Application)=20?= =?UTF-8?q?=D0=B4=D0=BE=20ProducerFragmentComponent=20=D0=B8=20ReceiverFra?= =?UTF-8?q?gmentComponent.=20=D0=9F=D1=80=D0=BE=D0=B1=D1=80=D0=BE=D1=81=20?= =?UTF-8?q?Context=20=D0=B2=20=D0=B3=D1=80=D0=B0=D1=84=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D1=83=D0=B9=D1=82=D0=B5=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20BindsInstance=20+=20ComponentFactory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 9 ++++----- app/src/main/java/ru/otus/daggerhomework/App.kt | 2 ++ .../ru/otus/daggerhomework/ApplicationComponent.kt | 12 ++++++++++++ .../java/ru/otus/daggerhomework/FragmentScope.kt | 7 +++++++ .../otus/daggerhomework/ProducerFragmentComponent.kt | 8 ++++++++ .../otus/daggerhomework/ReceiverFragmentComponent.kt | 8 ++++++++ 6 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..8f424cee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - - + - - \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..c4cbc494 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -3,4 +3,6 @@ package ru.otus.daggerhomework import android.app.Application class App :Application() { + + val component = DaggerApplicationComponent.factory().build(this) } \ 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..47839712 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,16 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import javax.inject.Singleton + +@Singleton +@Component interface ApplicationComponent { + + @Component.Factory + interface Factory { + fun build(@BindsInstance context: Context): ApplicationComponent + } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt new file mode 100644 index 00000000..709e6184 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework + +import javax.inject.Scope + +@Scope +@Retention(value = AnnotationRetention.RUNTIME) +annotation class FragmentScope() diff --git a/app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt new file mode 100644 index 00000000..fae5f24f --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt @@ -0,0 +1,8 @@ +package ru.otus.daggerhomework + +import dagger.Component + +@Component(dependencies = [ApplicationComponent::class]) +@FragmentScope +interface ProducerFragmentComponent { +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt new file mode 100644 index 00000000..055ad981 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt @@ -0,0 +1,8 @@ +package ru.otus.daggerhomework + +import dagger.Component + +@Component(dependencies = [ApplicationComponent::class]) +@FragmentScope +interface ReceiverFragmentComponent { +} \ No newline at end of file From 9131d552301a7ba0d206ff7b3b1ca8ce057dff29 Mon Sep 17 00:00:00 2001 From: avereshchaga Date: Fri, 14 Feb 2025 17:51:40 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D1=83?= =?UTF-8?q?=D0=B9=D1=82=D0=B5=20ReceiverFragmentComponent/ProducerFragment?= =?UTF-8?q?Component=20=D0=9A=D0=BE=D0=BC=D0=BC=D1=83=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20Pro?= =?UTF-8?q?ducer=20=D0=B8=20Receiver=20=D0=BE=D1=81=D1=83=D1=89=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B8=D1=82=D0=B5=20=D1=87=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB/StateFlow/Subject=20?= =?UTF-8?q?=D0=BB=D0=B8=D0=B1=D0=BE=20=D0=B4=D1=80=D1=83=D0=B3=D1=83=D1=8E?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=20=D0=B5=D1=81=D1=82=D1=8C=20=D0=B2=20=D0=B3=D1=80=D0=B0=D1=84?= =?UTF-8?q?=D0=B5.=20ProducerViewModel=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D1=8F=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=B2=D0=B5=D0=BD=D1=82=D1=8B,=20ReceiverViewMo?= =?UTF-8?q?del=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B0=D1=82=D1=8C=20=D1=8D=D0=B2=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D1=8B.=20=D0=9E=D0=B1=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D1=8B=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=D0=B4=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=D1=81?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D1=8B=20=D0=B2=D1=8C=D1=8E=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D1=81=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2?= =?UTF-8?q?=20=D0=B5=D0=B4=D0=B8=D0=BD=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=20=D1=8D=D0=BA=D0=B7=D0=B5=D0=BC=D0=BF=D0=BB=D1=8F?= =?UTF-8?q?=D1=80=D0=B5=20=D0=B2=20Activity.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../main/java/ru/otus/daggerhomework/App.kt | 8 ++++- .../main/java/ru/otus/daggerhomework/Event.kt | 9 ++++++ .../ru/otus/daggerhomework/MainActivity.kt | 16 ++++++++-- .../otus/daggerhomework/ProducerFragment.kt | 16 ++++++++-- .../ProducerFragmentComponent.kt | 8 ----- .../otus/daggerhomework/ProducerViewModel.kt | 7 +++-- .../otus/daggerhomework/ReceiverFragment.kt | 29 +++++++++++++++-- .../ReceiverFragmentComponent.kt | 8 ----- .../otus/daggerhomework/ReceiverViewModel.kt | 7 ++++- .../otus/daggerhomework/di/ActivityScope.kt | 7 +++++ .../{ => di}/ApplicationComponent.kt | 2 +- .../daggerhomework/{ => di}/FragmentScope.kt | 2 +- .../di/MainActivityComponent.kt | 20 ++++++++++++ .../daggerhomework/di/MainActivityModule.kt | 13 ++++++++ .../di/ProducerFragmentComponent.kt | 25 +++++++++++++++ .../otus/daggerhomework/di/ProducerModule.kt | 29 +++++++++++++++++ .../di/ReceiverFragmentComponent.kt | 24 ++++++++++++++ .../otus/daggerhomework/di/ReceiverModule.kt | 19 ++++++++++++ app/src/main/res/layout/activity_main.xml | 31 +++++++++++++------ gradle/libs.versions.toml | 2 +- 21 files changed, 244 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/Event.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ActivityScope.kt rename app/src/main/java/ru/otus/daggerhomework/{ => di}/ApplicationComponent.kt (89%) rename app/src/main/java/ru/otus/daggerhomework/{ => di}/FragmentScope.kt (77%) create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/MainActivityModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index eae16063..89276e20 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ package="ru.otus.daggerhomework"> (R.id.button).setOnClickListener { - //отправить результат через flow в другой фрагмент + viewModel.generateColor() } } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt deleted file mode 100644 index fae5f24f..00000000 --- a/app/src/main/java/ru/otus/daggerhomework/ProducerFragmentComponent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package ru.otus.daggerhomework - -import dagger.Component - -@Component(dependencies = [ApplicationComponent::class]) -@FragmentScope -interface ProducerFragmentComponent { -} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt b/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt index 5bdf0271..29f95524 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt @@ -3,14 +3,17 @@ package ru.otus.daggerhomework import android.app.Activity import android.content.Context import android.widget.Toast +import kotlinx.coroutines.flow.MutableStateFlow -class ProducerViewModel( +class ProducerViewModel ( private val colorGenerator: ColorGenerator, - private val context: Context + private val context: Context, + private val event: MutableStateFlow ) { fun generateColor() { if (context !is Activity) throw RuntimeException("Activity context is required") Toast.makeText(context, "Color sent", Toast.LENGTH_LONG).show() + event.value = Event.PopulateColor(color = colorGenerator.generateColor()) } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt index 9ba5f764..4f556a07 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt @@ -6,25 +6,50 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.ColorInt import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.launch +import ru.otus.daggerhomework.di.DaggerReceiverFragmentComponent class ReceiverFragment : Fragment() { private lateinit var frame: View + private lateinit var viewModel: ReceiverViewModel + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_receiver, container, true) + val component = DaggerReceiverFragmentComponent + .factory() + .build( + requireActivity().component, + requireActivity().application + ) + viewModel = component.viewModel() + + return inflater.inflate(R.layout.fragment_receiver, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) frame = view.findViewById(R.id.frame) + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.event.collect { event -> + viewModel.observeColors() + when (event) { + is Event.PopulateColor -> populateColor(event.color) + } + } + } + } } - fun populateColor(@ColorInt color: Int) { + private fun populateColor(@ColorInt color: Int) { frame.setBackgroundColor(color) } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt deleted file mode 100644 index 055ad981..00000000 --- a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragmentComponent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package ru.otus.daggerhomework - -import dagger.Component - -@Component(dependencies = [ApplicationComponent::class]) -@FragmentScope -interface ReceiverFragmentComponent { -} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ReceiverViewModel.kt b/app/src/main/java/ru/otus/daggerhomework/ReceiverViewModel.kt index 250875a6..6367f112 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ReceiverViewModel.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ReceiverViewModel.kt @@ -3,11 +3,16 @@ package ru.otus.daggerhomework import android.app.Application import android.content.Context import android.widget.Toast +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.mapNotNull class ReceiverViewModel( - private val context: Context + private val context: Context, + event: MutableStateFlow ) { + val event = event.mapNotNull { it } + fun observeColors() { if (context !is Application) throw RuntimeException("Application context is required") Toast.makeText(context, "Color received", Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ActivityScope.kt b/app/src/main/java/ru/otus/daggerhomework/di/ActivityScope.kt new file mode 100644 index 00000000..125bc656 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ActivityScope.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework.di + +import javax.inject.Scope + +@Scope +@Retention(value = AnnotationRetention.RUNTIME) +annotation class ActivityScope() diff --git a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt similarity index 89% rename from app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt rename to app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt index 47839712..0db6200a 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt @@ -1,4 +1,4 @@ -package ru.otus.daggerhomework +package ru.otus.daggerhomework.di import android.content.Context import dagger.BindsInstance diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt b/app/src/main/java/ru/otus/daggerhomework/di/FragmentScope.kt similarity index 77% rename from app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt rename to app/src/main/java/ru/otus/daggerhomework/di/FragmentScope.kt index 709e6184..78dc432b 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/FragmentScope.kt @@ -1,4 +1,4 @@ -package ru.otus.daggerhomework +package ru.otus.daggerhomework.di import javax.inject.Scope diff --git a/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt new file mode 100644 index 00000000..6832e3f2 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt @@ -0,0 +1,20 @@ +package ru.otus.daggerhomework.di + +import android.app.Activity +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import kotlinx.coroutines.flow.MutableStateFlow +import ru.otus.daggerhomework.Event +import javax.inject.Named + +@ActivityScope +@Component(modules = [MainActivityModule::class]) +interface MainActivityComponent { + @Component.Factory + interface Factory { + fun build(@BindsInstance activity: Activity): MainActivityComponent + } + + fun event(): MutableStateFlow +} diff --git a/app/src/main/java/ru/otus/daggerhomework/di/MainActivityModule.kt b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityModule.kt new file mode 100644 index 00000000..51f62371 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityModule.kt @@ -0,0 +1,13 @@ +package ru.otus.daggerhomework.di + +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.flow.MutableStateFlow +import ru.otus.daggerhomework.Event + +@Module +class MainActivityModule { + @Provides + @ActivityScope + fun events(): MutableStateFlow = MutableStateFlow(null) +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt new file mode 100644 index 00000000..b2143269 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt @@ -0,0 +1,25 @@ +package ru.otus.daggerhomework.di + +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import ru.otus.daggerhomework.ProducerViewModel + +@Component( + dependencies = [MainActivityComponent::class], + modules = [ProducerModule::class] +) +@FragmentScope +interface ProducerFragmentComponent { + + @Component.Factory + interface Factory { + fun build( + mainActivityComponent: MainActivityComponent, + @BindsInstance context: Context + ): ProducerFragmentComponent + } + + fun viewModel(): ProducerViewModel + +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt b/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt new file mode 100644 index 00000000..3351b85a --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt @@ -0,0 +1,29 @@ +package ru.otus.daggerhomework.di + +import android.app.Activity +import android.content.Context +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.flow.MutableStateFlow +import ru.otus.daggerhomework.ColorGenerator +import ru.otus.daggerhomework.ColorGeneratorImpl +import ru.otus.daggerhomework.Event +import ru.otus.daggerhomework.ProducerViewModel +import javax.inject.Named + + +@Module +class ProducerModule { + + @Provides + @FragmentScope + fun colorGenerator(): ColorGenerator = ColorGeneratorImpl() + + @Provides + @FragmentScope + fun viewModel( + colorGenerator: ColorGenerator, + context: Context, + event: MutableStateFlow + ): ProducerViewModel = ProducerViewModel(colorGenerator, context, event) +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt new file mode 100644 index 00000000..15d44ff6 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt @@ -0,0 +1,24 @@ +package ru.otus.daggerhomework.di + +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import ru.otus.daggerhomework.ReceiverViewModel + +@Component( + dependencies = [MainActivityComponent::class], + modules = [ReceiverModule::class] +) +@FragmentScope +interface ReceiverFragmentComponent { + + @Component.Factory + interface Factory { + fun build( + mainActivityComponent: MainActivityComponent, + @BindsInstance context: Context + ): ReceiverFragmentComponent + } + + fun viewModel(): ReceiverViewModel +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt new file mode 100644 index 00000000..fd7f755b --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt @@ -0,0 +1,19 @@ +package ru.otus.daggerhomework.di + +import android.content.Context +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.flow.MutableStateFlow +import ru.otus.daggerhomework.Event +import ru.otus.daggerhomework.ReceiverViewModel + +@Module +class ReceiverModule { + + @Provides + @FragmentScope + fun viewModel( + context: Context, + event: MutableStateFlow + ): ReceiverViewModel = ReceiverViewModel(context, event) +} \ 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 79ae6993..602e0867 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,32 @@ - - + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHeight_percent="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/fragment_producer" /> \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ab592426..32593ef3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.8.0" +agp = "8.5.1" kotlin = "2.0.20" coreKtx = "1.15.0" lifecycleRuntimeKtx = "2.8.7" From 31e64d82d1d260aad32190790197bc52a65ec602 Mon Sep 17 00:00:00 2001 From: avereshchaga Date: Fri, 14 Feb 2025 17:52:49 +0300 Subject: [PATCH 3/5] * minor fix --- app/src/main/java/ru/otus/daggerhomework/MainActivity.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/ru/otus/daggerhomework/MainActivity.kt b/app/src/main/java/ru/otus/daggerhomework/MainActivity.kt index 4ea344b5..b245d445 100644 --- a/app/src/main/java/ru/otus/daggerhomework/MainActivity.kt +++ b/app/src/main/java/ru/otus/daggerhomework/MainActivity.kt @@ -11,8 +11,6 @@ class MainActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - application component = DaggerMainActivityComponent.factory().build(this) setContentView(R.layout.activity_main) } From 2fb4ac5f9d28b8a45cbe9ba0552eb64b48e35af3 Mon Sep 17 00:00:00 2001 From: avereshchaga Date: Thu, 13 Mar 2025 16:18:25 +0300 Subject: [PATCH 4/5] =?UTF-8?q?*=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=B2=D0=B0=D0=BB=D0=B8=D1=84=D0=B0?= =?UTF-8?q?=D0=B5=D1=80=D1=8B=20*=20=D0=9E=D1=82=D1=80=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/ru/otus/daggerhomework/ProducerFragment.kt | 2 +- .../main/java/ru/otus/daggerhomework/ReceiverFragment.kt | 5 ++--- .../java/ru/otus/daggerhomework/di/ActivityContext.kt | 7 +++++++ .../ru/otus/daggerhomework/di/ApplicationComponent.kt | 5 ++++- .../java/ru/otus/daggerhomework/di/ApplicationContext.kt | 7 +++++++ .../ru/otus/daggerhomework/di/MainActivityComponent.kt | 5 ++++- .../otus/daggerhomework/di/ProducerFragmentComponent.kt | 3 +-- .../main/java/ru/otus/daggerhomework/di/ProducerModule.kt | 1 + .../otus/daggerhomework/di/ReceiverFragmentComponent.kt | 8 +++----- .../main/java/ru/otus/daggerhomework/di/ReceiverModule.kt | 1 + 10 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ActivityContext.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ApplicationContext.kt diff --git a/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt b/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt index 8632dac3..0cd4229e 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt @@ -23,7 +23,7 @@ class ProducerFragment : Fragment() { val component = DaggerProducerFragmentComponent .factory() - .build(requireActivity().component, requireActivity()) + .build(requireActivity().component) viewModel = component.viewModel() return inflater.inflate(R.layout.fragment_producer, container, false) diff --git a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt index 4f556a07..0377f889 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt @@ -26,9 +26,8 @@ class ReceiverFragment : Fragment() { val component = DaggerReceiverFragmentComponent .factory() .build( - requireActivity().component, - requireActivity().application - ) + requireActivity().application.component, + requireActivity().component) viewModel = component.viewModel() return inflater.inflate(R.layout.fragment_receiver, container, false) diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ActivityContext.kt b/app/src/main/java/ru/otus/daggerhomework/di/ActivityContext.kt new file mode 100644 index 00000000..fd8c9e5d --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ActivityContext.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework.di + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class ActivityContext() diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt index 0db6200a..2174b122 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt @@ -11,6 +11,9 @@ interface ApplicationComponent { @Component.Factory interface Factory { - fun build(@BindsInstance context: Context): ApplicationComponent + fun build(@BindsInstance @ApplicationContext context: Context): ApplicationComponent } + + @ApplicationContext + fun getContext(): Context } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ApplicationContext.kt b/app/src/main/java/ru/otus/daggerhomework/di/ApplicationContext.kt new file mode 100644 index 00000000..bb24880f --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/di/ApplicationContext.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework.di + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class ApplicationContext() diff --git a/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt index 6832e3f2..a8618978 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt @@ -13,8 +13,11 @@ import javax.inject.Named interface MainActivityComponent { @Component.Factory interface Factory { - fun build(@BindsInstance activity: Activity): MainActivityComponent + fun build(@BindsInstance @ActivityContext context: Context): MainActivityComponent } fun event(): MutableStateFlow + + @ActivityContext + fun getContext(): Context } diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt index b2143269..51b6e079 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt @@ -15,8 +15,7 @@ interface ProducerFragmentComponent { @Component.Factory interface Factory { fun build( - mainActivityComponent: MainActivityComponent, - @BindsInstance context: Context + mainActivityComponent: MainActivityComponent ): ProducerFragmentComponent } diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt b/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt index 3351b85a..5b763fc2 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt @@ -23,6 +23,7 @@ class ProducerModule { @FragmentScope fun viewModel( colorGenerator: ColorGenerator, + @ActivityContext context: Context, event: MutableStateFlow ): ProducerViewModel = ProducerViewModel(colorGenerator, context, event) diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt index 15d44ff6..44d01745 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt @@ -1,12 +1,10 @@ package ru.otus.daggerhomework.di -import android.content.Context -import dagger.BindsInstance import dagger.Component import ru.otus.daggerhomework.ReceiverViewModel @Component( - dependencies = [MainActivityComponent::class], + dependencies = [MainActivityComponent::class, ApplicationComponent::class], modules = [ReceiverModule::class] ) @FragmentScope @@ -15,8 +13,8 @@ interface ReceiverFragmentComponent { @Component.Factory interface Factory { fun build( - mainActivityComponent: MainActivityComponent, - @BindsInstance context: Context + applicationComponent:ApplicationComponent, + mainActivityComponent: MainActivityComponent ): ReceiverFragmentComponent } diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt index fd7f755b..ed22a1c2 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt @@ -13,6 +13,7 @@ class ReceiverModule { @Provides @FragmentScope fun viewModel( + @ApplicationContext context: Context, event: MutableStateFlow ): ReceiverViewModel = ReceiverViewModel(context, event) From 9b1587ca8e8fe428ad63d0312904542f26e35f2e Mon Sep 17 00:00:00 2001 From: avereshchaga Date: Thu, 13 Mar 2025 16:24:51 +0300 Subject: [PATCH 5/5] * import optimised --- app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt | 3 +-- app/src/main/java/ru/otus/daggerhomework/Event.kt | 2 -- app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt | 2 -- app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt | 2 +- app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt | 3 ++- .../java/ru/otus/daggerhomework/di/MainActivityComponent.kt | 2 -- .../ru/otus/daggerhomework/di/ProducerFragmentComponent.kt | 2 -- app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt | 2 -- .../ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt | 2 +- 9 files changed, 5 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..c18fd9fd 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -2,8 +2,7 @@ package ru.otus.daggerhomework import android.graphics.Color import androidx.annotation.ColorInt -import androidx.annotation.ColorRes -import java.util.* +import java.util.Random interface ColorGenerator { diff --git a/app/src/main/java/ru/otus/daggerhomework/Event.kt b/app/src/main/java/ru/otus/daggerhomework/Event.kt index 53d2c0c7..9430ca42 100644 --- a/app/src/main/java/ru/otus/daggerhomework/Event.kt +++ b/app/src/main/java/ru/otus/daggerhomework/Event.kt @@ -1,7 +1,5 @@ package ru.otus.daggerhomework -import java.util.UUID - sealed class Event { data class PopulateColor( val color: Int diff --git a/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt b/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt index 0cd4229e..50498593 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt @@ -7,8 +7,6 @@ import android.view.ViewGroup import android.widget.Button import androidx.fragment.app.Fragment import ru.otus.daggerhomework.di.DaggerProducerFragmentComponent -import ru.otus.daggerhomework.di.ProducerFragmentComponent -import javax.inject.Inject class ProducerFragment : Fragment() { diff --git a/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt b/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt index 29f95524..b052507b 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt @@ -5,7 +5,7 @@ import android.content.Context import android.widget.Toast import kotlinx.coroutines.flow.MutableStateFlow -class ProducerViewModel ( +class ProducerViewModel( private val colorGenerator: ColorGenerator, private val context: Context, private val event: MutableStateFlow diff --git a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt index 0377f889..e2d49e36 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt @@ -27,7 +27,8 @@ class ReceiverFragment : Fragment() { .factory() .build( requireActivity().application.component, - requireActivity().component) + requireActivity().component + ) viewModel = component.viewModel() return inflater.inflate(R.layout.fragment_receiver, container, false) diff --git a/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt index a8618978..a28c46ee 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/MainActivityComponent.kt @@ -1,12 +1,10 @@ package ru.otus.daggerhomework.di -import android.app.Activity import android.content.Context import dagger.BindsInstance import dagger.Component import kotlinx.coroutines.flow.MutableStateFlow import ru.otus.daggerhomework.Event -import javax.inject.Named @ActivityScope @Component(modules = [MainActivityModule::class]) diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt index 51b6e079..186a3137 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ProducerFragmentComponent.kt @@ -1,7 +1,5 @@ package ru.otus.daggerhomework.di -import android.content.Context -import dagger.BindsInstance import dagger.Component import ru.otus.daggerhomework.ProducerViewModel diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt b/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt index 5b763fc2..7c0bb783 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt @@ -1,6 +1,5 @@ package ru.otus.daggerhomework.di -import android.app.Activity import android.content.Context import dagger.Module import dagger.Provides @@ -9,7 +8,6 @@ import ru.otus.daggerhomework.ColorGenerator import ru.otus.daggerhomework.ColorGeneratorImpl import ru.otus.daggerhomework.Event import ru.otus.daggerhomework.ProducerViewModel -import javax.inject.Named @Module diff --git a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt index 44d01745..c4859760 100644 --- a/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/di/ReceiverFragmentComponent.kt @@ -13,7 +13,7 @@ interface ReceiverFragmentComponent { @Component.Factory interface Factory { fun build( - applicationComponent:ApplicationComponent, + applicationComponent: ApplicationComponent, mainActivityComponent: MainActivityComponent ): ReceiverFragmentComponent }