├── .gitignore ├── .idea └── .gitignore ├── README.md ├── android.gradle ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── dino │ │ └── multimoduleactivity │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.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-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── dino │ └── multimoduleactivity │ └── ExampleUnitTest.kt ├── build.gradle ├── common ├── ui │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── dino │ │ │ └── ui │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── dino │ │ │ └── ui │ │ │ └── BaseActivity.kt │ │ └── test │ │ └── java │ │ └── com │ │ └── dino │ │ └── ui │ │ └── ExampleUnitTest.kt └── util │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── dino │ │ └── util │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── dino │ │ └── util │ │ ├── ActivityResultCallerExtension.kt │ │ └── ContextExtension.kt │ └── test │ └── java │ └── com │ └── dino │ └── util │ └── ExampleUnitTest.kt ├── feature ├── feature.gradle ├── home │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── dino │ │ │ └── home │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── dino │ │ │ │ └── home │ │ │ │ └── HomeActivity.kt │ │ └── res │ │ │ └── layout │ │ │ └── activity_home.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── dino │ │ └── home │ │ └── ExampleUnitTest.kt ├── input │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── dino │ │ │ └── input │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── dino │ │ │ │ └── input │ │ │ │ └── InputActivity.kt │ │ └── res │ │ │ └── layout │ │ │ └── activity_input.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── dino │ │ └── input │ │ └── ExampleUnitTest.kt └── splash │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── dino │ │ └── splash │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── dino │ │ │ └── splash │ │ │ └── SplashActivity.kt │ └── res │ │ └── layout │ │ └── activity_splash.xml │ └── test │ └── java │ └── com │ └── dino │ └── splash │ └── ExampleUnitTest.kt ├── gradle.properties ├── gradle └── wrapper │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | 17 | 18 | # Created by https://www.toptal.com/developers/gitignore/api/kotlin,android,androidstudio 19 | # Edit at https://www.toptal.com/developers/gitignore?templates=kotlin,android,androidstudio 20 | 21 | ### Android ### 22 | # Built application files 23 | *.apk 24 | *.aar 25 | *.ap_ 26 | *.aab 27 | 28 | # Files for the ART/Dalvik VM 29 | *.dex 30 | 31 | # Java class files 32 | *.class 33 | 34 | # Generated files 35 | bin/ 36 | gen/ 37 | out/ 38 | # Uncomment the following line in case you need and you don't have the release build type files in your app 39 | # release/ 40 | 41 | # Gradle files 42 | .gradle/ 43 | build/ 44 | 45 | # Local configuration file (sdk path, etc) 46 | local.properties 47 | 48 | # Proguard folder generated by Eclipse 49 | proguard/ 50 | 51 | # Log Files 52 | *.log 53 | 54 | # Android Studio Navigation editor temp files 55 | .navigation/ 56 | 57 | # Android Studio captures folder 58 | captures/ 59 | 60 | # IntelliJ 61 | *.iml 62 | .idea/workspace.xml 63 | .idea/tasks.xml 64 | .idea/gradle.xml 65 | .idea/assetWizardSettings.xml 66 | .idea/dictionaries 67 | .idea/libraries 68 | # Android Studio 3 in .gitignore file. 69 | .idea/caches 70 | .idea/modules.xml 71 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 72 | .idea/navEditor.xml 73 | 74 | # Keystore files 75 | # Uncomment the following lines if you do not want to check your keystore files in. 76 | #*.jks 77 | #*.keystore 78 | 79 | # External native build folder generated in Android Studio 2.2 and later 80 | .externalNativeBuild 81 | .cxx/ 82 | 83 | # Google Services (e.g. APIs or Firebase) 84 | # google-services.json 85 | 86 | # Freeline 87 | freeline.py 88 | freeline/ 89 | freeline_project_description.json 90 | 91 | # fastlane 92 | fastlane/report.xml 93 | fastlane/Preview.html 94 | fastlane/screenshots 95 | fastlane/test_output 96 | fastlane/readme.md 97 | 98 | # Version control 99 | vcs.xml 100 | 101 | # lint 102 | lint/intermediates/ 103 | lint/generated/ 104 | lint/outputs/ 105 | lint/tmp/ 106 | # lint/reports/ 107 | 108 | ### Android Patch ### 109 | gen-external-apklibs 110 | output.json 111 | 112 | # Replacement of .externalNativeBuild directories introduced 113 | # with Android Studio 3.5. 114 | 115 | ### Kotlin ### 116 | # Compiled class file 117 | 118 | # Log file 119 | 120 | # BlueJ files 121 | *.ctxt 122 | 123 | # Mobile Tools for Java (J2ME) 124 | .mtj.tmp/ 125 | 126 | # Package Files # 127 | *.jar 128 | *.war 129 | *.nar 130 | *.ear 131 | *.zip 132 | *.tar.gz 133 | *.rar 134 | 135 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 136 | hs_err_pid* 137 | 138 | ### AndroidStudio ### 139 | # Covers files to be ignored for android development using Android Studio. 140 | 141 | # Built application files 142 | 143 | # Files for the ART/Dalvik VM 144 | 145 | # Java class files 146 | 147 | # Generated files 148 | 149 | # Gradle files 150 | .gradle 151 | 152 | # Signing files 153 | .signing/ 154 | 155 | # Local configuration file (sdk path, etc) 156 | 157 | # Proguard folder generated by Eclipse 158 | 159 | # Log Files 160 | 161 | # Android Studio 162 | /*/build/ 163 | /*/local.properties 164 | /*/out 165 | /*/*/build 166 | /*/*/production 167 | *.ipr 168 | *~ 169 | *.swp 170 | 171 | # Keystore files 172 | *.jks 173 | *.keystore 174 | 175 | # Google Services (e.g. APIs or Firebase) 176 | # google-services.json 177 | 178 | # Android Patch 179 | 180 | # External native build folder generated in Android Studio 2.2 and later 181 | 182 | # NDK 183 | obj/ 184 | 185 | # IntelliJ IDEA 186 | *.iws 187 | /out/ 188 | 189 | # User-specific configurations 190 | .idea/caches/ 191 | .idea/libraries/ 192 | .idea/shelf/ 193 | .idea/.name 194 | .idea/compiler.xml 195 | .idea/copyright/profiles_settings.xml 196 | .idea/encodings.xml 197 | .idea/misc.xml 198 | .idea/scopes/scope_settings.xml 199 | .idea/vcs.xml 200 | .idea/jsLibraryMappings.xml 201 | .idea/datasources.xml 202 | .idea/dataSources.ids 203 | .idea/sqlDataSources.xml 204 | .idea/dynamic.xml 205 | .idea/uiDesigner.xml 206 | .idea/jarRepositories.xml 207 | 208 | # OS-specific files 209 | .DS_Store 210 | .DS_Store? 211 | ._* 212 | .Spotlight-V100 213 | .Trashes 214 | ehthumbs.db 215 | Thumbs.db 216 | 217 | # Legacy Eclipse project files 218 | .classpath 219 | .project 220 | .cproject 221 | .settings/ 222 | 223 | # Mobile Tools for Java (J2ME) 224 | 225 | # Package Files # 226 | 227 | # virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) 228 | 229 | ## Plugin-specific files: 230 | 231 | # mpeltonen/sbt-idea plugin 232 | .idea_modules/ 233 | 234 | # JIRA plugin 235 | atlassian-ide-plugin.xml 236 | 237 | # Mongo Explorer plugin 238 | .idea/mongoSettings.xml 239 | 240 | # Crashlytics plugin (for Android Studio and IntelliJ) 241 | com_crashlytics_export_strings.xml 242 | crashlytics.properties 243 | crashlytics-build.properties 244 | fabric.properties 245 | 246 | ### AndroidStudio Patch ### 247 | 248 | !/gradle/wrapper/gradle-wrapper.jar 249 | 250 | # End of https://www.toptal.com/developers/gitignore/api/kotlin,android,androidstudio 251 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | MultiModuleActivity 2 | -------------------------------------------------------------------------------- /android.gradle: -------------------------------------------------------------------------------- 1 | android { 2 | compileSdkVersion 30 3 | buildToolsVersion "30.0.3" 4 | 5 | defaultConfig { 6 | minSdkVersion 23 7 | targetSdkVersion 30 8 | versionCode 1 9 | versionName "1.0" 10 | 11 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 12 | consumerProguardFiles "consumer-rules.pro" 13 | } 14 | 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | compileOptions { 22 | sourceCompatibility JavaVersion.VERSION_1_8 23 | targetCompatibility JavaVersion.VERSION_1_8 24 | } 25 | kotlinOptions { 26 | jvmTarget = '1.8' 27 | } 28 | buildFeatures { 29 | viewBinding = true 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation 'androidx.appcompat:appcompat:1.3.0' 35 | implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0" 36 | implementation 'androidx.core:core-ktx:1.5.0' 37 | implementation "androidx.activity:activity-ktx:1.2.3" 38 | implementation "androidx.fragment:fragment-ktx:1.3.4" 39 | } 40 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'kotlin-android' 4 | } 5 | 6 | android { 7 | compileSdkVersion 30 8 | buildToolsVersion "30.0.3" 9 | 10 | defaultConfig { 11 | applicationId "com.dino.multimoduleactivity" 12 | minSdkVersion 23 13 | targetSdkVersion 30 14 | versionCode 1 15 | versionName "1.0" 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | } 19 | 20 | buildTypes { 21 | release { 22 | minifyEnabled false 23 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 24 | } 25 | } 26 | compileOptions { 27 | sourceCompatibility JavaVersion.VERSION_1_8 28 | targetCompatibility JavaVersion.VERSION_1_8 29 | } 30 | kotlinOptions { 31 | jvmTarget = '1.8' 32 | } 33 | } 34 | 35 | dependencies { 36 | 37 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 38 | implementation 'androidx.core:core-ktx:1.3.2' 39 | implementation 'androidx.appcompat:appcompat:1.2.0' 40 | implementation 'com.google.android.material:material:1.3.0' 41 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4' 42 | testImplementation 'junit:junit:4.+' 43 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 44 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 45 | 46 | implementation project(":feature:splash") 47 | implementation project(":feature:home") 48 | implementation project(":feature:input") 49 | } 50 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/dino/multimoduleactivity/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.multimoduleactivity 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.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.getInstrumentation().targetContext 22 | assertEquals("com.dino.multimoduleactivity", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MultiModuleActivity 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/test/java/com/dino/multimoduleactivity/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.multimoduleactivity 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = "1.4.30" 4 | repositories { 5 | google() 6 | jcenter() 7 | } 8 | dependencies { 9 | classpath "com.android.tools.build:gradle:4.1.1" 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | 12 | // NOTE: Do not place your application dependencies here; they belong 13 | // in the individual module build.gradle files 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | jcenter() 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } 27 | -------------------------------------------------------------------------------- /common/ui/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /common/ui/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | } 5 | 6 | apply from: "../../android.gradle" 7 | 8 | 9 | -------------------------------------------------------------------------------- /common/ui/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/common/ui/consumer-rules.pro -------------------------------------------------------------------------------- /common/ui/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 | -------------------------------------------------------------------------------- /common/ui/src/androidTest/java/com/dino/ui/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.ui 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.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.getInstrumentation().targetContext 22 | assertEquals("com.dino.ui.test", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/ui/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /common/ui/src/main/java/com/dino/ui/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dino.ui 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import androidx.activity.result.contract.ActivityResultContracts 6 | import androidx.appcompat.app.AppCompatActivity 7 | import androidx.viewbinding.ViewBinding 8 | 9 | abstract class BaseActivity(private val inflater: (LayoutInflater) -> B) : AppCompatActivity() { 10 | 11 | protected lateinit var binding: B 12 | private set 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | binding = inflater(layoutInflater) 17 | setContentView(binding.root) 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /common/ui/src/test/java/com/dino/ui/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.ui 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/util/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /common/util/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | } 5 | 6 | apply from: "../../android.gradle" 7 | 8 | 9 | -------------------------------------------------------------------------------- /common/util/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/common/util/consumer-rules.pro -------------------------------------------------------------------------------- /common/util/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 | -------------------------------------------------------------------------------- /common/util/src/androidTest/java/com/dino/util/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.util 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.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.getInstrumentation().targetContext 22 | assertEquals("com.dino.util.test", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/util/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /common/util/src/main/java/com/dino/util/ActivityResultCallerExtension.kt: -------------------------------------------------------------------------------- 1 | package com.dino.util 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import androidx.activity.result.ActivityResult 6 | import androidx.activity.result.ActivityResultCaller 7 | import androidx.activity.result.contract.ActivityResultContracts 8 | 9 | fun ActivityResultCaller.register(action: (ActivityResult) -> Unit) = 10 | registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 11 | action(it) 12 | } 13 | 14 | 15 | fun ActivityResultCaller.registerResult( 16 | resultCode: Int = Activity.RESULT_OK, 17 | action: (Intent?) -> Unit, 18 | ) = 19 | registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 20 | if (it.resultCode == resultCode) { 21 | action(it.data) 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /common/util/src/main/java/com/dino/util/ContextExtension.kt: -------------------------------------------------------------------------------- 1 | package com.dino.util 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import androidx.core.os.bundleOf 6 | 7 | fun Context.createIntent( 8 | className: String, 9 | vararg extras: Pair, 10 | ) = runCatching { 11 | Intent(this, Class.forName(className)).apply { 12 | putExtras(bundleOf(*extras)) 13 | } 14 | }.onFailure { 15 | it.printStackTrace() 16 | }.getOrNull() 17 | 18 | fun Context.startActivity( 19 | className: String, 20 | vararg extras: Pair, 21 | ) { 22 | runCatching { 23 | startActivity(createIntent(className, *extras)) 24 | }.onFailure { 25 | it.printStackTrace() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/util/src/test/java/com/dino/util/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.util 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /feature/feature.gradle: -------------------------------------------------------------------------------- 1 | apply from: "../../android.gradle" 2 | 3 | dependencies { 4 | implementation project(":common:ui") 5 | implementation project(":common:util") 6 | 7 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 8 | implementation 'com.google.android.material:material:1.3.0' 9 | 10 | testImplementation 'junit:junit:4.+' 11 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 12 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 13 | } 14 | -------------------------------------------------------------------------------- /feature/home/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /feature/home/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | } 5 | 6 | apply from: "../feature.gradle" 7 | -------------------------------------------------------------------------------- /feature/home/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjjeong/MultiModuleActivity/b1a778eeb6ff6a201674c423d9a497489ac4d005/feature/home/consumer-rules.pro -------------------------------------------------------------------------------- /feature/home/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 | -------------------------------------------------------------------------------- /feature/home/src/androidTest/java/com/dino/home/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.dino.home 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.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.getInstrumentation().targetContext 22 | assertEquals("com.dino.home.test", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /feature/home/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /feature/home/src/main/java/com/dino/home/HomeActivity.kt: -------------------------------------------------------------------------------- 1 | package com.dino.home 2 | 3 | import android.view.View 4 | import com.dino.home.databinding.ActivityHomeBinding 5 | import com.dino.ui.BaseActivity 6 | import com.dino.util.createIntent 7 | import com.dino.util.registerResult 8 | 9 | class HomeActivity : BaseActivity(ActivityHomeBinding::inflate) { 10 | 11 | private val inputLauncher = registerResult { 12 | binding.tvInput.text = it?.getStringExtra("input") ?: "Unknown" 13 | } 14 | 15 | fun showInput(view: View) { 16 | inputLauncher.launch(createIntent("com.dino.input.InputActivity")) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /feature/home/src/main/res/layout/activity_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 19 | 20 |