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
15 changes: 10 additions & 5 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 32

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

Expand All @@ -35,9 +35,14 @@ android {
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 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.0-rc02'
implementation 'androidx.fragment:fragment-ktx:1.4.1'

implementation 'com.google.dagger:dagger:2.42'
kapt 'com.google.dagger:dagger-compiler:2.42'
}
12 changes: 7 additions & 5 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"
package="ru.otus.daggerhomework">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="otus.homework.dagger">

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

Expand Down
16 changes: 16 additions & 0 deletions app/src/main/java/otus/homework/dagger/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package otus.homework.dagger

import android.app.Application
import otus.homework.dagger.di.*

class App : Application() {

lateinit var appComponent: AppComponent

override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent
.factory()
.create(applicationContext)
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package ru.otus.daggerhomework
package otus.homework.dagger

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
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
package ru.otus.daggerhomework
package otus.homework.dagger

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 androidx.fragment.app.viewModels
import otus.homework.dagger.di.DaggerFragmentProducerComponent
import javax.inject.Inject

class FragmentProducer : Fragment() {

@Inject
lateinit var viewModelFactory: VMFactoryProducer
private val viewModel: ViewModelProducer by viewModels { viewModelFactory }

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -20,7 +28,15 @@ class FragmentProducer : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Button>(R.id.button).setOnClickListener {
//отправить результат через livedata в другой фрагмент
viewModel.generateColor()
}
}

override fun onAttach(context: Context) {
super.onAttach(context)
DaggerFragmentProducerComponent
.factory()
.create((requireActivity() as MainActivity).activityComponent)
.inject(this)
}
}
53 changes: 53 additions & 0 deletions app/src/main/java/otus/homework/dagger/FragmentReceiver.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package otus.homework.dagger

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.ColorInt
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import otus.homework.dagger.di.DaggerFragmentReceiverComponent
import javax.inject.Inject

class FragmentReceiver : Fragment() {

private lateinit var frame: View

@Inject
lateinit var viewModelFactory: VMFactoryReceiver
private val viewModel: ViewModelReceiver by viewModels { viewModelFactory }

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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
frame = view.findViewById(R.id.frame)
viewModel.observer.observe(viewLifecycleOwner) {
populateColor(it)
viewModel.observeColors()
}
}

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

override fun onAttach(context: Context) {
super.onAttach(context)
DaggerFragmentReceiverComponent
.factory()
.create(
(requireActivity().applicationContext as App).appComponent,
(requireActivity() as MainActivity).activityComponent
)
.inject(this)
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package ru.otus.daggerhomework
package otus.homework.dagger

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import otus.homework.dagger.di.ActivityComponent
import otus.homework.dagger.di.DaggerActivityComponent

class MainActivity : AppCompatActivity() {

lateinit var activityComponent: ActivityComponent

override fun onCreate(savedInstanceState: Bundle?) {
activityComponent = DaggerActivityComponent.factory().create(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
Expand Down
38 changes: 38 additions & 0 deletions app/src/main/java/otus/homework/dagger/ViewModelFactories.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package otus.homework.dagger

import android.content.Context
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import otus.homework.dagger.di.ActivityScope
import otus.homework.dagger.di.AppScope
import javax.inject.Inject

class VMFactoryProducer @Inject constructor(
private val colorGenerator: ColorGenerator,
@ActivityScope private val context: Context,
private val observer: MutableLiveData<Int>
) : ViewModelProvider.Factory {

override fun <T : ViewModel> create(modelClass: Class<T>): T {
return if (modelClass.isAssignableFrom(ViewModelProducer::class.java)) {
ViewModelProducer(context = context, colorGenerator = colorGenerator, observer = observer) as T
} else {
throw IllegalArgumentException("ViewModel Not Found")
}
}
}

class VMFactoryReceiver @Inject constructor(
@AppScope private val context: Context,
private val observer: MutableLiveData<Int>
) : ViewModelProvider.Factory {

override fun <T : ViewModel> create(modelClass: Class<T>): T {
return if (modelClass.isAssignableFrom(ViewModelReceiver::class.java)) {
ViewModelReceiver(context, observer = observer) as T
} else {
throw IllegalArgumentException("ViewModel Not Found")
}
}
}
22 changes: 22 additions & 0 deletions app/src/main/java/otus/homework/dagger/ViewModelProducer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package otus.homework.dagger

import android.content.Context
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.lang.RuntimeException
import javax.inject.Inject

class ViewModelProducer @Inject constructor (
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 colorGenerator: ColorGenerator?,
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 context: Context,
private val observer: MutableLiveData<Int>
) : ViewModel() {

fun generateColor() {
if (context !is FragmentActivity) throw RuntimeException("Здесь нужен контекст активити")
observer.value = colorGenerator?.generateColor()
Toast.makeText(context, "Color sent", Toast.LENGTH_LONG).show()
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package ru.otus.daggerhomework
package otus.homework.dagger

import android.app.Application
import android.content.Context
import android.widget.Toast
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import javax.inject.Inject

class ViewModelReceiver(
private val context: Context
) {
class ViewModelReceiver @Inject constructor(
Copy link
Contributor

Choose a reason for hiding this comment

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

Тебе здесь Inject аннотация не нужна, ты же через фабрики создаешь

private val context: Context,
val observer: MutableLiveData<Int>
) : ViewModel() {

fun observeColors() {
if (context !is Application) throw RuntimeException("Здесь нужен контекст апликейшена")
Expand Down
43 changes: 43 additions & 0 deletions app/src/main/java/otus/homework/dagger/di/ActivityComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package otus.homework.dagger.di

import android.content.Context
import androidx.lifecycle.MutableLiveData
import dagger.BindsInstance
import dagger.Component
import dagger.Module
import dagger.Provides
import javax.inject.Scope

@ActivityScope
@Component(modules = [MainActivityModule::class])
interface ActivityComponent {

@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): ActivityComponent
}

fun activityContext(): Context

val observer: MutableLiveData<Int>
Copy link
Contributor

Choose a reason for hiding this comment

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

Правильнее делать именно методы

Copy link
Contributor

Choose a reason for hiding this comment

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

Тут есть проблема, у тебя сейчас в обоих фрагментах торчит MutableLiveData, то есть ты можешь заэмитить что-то в MutableLiveData даже из RecieverViewModel, который предполагается умеет только читать. Попробуй прокинуть туда экземпляр LiveData, а в ProducerViewModel прокинь MutableLiveData

}

@Module
class MainActivityModule {

@Provides
@ActivityScope
fun provideColorEvent(): MutableLiveData<Int> {
return MutableLiveData<Int>()
}
}

@Module
class ActivityModule {
@get:Provides
Copy link
Contributor

Choose a reason for hiding this comment

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

Этот модуль можно убрать. Добавь инжект аннотацию над ColorFlow

@ActivityScope
Copy link
Contributor

Choose a reason for hiding this comment

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

Скоуп здесь не нужен

var observer = MutableLiveData<Int>()
}

@Scope
annotation class ActivityScope
21 changes: 21 additions & 0 deletions app/src/main/java/otus/homework/dagger/di/AppComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package otus.homework.dagger.di

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

@AppScope
@Component
interface AppComponent {
@AppScope
fun applicationContext(): Context

@Component.Factory
interface Factory {
fun create(@AppScope @BindsInstance appContext: Context): AppComponent
}
}

@Qualifier
annotation class AppScope
Copy link
Contributor

Choose a reason for hiding this comment

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

Мне кажется неправильно Qualifier аннотацию называть постфиксом Scope, это запутать может

Loading