├── 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 | 6 | 7 | 8 | 18 | 19 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 54 | 55 | 56 | 58 | 59 | -------------------------------------------------------------------------------- /MultiModule-With-Dynamic/.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /MultiModule-With-Dynamic/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 21 | -------------------------------------------------------------------------------- /MultiModule-With-Dynamic/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 31 | 32 | 33 | 34 | 35 | 36 | 38 | -------------------------------------------------------------------------------- /MultiModule-With-Dynamic/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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