├── MultiModule-With-Dynamic
├── .gitignore
├── .idea
│ ├── codeStyles
│ │ ├── Project.xml
│ │ └── codeStyleConfig.xml
│ ├── dbnavigator.xml
│ ├── gradle.xml
│ ├── misc.xml
│ └── runConfigurations.xml
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── multimodule
│ │ │ └── ExampleInstrumentedTest.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── multimodule
│ │ │ │ ├── Application.kt
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ └── ic_launcher_background.xml
│ │ │ ├── layout
│ │ │ └── activity_main.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── kgmyshin
│ │ └── multimodule
│ │ └── ExampleUnitTest.kt
├── build.gradle
├── features
│ ├── common
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ │ ├── androidTest
│ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── common
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── kgmyshin
│ │ │ │ │ └── common
│ │ │ │ │ └── di
│ │ │ │ │ ├── HasDispatchingInjector.kt
│ │ │ │ │ └── ModuleInjector.kt
│ │ │ └── res
│ │ │ │ └── values
│ │ │ │ └── strings.xml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── common
│ │ │ └── ExampleUnitTest.java
│ ├── counter
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ │ ├── androidTest
│ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── counter
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── kgmyshin
│ │ │ │ │ └── counter
│ │ │ │ │ ├── Counter.kt
│ │ │ │ │ ├── CounterActivity.kt
│ │ │ │ │ ├── CounterComponent.kt
│ │ │ │ │ ├── CounterFragment.kt
│ │ │ │ │ ├── CounterFragmentModule.kt
│ │ │ │ │ ├── CounterImpl.kt
│ │ │ │ │ ├── CounterInjector.kt
│ │ │ │ │ └── CounterModule.kt
│ │ │ └── res
│ │ │ │ ├── layout
│ │ │ │ ├── activity_counter.xml
│ │ │ │ └── fragment_counter.xml
│ │ │ │ └── values
│ │ │ │ └── strings.xml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── counter
│ │ │ └── ExampleUnitTest.java
│ └── greeting
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── greeting
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── greeting
│ │ │ │ ├── Greeter.kt
│ │ │ │ ├── GreeterImpl.kt
│ │ │ │ ├── GreetingActivity.kt
│ │ │ │ ├── GreetingComponent.kt
│ │ │ │ ├── GreetingFragment.kt
│ │ │ │ ├── GreetingFragmentModule.kt
│ │ │ │ ├── GreetingInjector.kt
│ │ │ │ ├── GreetingModule.kt
│ │ │ │ └── dagger
│ │ │ │ └── AndroidGreetingInjection.kt
│ │ └── res
│ │ │ ├── layout
│ │ │ ├── activity_greeter.xml
│ │ │ └── fragment_greeter.xml
│ │ │ └── values
│ │ │ └── strings.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── kgmyshin
│ │ └── greeting
│ │ └── ExampleUnitTest.java
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
├── MultiModule
├── .gitignore
├── .idea
│ ├── codeStyles
│ │ ├── Project.xml
│ │ └── codeStyleConfig.xml
│ ├── dbnavigator.xml
│ ├── gradle.xml
│ ├── misc.xml
│ └── runConfigurations.xml
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── multimodule
│ │ │ └── ExampleInstrumentedTest.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── multimodule
│ │ │ │ ├── Application.kt
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ └── ic_launcher_background.xml
│ │ │ ├── layout
│ │ │ └── activity_main.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── kgmyshin
│ │ └── multimodule
│ │ └── ExampleUnitTest.kt
├── build.gradle
├── features
│ ├── common
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ │ ├── androidTest
│ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── common
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── kgmyshin
│ │ │ │ │ └── common
│ │ │ │ │ └── di
│ │ │ │ │ ├── HasDispatchingInjector.kt
│ │ │ │ │ └── ModuleInjector.kt
│ │ │ └── res
│ │ │ │ └── values
│ │ │ │ └── strings.xml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── common
│ │ │ └── ExampleUnitTest.java
│ ├── counter
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ │ ├── androidTest
│ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── counter
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── kgmyshin
│ │ │ │ │ └── counter
│ │ │ │ │ ├── Counter.kt
│ │ │ │ │ ├── CounterActivity.kt
│ │ │ │ │ ├── CounterComponent.kt
│ │ │ │ │ ├── CounterFragment.kt
│ │ │ │ │ ├── CounterFragmentModule.kt
│ │ │ │ │ ├── CounterImpl.kt
│ │ │ │ │ ├── CounterInjector.kt
│ │ │ │ │ └── CounterModule.kt
│ │ │ └── res
│ │ │ │ ├── layout
│ │ │ │ ├── activity_counter.xml
│ │ │ │ └── fragment_counter.xml
│ │ │ │ └── values
│ │ │ │ └── strings.xml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── counter
│ │ │ └── ExampleUnitTest.java
│ └── greeting
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── greeting
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── kgmyshin
│ │ │ │ └── greeting
│ │ │ │ ├── Greeter.kt
│ │ │ │ ├── GreeterImpl.kt
│ │ │ │ ├── GreetingActivity.kt
│ │ │ │ ├── GreetingComponent.kt
│ │ │ │ ├── GreetingFragment.kt
│ │ │ │ ├── GreetingFragmentModule.kt
│ │ │ │ ├── GreetingInjector.kt
│ │ │ │ └── GreetingModule.kt
│ │ └── res
│ │ │ ├── layout
│ │ │ ├── activity_greeter.xml
│ │ │ └── fragment_greeter.xml
│ │ │ └── values
│ │ │ └── strings.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── kgmyshin
│ │ └── greeting
│ │ └── ExampleUnitTest.java
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
└── SingleModule
├── .gitignore
├── .idea
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── dbnavigator.xml
├── gradle.xml
├── misc.xml
└── runConfigurations.xml
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── kgmyshin
│ │ └── myapplication
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── kgmyshin
│ │ │ └── myapplication
│ │ │ ├── AppComponent.kt
│ │ │ ├── AppModule.kt
│ │ │ ├── Application.kt
│ │ │ ├── MainActivity.kt
│ │ │ ├── MainFragment.kt
│ │ │ ├── MainFragmentModule.kt
│ │ │ ├── MessageProvider.kt
│ │ │ └── MessageProviderImpl.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ └── ic_launcher_background.xml
│ │ ├── layout
│ │ ├── activity_main.xml
│ │ └── fragment_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── kgmyshin
│ └── myapplication
│ └── ExampleUnitTest.kt
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/MultiModule-With-Dynamic/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches/build_file_checksums.ser
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | .DS_Store
9 | /build
10 | /captures
11 | .externalNativeBuild
12 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
20 |
21 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'kotlin-android'
3 | apply plugin: 'kotlin-android-extensions'
4 | apply plugin: 'kotlin-kapt'
5 |
6 | android {
7 | compileSdkVersion 28
8 | defaultConfig {
9 | applicationId "com.kgmyshin.multimodule"
10 | minSdkVersion 28
11 | targetSdkVersion 28
12 | versionCode 1
13 | versionName "1.0"
14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
15 | }
16 | buildTypes {
17 | release {
18 | minifyEnabled false
19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 | }
21 | }
22 | dataBinding {
23 | enabled = true
24 | }
25 | dynamicFeatures = [':greeting']
26 | }
27 |
28 | dependencies {
29 | implementation fileTree(dir: 'libs', include: ['*.jar'])
30 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
31 | implementation 'com.android.support:appcompat-v7:28.0.0'
32 | implementation 'com.android.support.constraint:constraint-layout:1.1.3'
33 |
34 | implementation 'com.google.dagger:dagger:2.20'
35 | kapt 'com.google.dagger:dagger-compiler:2.20'
36 | implementation 'com.google.dagger:dagger-android:2.20'
37 | implementation 'com.google.dagger:dagger-android-support:2.20'
38 | kapt 'com.google.dagger:dagger-android-processor:2.20'
39 |
40 | implementation project(':counter')
41 | implementation project(':common')
42 |
43 | testImplementation 'junit:junit:4.12'
44 | androidTestImplementation 'com.android.support.test:runner:1.0.2'
45 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
46 | }
47 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/src/androidTest/java/com/kgmyshin/multimodule/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.kgmyshin.multimodule
2 |
3 | import android.support.test.InstrumentationRegistry
4 | import android.support.test.runner.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getTargetContext()
22 | assertEquals("com.kgmyshin.multimodule", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/src/main/java/com/kgmyshin/multimodule/Application.kt:
--------------------------------------------------------------------------------
1 | package com.kgmyshin.multimodule
2 |
3 | import android.support.v4.app.Fragment
4 | import com.kgmyshin.common.di.HasDispatchingInjector
5 | import com.kgmyshin.common.di.ModuleInjector
6 | import com.kgmyshin.counter.CounterComponent
7 | import com.kgmyshin.counter.CounterInjector
8 | import com.kgmyshin.counter.DaggerCounterComponent
9 | import dagger.android.AndroidInjector
10 | import dagger.android.support.HasSupportFragmentInjector
11 |
12 | class Application : android.app.Application(), HasSupportFragmentInjector {
13 |
14 | private val moduleFragmentInjector = ModuleInjector()
15 | private lateinit var counterComponent: CounterComponent
16 |
17 | override fun supportFragmentInjector(): AndroidInjector =
18 | moduleFragmentInjector
19 |
20 | override fun onCreate() {
21 | super.onCreate()
22 | val counterInjector = CounterInjector()
23 | counterComponent = DaggerCounterComponent.create()
24 | counterComponent.inject(counterInjector)
25 |
26 | moduleFragmentInjector.addInjector(counterInjector)
27 | }
28 |
29 | fun counterComponent() = counterComponent
30 |
31 | fun getFragmentInjectors() = moduleFragmentInjector.injectors()
32 |
33 | fun addFragmentInjector(injector: HasDispatchingInjector) {
34 | moduleFragmentInjector.addInjector(injector)
35 | }
36 |
37 | fun removeFragmentInjector(injector: HasDispatchingInjector) {
38 | moduleFragmentInjector.removeInjector(injector)
39 | }
40 | }
--------------------------------------------------------------------------------
/MultiModule-With-Dynamic/app/src/main/java/com/kgmyshin/multimodule/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.kgmyshin.multimodule
2 |
3 | import android.content.Intent
4 | import android.os.Bundle
5 | import android.support.v7.app.AppCompatActivity
6 | import android.widget.Button
7 | import com.kgmyshin.counter.CounterActivity
8 |
9 | class MainActivity : AppCompatActivity() {
10 |
11 | override fun onCreate(savedInstanceState: Bundle?) {
12 | super.onCreate(savedInstanceState)
13 | setContentView(R.layout.activity_main)
14 | findViewById