Skip to content

Commit dcaead9

Browse files
committed
Create Dagger App Component and Main Component, first success injection
1 parent c764335 commit dcaead9

22 files changed

+282
-1
lines changed

app/build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
4+
apply plugin: 'kotlin-kapt'
45

56
android {
67
compileSdkVersion 29
@@ -27,11 +28,18 @@ android {
2728

2829
dependencies {
2930
implementation fileTree(dir: 'libs', include: ['*.jar'])
31+
32+
implementation project(":base")
33+
3034
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
3135
implementation 'androidx.appcompat:appcompat:1.1.0'
3236
implementation 'androidx.core:core-ktx:1.2.0'
3337
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
3438
testImplementation 'junit:junit:4.12'
3539
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
3640
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
41+
42+
// Dagger dependencies
43+
implementation "com.google.dagger:dagger:$daggerVersion"
44+
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
3745
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package="com.ysfcyln.daggermultimodule">
44

55
<application
6+
android:name=".MyApp"
67
android:allowBackup="true"
78
android:icon="@mipmap/ic_launcher"
89
android:label="@string/app_name"

app/src/main/java/com/ysfcyln/daggermultimodule/MainActivity.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,35 @@ package com.ysfcyln.daggermultimodule
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5+
import android.util.Log
6+
import com.ysfcyln.base.DatabaseService
7+
import com.ysfcyln.base.NetworkService
8+
import com.ysfcyln.daggermultimodule.R
9+
import com.ysfcyln.daggermultimodule.di.main.MainComponentProvider
10+
import javax.inject.Inject
511

612
class MainActivity : AppCompatActivity() {
713

14+
@Inject
15+
lateinit var databaseService: DatabaseService
16+
17+
@Inject
18+
lateinit var networkService: NetworkService
19+
20+
/**
21+
* Create component and inject
22+
*/
23+
private fun inject() {
24+
// When rotation happens component and its dependencies recreated :(
25+
val mainComponent = (application as MainComponentProvider).provideMainComponent()
26+
mainComponent.inject(this)
27+
}
28+
829
override fun onCreate(savedInstanceState: Bundle?) {
30+
inject()
931
super.onCreate(savedInstanceState)
1032
setContentView(R.layout.activity_main)
33+
Log.d("MainActivity", databaseService.toString())
34+
Log.d("MainActivity", networkService.toString())
1135
}
1236
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.ysfcyln.daggermultimodule
2+
3+
import android.app.Application
4+
import com.ysfcyln.daggermultimodule.di.DiProvider
5+
import com.ysfcyln.daggermultimodule.di.SubComponents
6+
7+
class MyApp : Application(), SubComponents {
8+
9+
override fun onCreate() {
10+
super.onCreate()
11+
DiProvider.buildDi(this)
12+
}
13+
14+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.ysfcyln.daggermultimodule.di
2+
3+
import android.app.Application
4+
import com.ysfcyln.base.BaseModule
5+
import com.ysfcyln.daggermultimodule.di.main.MainComponent
6+
import dagger.BindsInstance
7+
import dagger.Component
8+
import javax.inject.Singleton
9+
10+
@Singleton
11+
@Component(
12+
modules = [
13+
BaseModule::class,
14+
SubComponentsModule::class
15+
]
16+
)
17+
interface AppComponent {
18+
19+
/**
20+
* A {@see [Component.Factory]} that initializes necessary implementations
21+
*/
22+
@Component.Factory
23+
interface Factory {
24+
fun create(@BindsInstance application: Application): AppComponent
25+
}
26+
27+
// Save the reference of factories in the app component for creating sub components
28+
fun mainComponent() : MainComponent.Factory
29+
30+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.ysfcyln.daggermultimodule.di
2+
3+
import android.app.Application
4+
5+
object DiProvider {
6+
private lateinit var appComponent: AppComponent
7+
8+
@JvmStatic
9+
fun appComponent() = appComponent
10+
11+
fun buildDi(application: Application) {
12+
appComponent = DaggerAppComponent.factory().create(application)
13+
}
14+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.ysfcyln.daggermultimodule.di
2+
3+
import com.ysfcyln.daggermultimodule.di.main.MainComponent
4+
import com.ysfcyln.daggermultimodule.di.main.MainComponentProvider
5+
6+
interface SubComponents: MainComponentProvider {
7+
8+
override fun provideMainComponent(): MainComponent {
9+
return DiProvider.appComponent().mainComponent().create()
10+
}
11+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.ysfcyln.daggermultimodule.di
2+
3+
import com.ysfcyln.daggermultimodule.di.main.MainComponent
4+
import dagger.Module
5+
6+
/**
7+
* Associate SubComponents with AppComponent
8+
*/
9+
@Module(
10+
subcomponents = [
11+
MainComponent::class
12+
]
13+
)
14+
class SubComponentsModule {
15+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ysfcyln.daggermultimodule.di.main
2+
3+
import com.ysfcyln.daggermultimodule.MainActivity
4+
import dagger.Subcomponent
5+
6+
@Subcomponent(
7+
modules = [
8+
// Bounded main activity necessary modules comes here
9+
]
10+
)
11+
interface MainComponent {
12+
13+
@Subcomponent.Factory
14+
interface Factory {
15+
fun create() : MainComponent
16+
}
17+
18+
fun inject(mainActivity: MainActivity) // Add main activity to Dagger graph
19+
20+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.ysfcyln.daggermultimodule.di.main
2+
3+
interface MainComponentProvider {
4+
fun provideMainComponent(): MainComponent
5+
}

0 commit comments

Comments
 (0)