From 309cc343934bc5875438935f3cf8aba1878934a5 Mon Sep 17 00:00:00 2001 From: Elisey Lobanov Date: Fri, 20 May 2022 19:20:54 +0300 Subject: [PATCH] Dagger Homework --- app/build.gradle | 6 +++ app/src/main/AndroidManifest.xml | 1 + .../main/java/ru/otus/daggerhomework/App.kt | 17 ++++++- .../daggerhomework/ApplicationComponent.kt | 42 +++++++++++++++++- .../ru/otus/daggerhomework/ColorGenerator.kt | 3 +- .../otus/daggerhomework/FragmentProducer.kt | 44 ++++++++++++++++++- .../otus/daggerhomework/FragmentReceiver.kt | 38 ++++++++++++++-- .../ru/otus/daggerhomework/MainActivity.kt | 39 +++++++++++++++- .../otus/daggerhomework/ViewModelProducer.kt | 25 +++++++++-- .../otus/daggerhomework/ViewModelReceiver.kt | 31 ++++++++++--- app/src/main/res/layout/activity_main.xml | 23 +++++++--- app/src/main/res/layout/fragment_a.xml | 2 +- app/src/main/res/layout/fragment_b.xml | 3 +- build.gradle | 2 +- 14 files changed, 248 insertions(+), 28 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5609bb9..7ba79305 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,5 +40,11 @@ dependencies { implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'com.google.dagger:dagger:2.38.1' + implementation 'androidx.navigation:navigation-fragment-ktx:2.2.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.2.0' kapt 'com.google.dagger:dagger-compiler:2.38.1' + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1" + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..2a310058 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ package="ru.otus.daggerhomework"> applicationComponent + else -> this.applicationContext.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..17f0fb24 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,44 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.flow.MutableStateFlow +import javax.inject.Qualifier +import javax.inject.Scope +import javax.inject.Singleton + +@AppScope +@Component(modules = [ApplicationModule::class]) interface ApplicationComponent { -} \ No newline at end of file + + @AppContext + fun provideContext(): Context + + fun providesStateFlow(): MutableStateFlow + + @Component.Factory + interface Factory { + fun create( + @AppContext + @BindsInstance context: Context + ): ApplicationComponent + } +} + +@Module() +class ApplicationModule { + @AppScope + @Provides + fun provideMutableStateFlow(): MutableStateFlow { + return MutableStateFlow(0) + } +} + +@Qualifier +annotation class AppContext + +@Scope +annotation class AppScope diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..c0d6c919 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -4,6 +4,7 @@ import android.graphics.Color import androidx.annotation.ColorInt import androidx.annotation.ColorRes import java.util.* +import javax.inject.Inject interface ColorGenerator { @@ -11,7 +12,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/FragmentProducer.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt index 00dd10dc..48f8554a 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -6,21 +6,61 @@ import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import dagger.Binds +import dagger.Component +import dagger.Module +import javax.inject.Inject +import javax.inject.Scope class FragmentProducer : Fragment() { + @Inject + lateinit var viewModelProducerFactory: ViewModelProducerFactory + private val viewModelProducer by viewModels { viewModelProducerFactory } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_a, container, true) + DaggerFragmentProducerComponent + .factory() + .create((requireActivity() as MainActivity).mainActivityComponent) + .inject(this) + return inflater.inflate(R.layout.fragment_a, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.findViewById