From 3e30a3456ee13e9b22d549ffb63126838c2436e8 Mon Sep 17 00:00:00 2001 From: GeorgeBozon Date: Wed, 13 Nov 2024 22:12:18 +0300 Subject: [PATCH 1/3] =?UTF-8?q?1.=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20ApplicationComponent=20=D0=B8?= =?UTF-8?q?=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D1=82=D1=8C=20=D1=81=20=20Fra?= =?UTF-8?q?gmentProducerComponent=20=D0=B8=20FragmentReceiverComponent=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=20ApplicationContext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 ++- .../main/java/ru/otus/daggerhomework/App.kt | 10 ++++++++++ .../daggerhomework/ApplicationComponent.kt | 20 ++++++++++++++++++- .../FragmentProducerComponent.kt | 19 ++++++++++++++++++ .../daggerhomework/FragmentProducerModule.kt | 17 ++++++++++++++++ .../FragmentReceiverComponent.kt | 17 ++++++++++++++++ .../daggerhomework/FragmentReceiverModule.kt | 17 ++++++++++++++++ .../otus/daggerhomework/ViewModelReceiver.kt | 3 ++- 8 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducerModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiverModule.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..eae16063 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.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..522c461f 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -3,4 +3,14 @@ package ru.otus.daggerhomework import android.app.Application class App :Application() { + lateinit var appCompoment: ApplicationComponent + override fun onCreate() { + super.onCreate() + appCompoment = DaggerApplicationComponent.factory().newAppComponent(applicationContext) + } + +} + +fun Application.asApp(): App { + return this as App } \ 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..b77b357d 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,22 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import javax.inject.Qualifier + +@Component interface ApplicationComponent { -} \ No newline at end of file + + @ApplicationContext + fun provideContext(): Context + + @Component.Factory + interface Factory{ + + fun newAppComponent(@ApplicationContext @BindsInstance context: Context): ApplicationComponent + } +} + +@Qualifier +annotation class ApplicationContext \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt new file mode 100644 index 00000000..dec7bacc --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt @@ -0,0 +1,19 @@ +package ru.otus.daggerhomework + +import dagger.Component +import javax.inject.Singleton + +@Singleton +@Component( + modules = [FragmentProducerModule::class], + dependencies = [ApplicationComponent::class] +) +interface FragmentProducerComponent { + + companion object { + fun getFragmentProducerComponent(applicationComponent: ApplicationComponent): FragmentProducerComponent { + return DaggerFragmentProducerComponent.builder() + .applicationComponent(applicationComponent).build() + } + } +} diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentProducerModule.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentProducerModule.kt new file mode 100644 index 00000000..068fa7c3 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducerModule.kt @@ -0,0 +1,17 @@ +package ru.otus.daggerhomework + +import android.content.Context +import dagger.Module +import dagger.Provides + +@Module +interface FragmentProducerModule { + companion object{ + + @Provides + fun provideContext(@ApplicationContext context: Context): Context{ + return context + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt new file mode 100644 index 00000000..7d0546ed --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt @@ -0,0 +1,17 @@ +package ru.otus.daggerhomework + +import dagger.Component + +@Component( + modules = [FragmentReceiverModule::class], + dependencies = [ApplicationComponent::class] +) +interface FragmentReceiverComponent { + + companion object { + fun getFragmentReceiverComponent(applicationComponent: ApplicationComponent): FragmentReceiverComponent { + return DaggerFragmentReceiverComponent.builder() + .applicationComponent(applicationComponent).build() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverModule.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverModule.kt new file mode 100644 index 00000000..b7a13146 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverModule.kt @@ -0,0 +1,17 @@ +package ru.otus.daggerhomework + +import android.content.Context +import dagger.Module +import dagger.Provides + +@Module +interface FragmentReceiverModule { + companion object{ + + @Provides + fun provideContext(@ApplicationContext context: Context): Context{ + return context + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt b/app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt index 8a3a5ead..2d22c149 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt @@ -3,8 +3,9 @@ package ru.otus.daggerhomework import android.app.Application import android.content.Context import android.widget.Toast +import javax.inject.Inject -class ViewModelReceiver( +class ViewModelReceiver @Inject constructor( private val context: Context ) { From 2893c78050693fdb2968efa2fcf14fcecbaf87cc Mon Sep 17 00:00:00 2001 From: GeorgeBozon Date: Thu, 14 Nov 2024 16:51:04 +0300 Subject: [PATCH 2/3] =?UTF-8?q?2.=20=D0=9E=D1=81=D1=82=D0=B0=D0=B2=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=D1=81=D1=8F=20=D0=B4=D0=B2=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 +++++ app/src/main/AndroidManifest.xml | 1 + .../daggerhomework/ApplicationComponent.kt | 2 + .../ru/otus/daggerhomework/ColorGenerator.kt | 4 +- .../ru/otus/daggerhomework/EventsReader.kt | 7 +++ .../ru/otus/daggerhomework/EventsWriter.kt | 5 +++ .../otus/daggerhomework/EventsWriterReader.kt | 17 +++++++ .../otus/daggerhomework/FragmentProducer.kt | 13 +++++- .../FragmentProducerComponent.kt | 16 ++++--- .../daggerhomework/FragmentProducerModule.kt | 17 ------- .../otus/daggerhomework/FragmentReceiver.kt | 27 +++++++++-- .../FragmentReceiverComponent.kt | 10 +++-- .../daggerhomework/FragmentReceiverModule.kt | 17 ------- .../ru/otus/daggerhomework/MainActivity.kt | 4 ++ .../daggerhomework/MainActivityComponent.kt | 32 +++++++++++++ .../otus/daggerhomework/MainActivityModule.kt | 45 +++++++++++++++++++ .../otus/daggerhomework/ViewModelFactory.kt | 15 +++++++ .../otus/daggerhomework/ViewModelProducer.kt | 12 +++-- .../otus/daggerhomework/ViewModelReceiver.kt | 18 ++++++-- app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/values/strings.xml | 1 + 21 files changed, 215 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/EventsReader.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/EventsWriter.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/EventsWriterReader.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducerModule.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiverModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivityModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ViewModelFactory.kt diff --git a/app/build.gradle b/app/build.gradle index 705d0941..e5f7d73d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,11 +33,21 @@ android { } dependencies { + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0" + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0' + implementation 'androidx.activity:activity-ktx:1.2.3' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.6.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + + implementation "com.google.dagger:dagger-android:2.42" + implementation "com.google.dagger:dagger-android-support:2.42" + kapt "com.google.dagger:dagger-android-processor:2.42" + implementation 'com.google.dagger:dagger:2.42' kapt 'com.google.dagger:dagger-compiler:2.42' } \ No newline at end of file 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"> +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/EventsWriter.kt b/app/src/main/java/ru/otus/daggerhomework/EventsWriter.kt new file mode 100644 index 00000000..266adf03 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/EventsWriter.kt @@ -0,0 +1,5 @@ +package ru.otus.daggerhomework + +interface EventsWriter { + fun writeEvent(color: Int) +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/EventsWriterReader.kt b/app/src/main/java/ru/otus/daggerhomework/EventsWriterReader.kt new file mode 100644 index 00000000..df0b509d --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/EventsWriterReader.kt @@ -0,0 +1,17 @@ +package ru.otus.daggerhomework + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import javax.inject.Inject + +class EventsWriterReader @Inject constructor() : EventsReader, EventsWriter { + private val _eventsFlow = MutableSharedFlow(replay = 1) + + override val eventsFlow: Flow + get() = _eventsFlow.asSharedFlow() + + override fun writeEvent(color: Int) { + _eventsFlow.tryEmit(color) + } +} \ 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..c1889aa9 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -6,21 +6,30 @@ 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: ViewModelFactory + private val viewModel: ViewModelProducer by lazy { + ViewModelProvider(this, viewModelFactory)[ViewModelProducer::class.java] + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_a, container, true) + return inflater.inflate(R.layout.fragment_a, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + FragmentProducerComponent.getFragmentProducerComponent( + (requireActivity() as MainActivity).mainActivityComponent).inject(this) view.findViewById