Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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.+'
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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">
<activity android:name=".MainActivity">
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ActivityContext.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework

import javax.inject.Qualifier

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ActivityContext
7 changes: 7 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ActivityScope.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework

import javax.inject.Scope

@Scope
@Retention
annotation class ActivityScope
8 changes: 7 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
20 changes: 20 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt
Original file line number Diff line number Diff line change
@@ -1,4 +1,24 @@
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()
interface ApplicationComponent {

@Component.Factory
interface Factory {
fun create(
@BindsInstance @ApplicationContext context: Context
): ApplicationComponent
}

@ApplicationContext
fun provideApplicationContext(): Context

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework

import javax.inject.Qualifier

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ApplicationContext
3 changes: 2 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import android.graphics.Color
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import java.util.*
import javax.inject.Inject

interface ColorGenerator {

@ColorInt
fun generateColor(): Int
}

class ColorGeneratorImpl : ColorGenerator {
class ColorGeneratorImpl @Inject constructor() : ColorGenerator {

override fun generateColor(): Int {
val rnd = Random()
Expand Down
19 changes: 17 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt
Original file line number Diff line number Diff line change
@@ -1,26 +1,41 @@
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(
(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<Button>(R.id.button).setOnClickListener {
//отправить результат через livedata в другой фрагмент
viewModel.generateColor()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ru.otus.daggerhomework

import dagger.Binds
import dagger.Component
import dagger.Module
import javax.inject.Singleton

@FragmentScope
@Component(dependencies = [MainActivityComponent::class],
modules = [ProducerModule::class])
interface FragmentProducerComponent {

companion object {
fun crete(
activityComponent: MainActivityComponent
) = DaggerFragmentProducerComponent.builder()
.mainActivityComponent(activityComponent)
.build()

}
fun inject(fragment: FragmentProducer)

}

@Module
interface ProducerModule {

@Binds
@FragmentScope
fun bindColorGenerator(generator: ColorGeneratorImpl): ColorGenerator
}
27 changes: 26 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/FragmentReceiver.kt
Original file line number Diff line number Diff line change
@@ -1,28 +1,53 @@
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.annotation.ColorInt
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import javax.inject.Inject
import javax.inject.Named

class FragmentReceiver : Fragment() {

@Inject
lateinit var viewModelFactory: ReceiverFactory
val viewModel: ViewModelReceiver by viewModels {viewModelFactory}

private lateinit var frame: View

override fun onAttach(context: Context) {
super.onAttach(context)
FragmentReceiverComponent
.create((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_b, container, true)
return inflater.inflate(R.layout.fragment_b, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
frame = view.findViewById(R.id.frame)
lifecycleScope.launch {
viewModel.stateFlow.collect {
populateColor(it)
}
}
}

fun populateColor(@ColorInt color: Int) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ru.otus.daggerhomework

import dagger.Component

@FragmentScope
@Component(dependencies = [ApplicationComponent::class, MainActivityComponent::class])
interface FragmentReceiverComponent {
companion object {

fun create (component: ApplicationComponent, activityComponent: MainActivityComponent) =
DaggerFragmentReceiverComponent
.builder()
.applicationComponent(component)
.mainActivityComponent(activityComponent)
.build()
}
fun inject(fragment: FragmentReceiver)
}
7 changes: 7 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/FragmentScope.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework

import javax.inject.Scope

@Scope
@Retention
annotation class FragmentScope
18 changes: 17 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
package ru.otus.daggerhomework

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import kotlinx.coroutines.flow.MutableStateFlow


class MainActivity : AppCompatActivity() {

lateinit var activityComponent: MainActivityComponent


override fun onCreate(savedInstanceState: Bundle?) {
activityComponent = DaggerMainActivityComponent.factory()
.crete(this, (this.applicationContext as App).appComponent)
activityComponent.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val manager = supportFragmentManager
val transaction: FragmentTransaction = manager.beginTransaction()
transaction.add(R.id.container_fragment, FragmentProducer()).commit()
val transaction2: FragmentTransaction = manager.beginTransaction()
transaction2.add(R.id.container_fragment2, FragmentReceiver()).commit()
}
}
40 changes: 40 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/MainActivityComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package ru.otus.daggerhomework

import android.content.Context
import dagger.BindsInstance
import dagger.Component
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.flow.MutableStateFlow
import javax.inject.Singleton

@ActivityScope
@Component(dependencies = [ApplicationComponent::class],
modules = [MainActivityModule::class])
interface MainActivityComponent {

@Component.Factory
interface Factory {
fun crete(
@ActivityContext @BindsInstance context: Context,
applicationComponent: ApplicationComponent,
): MainActivityComponent
}


fun inject(activity: MainActivity)

@ActivityContext
fun provideActivityContext(): Context

fun provideState(): MutableStateFlow<Int>
}

@Module
interface MainActivityModule {
companion object {
@Provides
@ActivityScope
fun provideState() = MutableStateFlow(0)
}
}
21 changes: 18 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelProducer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,30 @@ import android.content.Context
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import kotlinx.coroutines.flow.MutableStateFlow
import java.lang.RuntimeException
import javax.inject.Inject

class ViewModelProducer(
class ViewModelProducer constructor (
private val colorGenerator: ColorGenerator,
private val context: Context
private val context: Context,
private val state: MutableStateFlow<Int>
) : ViewModel() {

fun generateColor() {
if (context !is FragmentActivity) throw RuntimeException("Здесь нужен контекст активити")
Toast.makeText(context, "Color sent", Toast.LENGTH_LONG).show()
Toast.makeText(context, "Color sent ${colorGenerator.generateColor()}",
Toast.LENGTH_LONG).show()
state.value = colorGenerator.generateColor()
}
}
class ProducerFactory @Inject constructor(
private val colorGenerator: ColorGenerator,
@ActivityContext private val context: Context,
val state: MutableStateFlow<Int>): ViewModelProvider.Factory {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return ViewModelProducer(colorGenerator, context, state) as T
}
}
Loading