From 57b3d48c547b98f9425e99a709194216d648b847 Mon Sep 17 00:00:00 2001 From: SergeyKozhukhov Date: Tue, 8 Aug 2023 09:19:13 +0300 Subject: [PATCH] Use Subcomponents --- README.md | 9 +++ app/build.gradle | 16 ++++ app/src/main/AndroidManifest.xml | 8 +- .../main/java/ru/otus/daggerhomework/App.kt | 22 +++++- .../daggerhomework/ApplicationComponent.kt | 4 - .../ru/otus/daggerhomework/ColorGenerator.kt | 20 ----- .../otus/daggerhomework/FragmentProducer.kt | 26 ------- .../otus/daggerhomework/FragmentReceiver.kt | 31 -------- .../ru/otus/daggerhomework/MainActivity.kt | 12 --- .../otus/daggerhomework/ViewModelProducer.kt | 16 ---- .../otus/daggerhomework/ViewModelReceiver.kt | 15 ---- .../daggerhomework/di/ApplicationComponent.kt | 25 +++++++ .../di/ApplicationSubcomponentsModule.kt | 10 +++ .../di/main/MainActivityComponent.kt | 32 ++++++++ .../di/main/MainActivityModule.kt | 26 +++++++ .../main/MainActivitySubcomponentsModule.kt | 11 +++ .../di/producer/FragmentProducerComponent.kt | 25 +++++++ .../di/producer/FragmentProducerModule.kt | 16 ++++ .../di/receiver/FragmentReceiverComponent.kt | 25 +++++++ .../di/receiver/FragmentReceiverModule.kt | 16 ++++ .../di/utils/qualifiers/ActivityContext.kt | 10 +++ .../di/utils/qualifiers/ApplicationContext.kt | 10 +++ .../di/utils/scopes/ActivityScope.kt | 11 +++ .../di/utils/scopes/FragmentScope.kt | 11 +++ .../ru/otus/daggerhomework/info/README.md | 16 ++++ .../daggerhomework/presentation/Activity.kt | 21 ++++++ .../presentation/ActivityProvider.kt | 17 +++++ .../presentation/color/ColorGenerator.kt | 13 ++++ .../presentation/color/ColorGeneratorImpl.kt | 17 +++++ .../presentation/producer/FragmentProducer.kt | 38 ++++++++++ .../producer/ViewModelProducer.kt | 53 ++++++++++++++ .../presentation/receiver/ColorUiState.kt | 26 +++++++ .../presentation/receiver/FragmentReceiver.kt | 73 +++++++++++++++++++ .../receiver/ViewModelReceiver.kt | 64 ++++++++++++++++ app/src/main/res/drawable/rectangle.xml | 10 +++ app/src/main/res/layout/activity_main.xml | 34 ++++++--- app/src/main/res/layout/fragment_a.xml | 1 + app/src/main/res/layout/fragment_b.xml | 13 +++- app/src/main/res/values/dimens.xml | 11 +++ app/src/main/res/values/strings.xml | 8 ++ 40 files changed, 684 insertions(+), 138 deletions(-) delete mode 100644 app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiver.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivity.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/ViewModelProducer.kt delete mode 100644 app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ApplicationComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/ApplicationSubcomponentsModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/main/MainActivityComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/main/MainActivityModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/main/MainActivitySubcomponentsModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/producer/FragmentProducerComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/producer/FragmentProducerModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/receiver/FragmentReceiverComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/receiver/FragmentReceiverModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/utils/qualifiers/ActivityContext.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/utils/qualifiers/ApplicationContext.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/utils/scopes/ActivityScope.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/di/utils/scopes/FragmentScope.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/info/README.md create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/Activity.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/ActivityProvider.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/color/ColorGenerator.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/color/ColorGeneratorImpl.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/producer/FragmentProducer.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/producer/ViewModelProducer.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/receiver/ColorUiState.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/receiver/FragmentReceiver.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/presentation/receiver/ViewModelReceiver.kt create mode 100644 app/src/main/res/drawable/rectangle.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/README.md b/README.md index 4d77164a..0e922acf 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# Dagger2 + +## Задача + ### Реализуйте ApplicationComponent Это корень нашего дерева компонентов. Инициализируется в классе App, прокидывает в граф через Component Dependencies/Subcomponents ниже по графу следующие сущности: - Context(Application) до FragmentProducerComponent и FragmentReceiverComponent. @@ -12,3 +16,8 @@ Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую реализацию обсервера которая уже есть в графе. ViewModelProducer должна отправлять эвенты, ViewModelReceiver должна получать эвенты. Обсерверы должны прокидываться в конструкторы вьюмоделей и существовать в единственном экземпляре в Activity. Флоу отправки эвента выглядит следующим образом: Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер -> евент ловится на стороне ViewModelReceiver -> евент передается FragmentReceiver и вызывается функция ru.otus.daggerhomework.FragmentReceiver#populateColor + +## Решение + +Решение базируется на Subcomponents. +В качестве канала коммуникации между франментами использован Channel. \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 705d0941..fdc1edb1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,22 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + + // dagger2 implementation 'com.google.dagger:dagger:2.42' kapt 'com.google.dagger:dagger-compiler:2.42' + + // coroutines + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' + + // + /* lifecircle */ + def lifecycle_version = "2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" + + /* extensions to simplify the fragment API */ + implementation "androidx.fragment:fragment-ktx:1.5.5" } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..316a9d64 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,16 +1,18 @@ - - + diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..dfd483ea 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -1,6 +1,26 @@ package ru.otus.daggerhomework import android.app.Application +import android.content.Context +import ru.otus.daggerhomework.di.ApplicationComponent +import ru.otus.daggerhomework.di.DaggerApplicationComponent -class App :Application() { +/** + * `Custom application` приложения + */ +class App : Application() { + + private lateinit var applicationComponent: ApplicationComponent + + override fun onCreate() { + super.onCreate() + applicationComponent = DaggerApplicationComponent.factory().create(this) + } + + companion object { + + /** Получить [applicationComponent] на основе [context] */ + fun appComponent(context: Context) = + (context.applicationContext as App).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 deleted file mode 100644 index fc47f256..00000000 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ /dev/null @@ -1,4 +0,0 @@ -package ru.otus.daggerhomework - -interface 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 deleted file mode 100644 index a9e25a27..00000000 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ /dev/null @@ -1,20 +0,0 @@ -package ru.otus.daggerhomework - -import android.graphics.Color -import androidx.annotation.ColorInt -import androidx.annotation.ColorRes -import java.util.* - -interface ColorGenerator { - - @ColorInt - fun generateColor(): Int -} - -class ColorGeneratorImpl : ColorGenerator { - - override fun generateColor(): Int { - val rnd = Random() - return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)) - } -} \ 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 deleted file mode 100644 index 00dd10dc..00000000 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package ru.otus.daggerhomework - -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 - -class FragmentProducer : Fragment() { - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_a, container, true) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - view.findViewById