From 03e442dd1ba71dc23fb874204bb7d36e5ff8d873 Mon Sep 17 00:00:00 2001 From: D_Mironov_29682 Date: Fri, 16 Sep 2022 19:47:35 +0300 Subject: [PATCH 1/3] created new components --- .../main/java/ru/otus/daggerhomework/App.kt | 9 +++++++- .../daggerhomework/ApplicationComponent.kt | 23 +++++++++++++++++++ .../FragmentProducerComponent.kt | 4 ++++ .../FragmentReceiverComponent.kt | 4 ++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..ac7cd357 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -2,5 +2,12 @@ package ru.otus.daggerhomework import android.app.Application -class App :Application() { +class App : Application() { + + lateinit var appComponent: ApplicationComponent + + override fun onCreate() { + super.onCreate() + appComponent = 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..00eaaa52 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,27 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import javax.inject.Qualifier +import javax.inject.Singleton + +@Qualifier +annotation class QualifierAppContext + +@Singleton +@Component interface ApplicationComponent { + + @QualifierAppContext + fun provideAppContext(): Context + + @Component.Factory + interface AppComponentFactory { + fun create( + @QualifierAppContext + @BindsInstance + applicationContext: Context + ): ApplicationComponent + } } \ 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..f6744dff --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducerComponent.kt @@ -0,0 +1,4 @@ +package ru.otus.daggerhomework + +interface FragmentProducerComponent { +} \ 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..49eeda38 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentReceiverComponent.kt @@ -0,0 +1,4 @@ +package ru.otus.daggerhomework + +interface FragmentReceiverComponent { +} \ No newline at end of file From 163a85f3ba2f3f4211e61ffa2bb5732ea2a4eee8 Mon Sep 17 00:00:00 2001 From: D_Mironov_29682 Date: Tue, 20 Sep 2022 10:10:52 +0300 Subject: [PATCH 2/3] created new component and module --- app/build.gradle | 19 +++++++----- .../daggerhomework/MainActivityComponent.kt | 30 +++++++++++++++++++ .../otus/daggerhomework/MainActivityModule.kt | 13 ++++++++ build.gradle | 4 +-- 4 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/MainActivityModule.kt diff --git a/app/build.gradle b/app/build.gradle index a5609bb9..4cef831c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,13 +5,13 @@ plugins { } android { - compileSdkVersion 30 + compileSdkVersion 32 buildToolsVersion "30.0.3" defaultConfig { applicationId "ru.otus.daggerhomework" minSdkVersion 23 - targetSdkVersion 30 + targetSdkVersion 32 versionCode 1 versionName "1.0" @@ -35,10 +35,13 @@ android { dependencies { 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:2.38.1' - kapt 'com.google.dagger:dagger-compiler:2.38.1' + implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.google.dagger:dagger:2.43.2' + kapt 'com.google.dagger:dagger-compiler:2.43.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt b/app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt new file mode 100644 index 00000000..ea6e75e4 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt @@ -0,0 +1,30 @@ +package ru.otus.daggerhomework + +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import kotlinx.coroutines.flow.MutableStateFlow +import javax.inject.Scope + +@Scope +annotation class ActivityScope + +@ActivityScope +@Component(dependencies = [ApplicationComponent::class], modules = [MainActivityModule::class]) +interface MainActivityComponent { + + @QualifierAppContext + fun appContextProvide(): Context + + fun activityContextProvide(): Context + + fun stateFlowProvide(): MutableStateFlow + + @Component.Factory + interface MainActivityComponentFactory { + fun create( + @BindsInstance activityContext: Context, + applicationComponent: ApplicationComponent + ): MainActivityComponent + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/MainActivityModule.kt b/app/src/main/java/ru/otus/daggerhomework/MainActivityModule.kt new file mode 100644 index 00000000..52705cf3 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/MainActivityModule.kt @@ -0,0 +1,13 @@ +package ru.otus.daggerhomework + +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.flow.MutableStateFlow + +@Module +class MainActivityModule { + + @ActivityScope + @Provides + fun stateObserver(): MutableStateFlow = MutableStateFlow(0) +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index e47bb55b..1cac592b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = "1.4.32" + ext.kotlin_version = "1.5.20" repositories { google() jcenter() } dependencies { - classpath "com.android.tools.build:gradle:4.1.2" + classpath "com.android.tools.build:gradle:4.1.3" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From dd6f6de90a15a4fa5d82f4c8897a83cf81406217 Mon Sep 17 00:00:00 2001 From: D_Mironov_29682 Date: Tue, 20 Sep 2022 13:07:25 +0300 Subject: [PATCH 3/3] created new modules and corrected logic --- app/build.gradle | 7 +++++-- app/src/main/AndroidManifest.xml | 1 + .../daggerhomework/ApplicationComponent.kt | 4 ++++ .../ru/otus/daggerhomework/ColorGenerator.kt | 4 ++-- .../otus/daggerhomework/FragmentProducer.kt | 18 ++++++++++++++++- .../FragmentProducerComponent.kt | 6 ++++++ .../daggerhomework/FragmentProducerModule.kt | 18 +++++++++++++++++ .../otus/daggerhomework/FragmentReceiver.kt | 20 ++++++++++++++++--- .../FragmentReceiverComponent.kt | 6 ++++++ .../daggerhomework/FragmentReceiverModule.kt | 15 ++++++++++++++ .../ru/otus/daggerhomework/MainActivity.kt | 15 ++++++++++++++ .../otus/daggerhomework/ViewModelFactory.kt | 20 +++++++++++++++++++ .../otus/daggerhomework/ViewModelProducer.kt | 7 +++++-- .../otus/daggerhomework/ViewModelReceiver.kt | 14 ++++++++++--- app/src/main/res/layout/activity_main.xml | 3 ++- app/src/main/res/layout/fragment_a.xml | 7 +++---- build.gradle | 2 +- 17 files changed, 148 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentProducerModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/FragmentReceiverModule.kt create mode 100644 app/src/main/java/ru/otus/daggerhomework/ViewModelFactory.kt diff --git a/app/build.gradle b/app/build.gradle index 4cef831c..c13f3a7e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,13 +5,13 @@ plugins { } android { - compileSdkVersion 32 + compileSdkVersion 33 buildToolsVersion "30.0.3" defaultConfig { applicationId "ru.otus.daggerhomework" minSdkVersion 23 - targetSdkVersion 32 + targetSdkVersion 33 versionCode 1 versionName "1.0" @@ -30,6 +30,9 @@ android { } kotlinOptions { jvmTarget = '1.8' + freeCompilerArgs += [ + "-Xjvm-default=all", + ] } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..e9a428ef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:name=".App" android:theme="@style/Theme.DaggerHomework"> diff --git a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt index 00eaaa52..713fd5af 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -4,11 +4,15 @@ import android.content.Context import dagger.BindsInstance import dagger.Component import javax.inject.Qualifier +import javax.inject.Scope import javax.inject.Singleton @Qualifier annotation class QualifierAppContext +@Scope +annotation class FragmentScope + @Singleton @Component interface ApplicationComponent { diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..9e2ff35a 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -2,8 +2,8 @@ package ru.otus.daggerhomework import android.graphics.Color import androidx.annotation.ColorInt -import androidx.annotation.ColorRes import java.util.* +import javax.inject.Inject interface ColorGenerator { @@ -11,7 +11,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..cf554d72 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -6,21 +6,37 @@ 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 + lateinit var viewModelProducer: ViewModelProducer + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + DaggerFragmentProducerComponent.builder() + .mainActivityComponent((requireActivity() as MainActivity).activityComponent) + .build() + .inject(this) + viewModelProducer = 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) view.findViewById