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
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
implementation 'com.google.dagger:dagger:2.42'
kapt 'com.google.dagger:dagger-compiler:2.42'

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
}
8 changes: 5 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.otus.daggerhomework">

<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DaggerHomework">
<activity android:name=".MainActivity">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
13 changes: 12 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/App.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
package ru.otus.daggerhomework

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

class App :Application() {
class App : Application() {
lateinit var appComponent: ApplicationComponent

override fun onCreate() {
super.onCreate()

appComponent = DaggerApplicationComponent
.factory()
.create(this)
}
}

This file was deleted.

13 changes: 10 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
package ru.otus.daggerhomework

import android.graphics.Color
import android.util.Log
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()
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
val color = Color.argb(
255,
rnd.nextInt(256),
rnd.nextInt(256),
rnd.nextInt(256)
)
return color
}
}
39 changes: 37 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,56 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import ru.otus.daggerhomework.di.components.DaggerFragmentProducerComponent
import ru.otus.daggerhomework.di.components.FragmentProducerComponent
import javax.inject.Inject
import javax.inject.Provider

class FragmentProducer : Fragment() {

@Inject
lateinit var dataKeeper: Provider<IDataKeeper>

@Inject
lateinit var colorGenerator: Provider<ColorGenerator>

lateinit var viewModelProducer: ViewModelProducer

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val activityComponent = (requireActivity() as MainActivity).activityComponent
val fragmentProducerComponent = DaggerFragmentProducerComponent
.builder()
.activityComponent(activityComponent)
.build()

fragmentProducerComponent.inject(this)
}

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

viewModelProducer = ViewModelProducer(
colorGenerator.get(),
requireContext(),
dataKeeper.get()
)

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 в другой фрагмент
lifecycleScope.launch {
//отправить результат через livedata в другой фрагмент
viewModelProducer.generateColor()
}
}
}
}
40 changes: 37 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/FragmentReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,62 @@ 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.lifecycle.lifecycleScope
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import ru.otus.daggerhomework.di.components.DaggerFragmentReceiverComponent
import javax.inject.Inject
import javax.inject.Provider


class FragmentReceiver : Fragment() {
Copy link
Contributor

Choose a reason for hiding this comment

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

Аналогичные замечания


@Inject
lateinit var dataKeeper: Provider<IDataKeeper>

private lateinit var frame: View
private lateinit var viewModelReceiver: ViewModelReceiver

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val activityComponent = (requireActivity() as MainActivity).activityComponent
val fragmentReceiverComponent = DaggerFragmentReceiverComponent
.builder()
.activityComponent(activityComponent)
.build()
fragmentReceiverComponent.inject(this)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_b, container, true)
viewModelReceiver = ViewModelReceiver(
requireContext().applicationContext,
dataKeeper.get()
)
lifecycleScope.launch {
viewModelReceiver.observeColors()
}

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 {
viewModelReceiver.colorData.collect { colorCode ->
populateColor(colorCode)
}
}
}

fun populateColor(@ColorInt color: Int) {
private fun populateColor(@ColorInt color: Int) {
frame.setBackgroundColor(color)
}
}
28 changes: 28 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/IDataKeeper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.otus.daggerhomework

import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import ru.otus.daggerhomework.di.ActivityScope
import javax.inject.Inject

interface IDataKeeper {

suspend fun saveData(newData: Int)

fun getFlow(): StateFlow<Int>
}

class DataKeeper @Inject constructor() : IDataKeeper {

private val _colorData = MutableStateFlow<Int>(0)
private val colorData: StateFlow<Int> = _colorData

override suspend fun saveData(newData: Int) {
_colorData.emit(newData)
}

override fun getFlow(): StateFlow<Int> {
return colorData
}

}
28 changes: 26 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,36 @@
package ru.otus.daggerhomework

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentContainerView
import ru.otus.daggerhomework.di.components.ActivityComponent
import ru.otus.daggerhomework.di.components.DaggerActivityComponent
import javax.inject.Inject
import javax.inject.Provider

class MainActivity : AppCompatActivity() {

lateinit var activityComponent: ActivityComponent

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val appComponent = (application as App).appComponent
activityComponent = DaggerActivityComponent
.factory()
.create(
appComponent,
this
)

setContentView(R.layout.activity_main)

supportFragmentManager
.beginTransaction()
.add(R.id.fragmentContainer, FragmentReceiver())
.add(R.id.fragmentContainer, FragmentProducer())
.commit()
}
}
}

9 changes: 6 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelProducer.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package ru.otus.daggerhomework

import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.fragment.app.FragmentActivity

class ViewModelProducer(
private val colorGenerator: ColorGenerator,
private val context: Context
private val context: Context,
private val dataKeeper: IDataKeeper
) {

fun generateColor() {
suspend fun generateColor() {
if (context !is FragmentActivity) throw RuntimeException("Здесь нужен контекст активити")
Toast.makeText(context, "Color sent", Toast.LENGTH_LONG).show()

dataKeeper.saveData(colorGenerator.generateColor())
}
}
18 changes: 15 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,25 @@ 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.StateFlow
import kotlinx.coroutines.flow.collect

class ViewModelReceiver(
private val context: Context
private val context: Context,
dataKeeper: IDataKeeper
) {
private val _colorData = MutableStateFlow<Int>(0)
val colorData: StateFlow<Int> = _colorData

fun observeColors() {
private val colorFlow = dataKeeper.getFlow()

suspend fun observeColors() {
if (context !is Application) throw RuntimeException("Здесь нужен контекст апликейшена")
Toast.makeText(context, "Color received", Toast.LENGTH_LONG).show()
colorFlow.collect { colorCode ->
Toast.makeText(context, "Color received", Toast.LENGTH_LONG).show()

_colorData.emit(colorCode)
}
}
}
9 changes: 9 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/di/Qualifiers.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.otus.daggerhomework.di

import javax.inject.Qualifier

@Qualifier
annotation class ApplicationContext

@Qualifier
annotation class ActivityContext
12 changes: 12 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/di/Scopes.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.otus.daggerhomework.di

import javax.inject.Scope

@Scope
annotation class ApplicationScope

@Scope
annotation class ActivityScope

@Scope
annotation class FragmentScope
Loading