Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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.

9 changes: 9 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,9 @@
package ru.otus.daggerhomework

import java.util.UUID
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется лишний импорт тут


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
16 changes: 14 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,33 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.fragment.app.Fragment
import ru.otus.daggerhomework.di.DaggerProducerFragmentComponent
import ru.otus.daggerhomework.di.ProducerFragmentComponent
import javax.inject.Inject


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, requireActivity())
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()
}
}
}
7 changes: 5 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/ProducerViewModel.kt
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(
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().component,
requireActivity().application
)
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
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,16 @@
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 context: Context): ApplicationComponent
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь лучше добавить квалифайер для контекста и написать типо @ApplicationContext чтобы потом различать с контекстом активити.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И добавить метод getContext() чтобы научить ApplicationComponent отдавать его наружу

}
}
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,20 @@
package ru.otus.daggerhomework.di

import android.app.Activity
import android.content.Context
import dagger.BindsInstance
import dagger.Component
import kotlinx.coroutines.flow.MutableStateFlow
import ru.otus.daggerhomework.Event
import javax.inject.Named

@ActivityScope
@Component(modules = [MainActivityModule::class])
interface MainActivityComponent {
@Component.Factory
interface Factory {
fun build(@BindsInstance activity: Activity): MainActivityComponent
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А вот здесь добавить контекст от активити c квалифайером @ActivityContext

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И добавить метод getContext() чтобы научить MainActivityComponent отдавать его наружу

}

fun event(): MutableStateFlow<Event>
}
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,25 @@
package ru.otus.daggerhomework.di

import android.content.Context
import dagger.BindsInstance
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,
@BindsInstance context: Context
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И здесь уже не добавлять контекст, потому что MainActivityComponent должен его предоставлять итак.

): ProducerFragmentComponent
}

fun viewModel(): ProducerViewModel

}
29 changes: 29 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,29 @@
package ru.otus.daggerhomework.di

import android.app.Activity
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
import javax.inject.Named


@Module
class ProducerModule {

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

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

import android.content.Context
import dagger.BindsInstance
import dagger.Component
import ru.otus.daggerhomework.ReceiverViewModel

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

@Component.Factory
interface Factory {
fun build(
mainActivityComponent: MainActivityComponent,
@BindsInstance context: Context
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь тоже самое. Контекст уже не нужно передавать. Если вы все передали через апп и активити компоненты.

): ReceiverFragmentComponent
}

fun viewModel(): ReceiverViewModel
}
19 changes: 19 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,19 @@
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(
context: Context,
event: MutableStateFlow<Event?>
): ReceiverViewModel = ReceiverViewModel(context, event)
}
Loading