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
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package="ru.otus.daggerhomework">

<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Expand Down
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
@@ -1,5 +1,11 @@
package ru.otus.daggerhomework

import android.app.Application
import ru.otus.daggerhomework.di.ApplicationComponent
import ru.otus.daggerhomework.di.DaggerApplicationComponent

class App :Application()
class App : Application() {
val component = DaggerApplicationComponent.factory().build(this)
}

val Application.component: ApplicationComponent get() = (this as App).component

This file was deleted.

3 changes: 1 addition & 2 deletions app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ package ru.otus.daggerhomework

import android.graphics.Color
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import java.util.*
import java.util.Random

interface ColorGenerator {

Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/Event.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework

sealed class Event {
data class PopulateColor(
val color: Int
) : Event()
}
14 changes: 11 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
package ru.otus.daggerhomework

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.fragment.app.FragmentActivity
import ru.otus.daggerhomework.di.DaggerMainActivityComponent
import ru.otus.daggerhomework.di.MainActivityComponent

class MainActivity : FragmentActivity() {

lateinit var component: MainActivityComponent

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
component = DaggerMainActivityComponent.factory().build(this)
setContentView(R.layout.activity_main)
}
}
}

val FragmentActivity.component: MainActivityComponent get() = (this as MainActivity).component
14 changes: 12 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/ProducerFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,31 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.fragment.app.Fragment
import ru.otus.daggerhomework.di.DaggerProducerFragmentComponent


class ProducerFragment : Fragment() {

private lateinit var viewModel: ProducerViewModel

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_producer, container, true)

val component = DaggerProducerFragmentComponent
.factory()
.build(requireActivity().component)
viewModel = component.viewModel()

return inflater.inflate(R.layout.fragment_producer, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Button>(R.id.button).setOnClickListener {
//отправить результат через flow в другой фрагмент
viewModel.generateColor()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ package ru.otus.daggerhomework
import android.app.Activity
import android.content.Context
import android.widget.Toast
import kotlinx.coroutines.flow.MutableStateFlow

class ProducerViewModel(
private val colorGenerator: ColorGenerator,
private val context: Context
private val context: Context,
private val event: MutableStateFlow<Event?>
) {

fun generateColor() {
if (context !is Activity) throw RuntimeException("Activity context is required")
Toast.makeText(context, "Color sent", Toast.LENGTH_LONG).show()
event.value = Event.PopulateColor(color = colorGenerator.generateColor())
}
}
29 changes: 27 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/ReceiverFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,50 @@ import android.view.View
import android.view.ViewGroup
import androidx.annotation.ColorInt
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.launch
import ru.otus.daggerhomework.di.DaggerReceiverFragmentComponent

class ReceiverFragment : Fragment() {

private lateinit var frame: View

private lateinit var viewModel: ReceiverViewModel

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_receiver, container, true)
val component = DaggerReceiverFragmentComponent
.factory()
.build(
requireActivity().application.component,
requireActivity().component
)
viewModel = component.viewModel()

return inflater.inflate(R.layout.fragment_receiver, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
frame = view.findViewById(R.id.frame)
lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.event.collect { event ->
viewModel.observeColors()
when (event) {
is Event.PopulateColor -> populateColor(event.color)
}
}
}
}
}

fun populateColor(@ColorInt color: Int) {
private fun populateColor(@ColorInt color: Int) {
frame.setBackgroundColor(color)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@ package ru.otus.daggerhomework
import android.app.Application
import android.content.Context
import android.widget.Toast
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.mapNotNull

class ReceiverViewModel(
private val context: Context
private val context: Context,
event: MutableStateFlow<Event?>
) {

val event = event.mapNotNull { it }

fun observeColors() {
if (context !is Application) throw RuntimeException("Application context is required")
Toast.makeText(context, "Color received", Toast.LENGTH_LONG).show()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework.di

import javax.inject.Qualifier

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

import javax.inject.Scope

@Scope
@Retention(value = AnnotationRetention.RUNTIME)
annotation class ActivityScope()
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.otus.daggerhomework.di

import android.content.Context
import dagger.BindsInstance
import dagger.Component
import javax.inject.Singleton

@Singleton
@Component
interface ApplicationComponent {

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

@ApplicationContext
fun getContext(): Context
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.daggerhomework.di

import javax.inject.Qualifier

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

import javax.inject.Scope

@Scope
@Retention(value = AnnotationRetention.RUNTIME)
annotation class FragmentScope()
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.otus.daggerhomework.di

import android.content.Context
import dagger.BindsInstance
import dagger.Component
import kotlinx.coroutines.flow.MutableStateFlow
import ru.otus.daggerhomework.Event

@ActivityScope
@Component(modules = [MainActivityModule::class])
interface MainActivityComponent {
@Component.Factory
interface Factory {
fun build(@BindsInstance @ActivityContext context: Context): MainActivityComponent
}

fun event(): MutableStateFlow<Event>

@ActivityContext
fun getContext(): Context
}
13 changes: 13 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/di/MainActivityModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.otus.daggerhomework.di

import dagger.Module
import dagger.Provides
import kotlinx.coroutines.flow.MutableStateFlow
import ru.otus.daggerhomework.Event

@Module
class MainActivityModule {
@Provides
@ActivityScope
fun events(): MutableStateFlow<Event?> = MutableStateFlow(null)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.otus.daggerhomework.di

import dagger.Component
import ru.otus.daggerhomework.ProducerViewModel

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

@Component.Factory
interface Factory {
fun build(
mainActivityComponent: MainActivityComponent
): ProducerFragmentComponent
}

fun viewModel(): ProducerViewModel

}
28 changes: 28 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/di/ProducerModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.otus.daggerhomework.di

import android.content.Context
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.flow.MutableStateFlow
import ru.otus.daggerhomework.ColorGenerator
import ru.otus.daggerhomework.ColorGeneratorImpl
import ru.otus.daggerhomework.Event
import ru.otus.daggerhomework.ProducerViewModel


@Module
class ProducerModule {

@Provides
@FragmentScope
fun colorGenerator(): ColorGenerator = ColorGeneratorImpl()

@Provides
@FragmentScope
fun viewModel(
colorGenerator: ColorGenerator,
@ActivityContext
context: Context,
event: MutableStateFlow<Event?>
): ProducerViewModel = ProducerViewModel(colorGenerator, context, event)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.otus.daggerhomework.di

import dagger.Component
import ru.otus.daggerhomework.ReceiverViewModel

@Component(
dependencies = [MainActivityComponent::class, ApplicationComponent::class],
modules = [ReceiverModule::class]
)
@FragmentScope
interface ReceiverFragmentComponent {

@Component.Factory
interface Factory {
fun build(
applicationComponent: ApplicationComponent,
mainActivityComponent: MainActivityComponent
): ReceiverFragmentComponent
}

fun viewModel(): ReceiverViewModel
}
20 changes: 20 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/di/ReceiverModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.otus.daggerhomework.di

import android.content.Context
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.flow.MutableStateFlow
import ru.otus.daggerhomework.Event
import ru.otus.daggerhomework.ReceiverViewModel

@Module
class ReceiverModule {

@Provides
@FragmentScope
fun viewModel(
@ApplicationContext
context: Context,
event: MutableStateFlow<Event?>
): ReceiverViewModel = ReceiverViewModel(context, event)
}
Loading