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
25 changes: 19 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
### Реализуйте ApplicationComponent
Это корень нашего дерева компонентов. Инициализируется в классе App, прокидывает в граф через Component Dependencies/Subcomponents ниже по графу следующие сущности:
- Context(Application) до FragmentProducerComponent и FragmentReceiverComponent.
Проброс Context в граф реализуйте через BindsInstance + ComponentFactory

Это корень нашего дерева компонентов. Инициализируется в классе App, прокидывает в граф через
Component Dependencies/Subcomponents ниже по графу следующие сущности:

- Context(Application) до FragmentProducerComponent и FragmentReceiverComponent.
Проброс Context в граф реализуйте через BindsInstance + ComponentFactory

### Реализуйте MainActivityComponent

Инициализируется в MainActivity. Прокидывает следующие сущности:

- Context(Activity). Проброс в граф реализуйте через BindsInstance + ComponentFactory
- Ваша реализация обсервера(Coroutine Channel/StateFlow/Subject либо другую реализацию обсервера). Он понадобится нам чтобы отправлять евенты из одного фрагмента и принимать их в другом, в обоих фрагментах должен быть один и тот же инстанс обсервера.
- Ваша реализация обсервера(Coroutine Channel/StateFlow/Subject либо другую реализацию обсервера).
Он понадобится нам чтобы отправлять евенты из одного фрагмента и принимать их в другом, в обоих
фрагментах должен быть один и тот же инстанс обсервера.

### Реализуйте FragmentReceiverComponent/FragmentProducerComponent
Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую реализацию обсервера которая уже есть в графе. ViewModelProducer должна отправлять эвенты, ViewModelReceiver должна получать эвенты. Обсерверы должны прокидываться в конструкторы вьюмоделей и существовать в единственном экземпляре в Activity.

Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую
реализацию обсервера которая уже есть в графе. ViewModelProducer должна отправлять эвенты,
ViewModelReceiver должна получать эвенты. Обсерверы должны прокидываться в конструкторы вьюмоделей и
существовать в единственном экземпляре в Activity.
Флоу отправки эвента выглядит следующим образом:
Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер -> евент ловится на стороне ViewModelReceiver -> евент передается FragmentReceiver и вызывается функция ru.otus.daggerhomework.FragmentReceiver#populateColor
Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер ->
евент ловится на стороне ViewModelReceiver -> евент передается FragmentReceiver и вызывается функция
ru.otus.daggerhomework.FragmentReceiver#populateColor
24 changes: 16 additions & 8 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ plugins {
}

android {
compileSdkVersion 31
compileSdkVersion 33

defaultConfig {
applicationId "ru.otus.daggerhomework"
minSdkVersion 23
targetSdkVersion 31
targetSdkVersion 33
versionCode 1
versionName "1.0"

Expand All @@ -30,14 +30,22 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
namespace 'ru.otus.daggerhomework'
}

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.constraintlayout:constraintlayout:2.1.0'
implementation 'com.google.dagger:dagger:2.42'
kapt 'com.google.dagger:dagger-compiler:2.42'
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.dagger:dagger:2.44.2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
kapt 'com.google.dagger:dagger-compiler:2.44.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
implementation 'androidx.activity:activity-ktx:1.6.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
implementation 'androidx.fragment:fragment-ktx:1.5.5'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
}
7 changes: 4 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.otus.daggerhomework">
xmlns:android="http://schemas.android.com/apk/res/android">

<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
9 changes: 9 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/App.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
package ru.otus.daggerhomework

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

class App :Application() {

lateinit var appComponent: ApplicationComponent

override fun onCreate() {
super.onCreate()
appComponent = DaggerApplicationComponent.factory().create(this)
}
}

This file was deleted.

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
26 changes: 0 additions & 26 deletions app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt

This file was deleted.

31 changes: 0 additions & 31 deletions app/src/main/java/ru/otus/daggerhomework/FragmentReceiver.kt

This file was deleted.

5 changes: 5 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@ package ru.otus.daggerhomework

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import ru.otus.daggerhomework.components.*

class MainActivity : AppCompatActivity() {

lateinit var mainActivityComponent: MainActivityComponent
override fun onCreate(savedInstanceState: Bundle?) {
mainActivityComponent = DaggerMainActivityComponent.factory().create(this,
(application as App).appComponent, DataModule()
)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
Expand Down
16 changes: 0 additions & 16 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelProducer.kt

This file was deleted.

15 changes: 0 additions & 15 deletions app/src/main/java/ru/otus/daggerhomework/ViewModelReceiver.kt

This file was deleted.

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

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

//@Component(modules = [DataModule::class])
@Component
@Singleton
interface ApplicationComponent {

@Component.Factory
interface Factory {
fun create(
@BindsInstance
@Named("ApplicationContext")
appContext: Context
//dataModule: DataModule,
): ApplicationComponent
}

@Named("ApplicationContext")
fun provideContext(): Context
/*fun provideColorFlow(): MutableSharedFlow<Int>
fun provideStateFlow(): MutableStateFlow<State>*/
}


/*@Module
@Named("DataModule")
Copy link
Contributor

Choose a reason for hiding this comment

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

А это зачем?)

class DataModule {
Copy link
Contributor

Choose a reason for hiding this comment

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

Подключи его в активитикомпонент

private val colorFlow = MutableSharedFlow<Int>(replay = 1)

private val stateFlow = MutableStateFlow<State>(Empty)

@Provides
@Singleton
fun provideColorFlow(): MutableSharedFlow<Int> = colorFlow

@Provides
@Singleton
fun provideStateFlow(): MutableStateFlow<State> = stateFlow
}*/
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.otus.daggerhomework.components

import dagger.Binds
import dagger.BindsInstance
import dagger.Module
import dagger.Subcomponent
import ru.otus.daggerhomework.ColorGenerator
import ru.otus.daggerhomework.ColorGeneratorImpl
import ru.otus.daggerhomework.producer.FragmentProducer
import ru.otus.daggerhomework.producer.ViewModelFactory
import javax.inject.Singleton

@Subcomponent(modules = [ColorModule::class])
interface FragmentProducerComponent {
fun inject(fragmentProducer: FragmentProducer)
fun provideViewModelFactory(): ViewModelFactory

@Subcomponent.Factory
interface Factory{
fun create(): FragmentProducerComponent
}
}

@Module
interface ColorModule{
@Binds
fun bindColorGenerator(cgImpl: ColorGeneratorImpl): ColorGenerator
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ru.otus.daggerhomework.components

import dagger.BindsInstance
import dagger.Subcomponent
import ru.otus.daggerhomework.receiver.FragmentReceiver
import ru.otus.daggerhomework.receiver.ViewModelFactory
import javax.inject.Singleton

@Subcomponent
interface FragmentReceiverComponent {
fun inject(fragmentReceiver: FragmentReceiver)
fun provideViewModelFactory(): ViewModelFactory

@Subcomponent.Factory
interface Factory{
fun create(): FragmentReceiverComponent
}
}
Loading