From e8438018f88cc330c87ee80a4d9d43644a7c1d2a Mon Sep 17 00:00:00 2001 From: Roman Belyanin Date: Mon, 2 May 2022 20:59:17 +0300 Subject: [PATCH 1/3] Dagger2 homework --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 1 + .../ru/otus/daggerhomework/ActivityContext.kt | 7 ++++ .../ru/otus/daggerhomework/ActivityScope.kt | 7 ++++ .../main/java/ru/otus/daggerhomework/App.kt | 8 +++- .../daggerhomework/ApplicationComponent.kt | 37 ++++++++++++++++++ .../otus/daggerhomework/ApplicationContext.kt | 7 ++++ .../ru/otus/daggerhomework/ColorGenerator.kt | 3 +- .../otus/daggerhomework/FragmentProducer.kt | 20 +++++++++- .../FragmentProducerComponent.kt | 39 +++++++++++++++++++ .../otus/daggerhomework/FragmentReceiver.kt | 25 +++++++++++- .../FragmentReceiverComponent.kt | 17 ++++++++ .../ru/otus/daggerhomework/FragmentScope.kt | 7 ++++ .../ru/otus/daggerhomework/MainActivity.kt | 18 ++++++++- .../daggerhomework/MainActivityComponent.kt | 32 +++++++++++++++ .../otus/daggerhomework/ViewModelProducer.kt | 21 ++++++++-- .../otus/daggerhomework/ViewModelReceiver.kt | 35 +++++++++++++++-- app/src/main/res/layout/activity_main.xml | 22 ++++++++--- 18 files changed, 291 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/ActivityContext.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ActivityScope.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ApplicationContext.kt 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/FragmentScope.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt diff --git a/app/build.gradle b/app/build.gradle index a5609bb9..03e3083a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,4 +41,6 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'com.google.dagger:dagger:2.38.1' kapt 'com.google.dagger:dagger-compiler:2.38.1' + implementation "androidx.activity:activity-ktx:1.3.+" + implementation 'androidx.fragment:fragment-ktx:1.3.+' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..52c72c96 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" + android:name=".App" android:supportsRtl="true" android:theme="@style/Theme.DaggerHomework"> diff --git a/app/src/main/java/ru/otus/daggerhomework/ActivityContext.kt b/app/src/main/java/ru/otus/daggerhomework/ActivityContext.kt new file mode 100644 index 00000000..20f5bcae --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ActivityContext.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class ActivityContext diff --git a/app/src/main/java/ru/otus/daggerhomework/ActivityScope.kt b/app/src/main/java/ru/otus/daggerhomework/ActivityScope.kt new file mode 100644 index 00000000..33536baa --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ActivityScope.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework + +import javax.inject.Scope + +@Scope +@Retention +annotation class ActivityScope diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..3697c506 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -2,5 +2,11 @@ package ru.otus.daggerhomework import android.app.Application -class App :Application() { +class App : Application() { + + val appComponent by lazy { + DaggerApplicationComponent + .factory() + .create(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..c8a15afd 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,41 @@ package ru.otus.daggerhomework +import android.app.Application +import android.content.Context +import androidx.lifecycle.ViewModelProvider +import dagger.* +import kotlinx.coroutines.flow.MutableStateFlow +import javax.inject.Singleton + +@Singleton +@Component(modules = [ApplicationModule::class]) interface ApplicationComponent { + + @Component.Factory + interface Factory { + fun create( + @BindsInstance @ApplicationContext context: Context + ): ApplicationComponent + } + + @ApplicationContext + fun provideApplicationContext(): Context + + fun provideColorGenerator(): ColorGenerator + + fun provideState(): MutableStateFlow +} + +@Module +interface ApplicationModule { + + companion object { + @Provides + @Singleton + fun provideState() = MutableStateFlow(0) + } + + @Binds + @Singleton + fun bindColorGenerator(generator: ColorGeneratorImpl): ColorGenerator } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ApplicationContext.kt b/app/src/main/java/ru/otus/daggerhomework/ApplicationContext.kt new file mode 100644 index 00000000..4f44e880 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationContext.kt @@ -0,0 +1,7 @@ +package ru.otus.daggerhomework + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class ApplicationContext diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..f0ca940b 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..9b58f3b9 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -1,26 +1,42 @@ 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 androidx.fragment.app.viewModels +import javax.inject.Inject class FragmentProducer : Fragment() { + + @Inject + lateinit var viewModelFactory: ProducerFactory + val viewModel: ViewModelProducer by viewModels {viewModelFactory} + + override fun onAttach(context: Context) { + super.onAttach(context) + FragmentProducerComponent.crete( +// ((requireContext().applicationContext as App).appComponent), + (requireActivity() as MainActivity).activityComponent + ).inject(this) + } + 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) view.findViewById