diff --git a/app/build.gradle b/app/build.gradle index 705d0941..731f2c3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,8 +36,12 @@ 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.lifecycle:lifecycle-livedata-ktx:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' + implementation 'androidx.activity:activity-ktx:1.2.3' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' implementation 'com.google.dagger:dagger:2.42' kapt 'com.google.dagger:dagger-compiler:2.42' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..ddfffee0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,10 +10,9 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.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..b9a99eaa 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -1,6 +1,14 @@ package ru.otus.daggerhomework import android.app.Application +import android.content.Context -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..9474a9b6 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,51 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.Module +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Provides +import dagger.Subcomponent + +@Component interface ApplicationComponent { -} \ No newline at end of file + fun createFragmentProducerComponent() : FragmentProducerComponent + fun createFragmentReceiverComponent() : FragmentReceiverComponent + + @Component.Factory + interface ApplicationComponentFactory { + fun create(@BindsInstance context : Context) : ApplicationComponent + } +} + +@Subcomponent(modules = [FragmentProducerModule::class]) +interface FragmentProducerComponent { + fun inject(fragment : FragmentProducer) +} + +@Subcomponent(modules = [FragmentReceiverModule::class]) +interface FragmentReceiverComponent { + fun inject(fragment : FragmentReceiver) +} + +@Module +interface FragmentProducerModule { + + companion object { + @Provides + fun provideColorContainer() : ColorContainer = ColorContainerImpl() + + @Provides + fun provideColorGenerator() : ColorGenerator = ColorGeneratorImpl() + } +} + +@Module +interface FragmentReceiverModule { + + companion object { + @Provides + fun provideColorContainer(): ColorContainer = ColorContainerImpl() + } +} diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorContainer.kt b/app/src/main/java/ru/otus/daggerhomework/ColorContainer.kt new file mode 100644 index 00000000..25290d4f --- /dev/null +++ b/app/src/main/java/ru/otus/daggerhomework/ColorContainer.kt @@ -0,0 +1,34 @@ +package ru.otus.daggerhomework + +import androidx.lifecycle.LifecycleOwner +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.collect +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.lifecycle.asLiveData +import javax.inject.Inject +import javax.inject.Singleton +import kotlin.coroutines.CoroutineContext + +interface ColorContainer { + fun setColor(color: Int) + fun getData() : LiveData +} + +@Singleton +class ColorContainerImpl @Inject constructor() : ColorContainer { + private val _state : MutableStateFlow = MutableStateFlow(value = 0) + val state : StateFlow = _state.asStateFlow() + + override fun setColor(color: Int) { + _state.value = color + } + + override fun getData() : LiveData { + return state.asLiveData() + } +} diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..79275a37 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -3,6 +3,7 @@ package ru.otus.daggerhomework import android.graphics.Color import androidx.annotation.ColorInt import androidx.annotation.ColorRes +import javax.inject.Inject import java.util.* 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..7e38c53c 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -1,14 +1,29 @@ package ru.otus.daggerhomework +import android.app.Activity +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 dagger.Binds +import javax.inject.Inject class FragmentProducer : Fragment() { + @Inject + lateinit var appContext : Context + + @Inject + lateinit var viewModel : ViewModelProducer + + override fun onAttach(context: Context) { + super.onAttach(context) + ((context as Activity).application as App).appComponent.createFragmentProducerComponent().inject(this) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -20,7 +35,7 @@ class FragmentProducer : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.findViewById