diff --git a/app/build.gradle b/app/build.gradle index a5609bb9..b4297ab1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,13 +5,13 @@ plugins { } android { - compileSdkVersion 30 + compileSdkVersion 31 buildToolsVersion "30.0.3" defaultConfig { applicationId "ru.otus.daggerhomework" minSdkVersion 23 - targetSdkVersion 30 + targetSdkVersion 31 versionCode 1 versionName "1.0" @@ -40,5 +40,8 @@ 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.fragment:fragment-ktx:1.4.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' kapt 'com.google.dagger:dagger-compiler:2.38.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..9500dad6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,14 +3,15 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="ru.otus.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..fa1f4efa 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -2,5 +2,13 @@ package ru.otus.daggerhomework import android.app.Application -class App :Application() { +class App : Application() { + + lateinit var applicationComponent: ApplicationComponent + + override fun onCreate() { + super.onCreate() + + applicationComponent = 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..8b7c99f9 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 + +@Component interface ApplicationComponent { + + @ApplicationContextQualifier + fun provideApplicationContext(): Context + + @Component.Factory + interface ApplicationComponentFactory { + + fun create( + @ApplicationContextQualifier + @BindsInstance + applicationContext: Context + ): ApplicationComponent + } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/Color.kt b/app/src/main/java/ru/otus/daggerhomework/Color.kt new file mode 100644 index 00000000..49cb47c8 --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/Color.kt @@ -0,0 +1,4 @@ +package ru.otus.daggerhomework + +@JvmInline +value class Color constructor(val color: Int) \ 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 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/DaggerAnnotations.kt b/app/src/main/java/ru/otus/daggerhomework/DaggerAnnotations.kt new file mode 100644 index 00000000..5d01231c --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/DaggerAnnotations.kt @@ -0,0 +1,36 @@ +package ru.otus.daggerhomework + +import androidx.lifecycle.ViewModel +import dagger.MapKey +import javax.inject.Qualifier +import javax.inject.Scope +import kotlin.reflect.KClass + +@Scope +@Retention(AnnotationRetention.RUNTIME) +annotation class ApplicationScope + +@Scope +@Retention(AnnotationRetention.RUNTIME) +annotation class ActivityScope + +@Scope +@Retention(AnnotationRetention.RUNTIME) +annotation class FragmentScope + +@MapKey +@Retention(AnnotationRetention.RUNTIME) +@Target( + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER +) +annotation class ViewModelKey(val value: KClass) + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class ActivityContextQualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class ApplicationContextQualifier \ 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..187020ac 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -1,26 +1,48 @@ 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.lifecycle.ViewModelProvider +import javax.inject.Inject class FragmentProducer : Fragment() { + @Inject + lateinit var viewModelFactory: ViewModelFactory + + lateinit var vm: ViewModelProducer + 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) + + vm = ViewModelProvider(this, viewModelFactory)[ViewModelProducer::class.java] + view.findViewById