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
6 changes: 5 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
3 changes: 1 addition & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@
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" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Expand Down
10 changes: 9 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,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)
}
}
49 changes: 48 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt
Original file line number Diff line number Diff line change
@@ -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 {
}
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()
}
}
34 changes: 34 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ColorContainer.kt
Original file line number Diff line number Diff line change
@@ -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<Int>
}

@Singleton
class ColorContainerImpl @Inject constructor() : ColorContainer {
private val _state : MutableStateFlow<Int> = MutableStateFlow(value = 0)
val state : StateFlow<Int> = _state.asStateFlow()

override fun setColor(color: Int) {
_state.value = color
}

override fun getData() : LiveData<Int> {
return state.asLiveData()
}
}
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 @@ -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 {
Expand All @@ -11,7 +12,7 @@ interface ColorGenerator {
fun generateColor(): Int
}

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

override fun generateColor(): Int {
val rnd = Random()
Expand Down
17 changes: 16 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt
Original file line number Diff line number Diff line change
@@ -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?,
Expand All @@ -20,7 +35,7 @@ class FragmentProducer : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Button>(R.id.button).setOnClickListener {
//отправить результат через livedata в другой фрагмент
viewModel.generateColor()
}
}
}
27 changes: 24 additions & 3 deletions app/src/main/java/ru/otus/daggerhomework/FragmentReceiver.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,35 @@
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.annotation.BinderThread
import androidx.annotation.ColorInt
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import dagger.Binds
import javax.inject.Inject

class FragmentReceiver : Fragment() {
interface ColorReceiver {
fun populateColor(@ColorInt color: Int)
}

private lateinit var frame: View
class FragmentReceiver : Fragment(), ColorReceiver {

@Inject
lateinit var appContext : Context

private lateinit var viewModel : ViewModelReceiver
private lateinit var frame : View

override fun onAttach(context: Context) {
super.onAttach(context)
((context as Activity).application as App).appComponent.createFragmentReceiverComponent().inject(this)
}

override fun onCreateView(
inflater: LayoutInflater,
Expand All @@ -23,9 +42,11 @@ class FragmentReceiver : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
frame = view.findViewById(R.id.frame)
viewModel.init(this as ColorReceiver, this)
}

fun populateColor(@ColorInt color: Int) {
override fun populateColor(@ColorInt color: Int) {
frame.setBackgroundColor(color)
}

}
5 changes: 4 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ import android.os.Bundle

class MainActivity : AppCompatActivity() {

lateinit var actComponent : MainActivityComponent

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
actComponent = DaggerMainActivityComponent.factory().create(this)
}
}
}
22 changes: 22 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,22 @@
package ru.otus.daggerhomework

import android.content.Context
import dagger.Binds
import dagger.BindsInstance
import dagger.Component
import dagger.Module
import javax.inject.Scope

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

fun inject(activity : MainActivity)
}

@Module
interface MainActivityModule {
}
7 changes: 5 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelProducer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ package ru.otus.daggerhomework
import android.content.Context
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import javax.inject.Inject

class ViewModelProducer(
class ViewModelProducer @Inject constructor (
private val colorGenerator: ColorGenerator,
private val colorContainer: ColorContainer,
private val context: Context
) {

fun generateColor() {
if (context !is FragmentActivity) throw RuntimeException("Здесь нужен контекст активити")
if (context !is FragmentActivity) throw RuntimeException("Здесь нужен контекст фрагмента")
Toast.makeText(context, "Color sent", Toast.LENGTH_LONG).show()
colorContainer.setColor(colorGenerator.generateColor())
}
}
28 changes: 22 additions & 6 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
package ru.otus.daggerhomework

import androidx.lifecycle.Observer
import android.app.Application
import android.content.Context
import android.view.View
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.lifecycle.LifecycleOwner
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import javax.inject.Inject

class ViewModelReceiver(
private val context: Context
) {
class ViewModelReceiver @Inject constructor (
private val colorContainer : ColorContainer,
private val context : Context
) : Observer<Int> {
private lateinit var receiver : ColorReceiver

fun observeColors() {
if (context !is Application) throw RuntimeException("Здесь нужен контекст апликейшена")
Toast.makeText(context, "Color received", Toast.LENGTH_LONG).show()
fun init(cr : ColorReceiver, lo : LifecycleOwner) {
receiver = cr
colorContainer.getData().observe(lo, this)
}

override fun onChanged(t: Int) {
if (context !is Application) throw RuntimeException("Здесь нужен контекст приложения")
Toast.makeText(context,"Color received", Toast.LENGTH_LONG).show()
receiver.populateColor(t)
}

}