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
4 changes: 2 additions & 2 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 34

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

Expand Down
4 changes: 3 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
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
17 changes: 16 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,20 @@ package ru.otus.daggerhomework

import android.app.Application

class App :Application() {
class App : Application() {
override fun onCreate() {
super.onCreate()
initializeDI()
}

fun getApplicationComponent(): ApplicationComponent = appComponent

private fun initializeDI() {
appComponent = DaggerApplicationComponent.factory()
.create(this)
}

companion object {
private lateinit var appComponent: ApplicationComponent
}
}
21 changes: 21 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt
Original file line number Diff line number Diff line change
@@ -1,4 +1,25 @@
package ru.otus.daggerhomework

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

@Qualifier
annotation class ContextApplication

@Singleton
@Component()
interface ApplicationComponent {

@Component.Factory
interface Factory {
fun create(
@BindsInstance @ContextApplication context: Context,
): ApplicationComponent
}

@ContextApplication
fun provideApplicationContext(): Context
}
4 changes: 2 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ package ru.otus.daggerhomework

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

import javax.inject.Inject

interface IObserver<T> {
fun notify(data: T)
}

interface IColorObservable {
fun add(observer: IObserver<Int>)

fun remove(observer: IObserver<Int>)

fun notify(data: Int)
}

class ColorObservableImpl @Inject constructor() : IColorObservable {
private val observers = mutableListOf<IObserver<Int>>()

override fun add(observer: IObserver<Int>) {
observers.add(observer)
}

override fun remove(observer: IObserver<Int>) {
observers.remove(observer)
}

override fun notify(data: Int) {
observers.forEach { it.notify(data) }
}
}
6 changes: 6 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/FeatureScope.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.otus.daggerhomework

import javax.inject.Scope

@Scope
annotation class FeatureScope
19 changes: 18 additions & 1 deletion app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,38 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import javax.inject.Inject

class FragmentProducer : Fragment() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

private lateinit var viewModelProducer: ViewModelProducer

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_a, container, true)
ProducerComponent
.getProducerComponent(
(requireActivity() as MainActivity).getMainActivityComponent(),
)
.inject(this)

return inflater.inflate(R.layout.fragment_a, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModelProducer = ViewModelProvider(this, viewModelFactory)
.get(ViewModelProducer::class.java)

view.findViewById<Button>(R.id.button).setOnClickListener {
//отправить результат через livedata в другой фрагмент
viewModelProducer.generateColor()
}
}
}
23 changes: 21 additions & 2 deletions app/src/main/java/ru/otus/daggerhomework/FragmentReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,17 @@ 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.ViewModelProvider
import javax.inject.Inject

class FragmentReceiver : Fragment() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory


private lateinit var viewModelReceiver: ViewModelReceiver

private lateinit var frame: View

Expand All @@ -17,12 +23,25 @@ class FragmentReceiver : Fragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_b, container, true)
ReceiverComponent
.getReceiverComponent(
(requireActivity() as MainActivity).getMainActivityComponent()
)
.inject(this)

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)
viewModelReceiver = ViewModelProvider(this, viewModelFactory)
.get(ViewModelReceiver::class.java)

viewModelReceiver.state.observe(viewLifecycleOwner) {
populateColor(it)
}
}

fun populateColor(@ColorInt color: Int) {
Expand Down
23 changes: 23 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,35 @@
package ru.otus.daggerhomework

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import javax.inject.Inject

class MainActivity : AppCompatActivity() {
@Inject
@ContextApplication
lateinit var _applicationContext: Context
Copy link
Contributor

Choose a reason for hiding this comment

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

Его можно не инжектить. У активити есть метод getApplication


@Inject
@ContextActivity
lateinit var _activityContext: Context

private lateinit var mainActivityComponent: MainActivityComponent

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

mainActivityComponent = DaggerMainActivityComponent
.factory()
.create(
applicationComponent = (application as App)
.getApplicationComponent(),
context = this,
)
mainActivityComponent.inject(this)
}

fun getMainActivityComponent(): MainActivityComponent =
mainActivityComponent
}
48 changes: 48 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,48 @@
package ru.otus.daggerhomework

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

@Scope
annotation class ActivityScope

@Qualifier
annotation class ContextActivity

@ActivityScope
@Component(
modules = [MainActivityModule::class],
dependencies = [ApplicationComponent::class],
)
interface MainActivityComponent {

@Component.Factory
interface Factory {
fun create(
applicationComponent: ApplicationComponent,
@BindsInstance @ContextActivity context: Context,
): MainActivityComponent
}

@ContextApplication
fun provideApplicationContext(): Context

@ContextActivity
fun provideActivityContext(): Context

fun provideObservable(): IColorObservable

fun inject(mainActivity: MainActivity)
}

@Module
interface MainActivityModule {
@ActivityScope
@Binds
fun bindObservable(impl: ColorObservableImpl): IColorObservable
}
33 changes: 33 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ProducerComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ru.otus.daggerhomework

import androidx.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Component
import dagger.Module

@FeatureScope
@Component(
modules = [ProducerModule::class],
dependencies = [MainActivityComponent::class],
)
interface ProducerComponent {
companion object {
fun getProducerComponent(cmpt: MainActivityComponent): ProducerComponent {
return DaggerProducerComponent
.builder()
.mainActivityComponent(cmpt)
.build()
}
}

fun inject(fragmentProducer: FragmentProducer)
}

@Module
interface ProducerModule {
@Binds
fun bindFactory(factory: ViewModelProducerFactory): ViewModelProvider.Factory

@Binds
fun bindColorGenerator(impl: ColorGeneratorImpl): ColorGenerator
}
30 changes: 30 additions & 0 deletions app/src/main/java/ru/otus/daggerhomework/ReceiverComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.otus.daggerhomework

import androidx.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Component
import dagger.Module

@FeatureScope
@Component(
modules = [ReceiverModule::class],
dependencies = [MainActivityComponent::class],
)
interface ReceiverComponent {
companion object {
fun getReceiverComponent(cmpt: MainActivityComponent): ReceiverComponent {
return DaggerReceiverComponent
.builder()
.mainActivityComponent(cmpt)
.build()
}
}

fun inject(fragmentReceiver: FragmentReceiver)
}

@Module
interface ReceiverModule {
@Binds
fun bindFactory(factory: ViewModelReceiverFactory): ViewModelProvider.Factory
}
Loading