├── common ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── my │ │ └── demo │ │ └── common │ │ ├── Factory.kt │ │ ├── Apis.kt │ │ └── RxJava2SchedulerCallAdapterFactory.kt └── build.gradle.kts ├── .gitignore ├── app1 ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap │ │ │ │ └── ic_launcher.xml │ │ │ ├── layout │ │ │ │ ├── content_main.xml │ │ │ │ └── activity_main.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── my │ │ │ │ └── demo │ │ │ │ └── app1 │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── my │ │ └── demo │ │ └── app1 │ │ └── MainActivityTest.kt ├── build.gradle.kts └── constructors.kts ├── app2 ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap │ │ │ │ └── ic_launcher.xml │ │ │ ├── layout │ │ │ │ ├── content_main.xml │ │ │ │ └── activity_main.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── my │ │ │ │ └── demo │ │ │ │ └── app2 │ │ │ │ ├── MainActivity.kt │ │ │ │ └── MainFragment.kt │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── my │ │ └── demo │ │ └── app2 │ │ └── MainActivityTest.kt └── build.gradle.kts ├── app3 ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap │ │ │ │ └── ic_launcher.xml │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ └── content_main.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── my │ │ │ │ └── demo │ │ │ │ └── app3 │ │ │ │ ├── MainActivity.kt │ │ │ │ └── MainFragment.kt │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── my │ │ └── demo │ │ └── app3 │ │ └── MainActivityTest.kt └── build.gradle.kts ├── app4 ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap │ │ │ │ └── ic_launcher.xml │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ └── content_main.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── my │ │ │ │ └── demo │ │ │ │ └── app4 │ │ │ │ ├── model │ │ │ │ ├── Business.kt │ │ │ │ └── BusinessRepo.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── MainFragment.kt │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── my │ │ └── demo │ │ └── app4 │ │ └── MainActivityTest.kt └── build.gradle.kts ├── app5 ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap │ │ │ │ └── ic_launcher.xml │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ └── content_main.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── my │ │ │ │ └── demo │ │ │ │ └── app5 │ │ │ │ ├── model │ │ │ │ ├── Business.kt │ │ │ │ ├── BusinessSearchResponse.kt │ │ │ │ ├── BusinessSearch.kt │ │ │ │ └── BusinessRepo.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── MainFragment.kt │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── my │ │ └── demo │ │ └── app5 │ │ └── MainActivityTest.kt └── build.gradle.kts ├── app6 ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap │ │ │ │ └── ic_launcher.xml │ │ │ ├── layout │ │ │ │ ├── business_search_result.xml │ │ │ │ ├── activity_main.xml │ │ │ │ └── content_main.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── my │ │ │ │ └── demo │ │ │ │ └── app6 │ │ │ │ ├── model │ │ │ │ ├── BusinessSearchResponse.kt │ │ │ │ ├── Business.kt │ │ │ │ ├── BusinessSearch.kt │ │ │ │ └── BusinessRepo.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── BusinessSearchAdapter.kt │ │ │ │ └── MainFragment.kt │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── my │ │ └── demo │ │ └── app6 │ │ └── MainActivityTest.kt └── build.gradle.kts ├── Kotlin For Android - Workbook.pdf ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── app ├── src │ └── main │ │ ├── java │ │ └── my │ │ │ └── demo │ │ │ └── app │ │ │ └── MainActivity.kt │ │ ├── res │ │ ├── values │ │ │ ├── strings.xml │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ ├── mipmap │ │ │ └── ic_launcher.xml │ │ ├── layout │ │ │ ├── content_main.xml │ │ │ └── activity_main.xml │ │ └── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── ic_launcher_background.xml │ │ └── AndroidManifest.xml └── build.gradle.kts ├── .pre-commit-config.yaml ├── settings.gradle.kts ├── gradle.properties ├── .secrets.baseline ├── common.gradle ├── gradlew.bat ├── README.md ├── gradlew └── LICENSE /common/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | *.iml 3 | /captures 4 | /local.properties 5 | 6 | build/ 7 | -------------------------------------------------------------------------------- /app1/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app2/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app3/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app4/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app5/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app6/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /Kotlin For Android - Workbook.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yelp/kotlin-android-workshop/HEAD/Kotlin For Android - Workbook.pdf -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yelp/kotlin-android-workshop/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app5/src/main/java/my/demo/app5/model/Business.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app5.model 2 | 3 | data class Business(val name: String, val imageUrl: String?) -------------------------------------------------------------------------------- /common/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | kotlin("android") 4 | } 5 | 6 | apply(from = "$rootDir/common.gradle") -------------------------------------------------------------------------------- /app4/src/main/java/my/demo/app4/model/Business.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app4.model 2 | 3 | data class Business(val name: String, val imageUrl: String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/my/demo/app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | 5 | class MainActivity : AppCompatActivity() 6 | -------------------------------------------------------------------------------- /app5/src/main/java/my/demo/app5/model/BusinessSearchResponse.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app5.model 2 | 3 | data class BusinessSearchResponse(val total: Int, val businesses: List) -------------------------------------------------------------------------------- /app6/src/main/java/my/demo/app6/model/BusinessSearchResponse.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app6.model 2 | 3 | data class BusinessSearchResponse(val total: Int, val businesses: List) -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Kotlin Demo 3 | Kotlin Demo 4 | 5 | -------------------------------------------------------------------------------- /app6/src/main/java/my/demo/app6/model/Business.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app6.model 2 | 3 | import com.squareup.moshi.Json 4 | 5 | data class Business(val name: String, @Json(name = "image_url") val imageUrl: String) -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | - repo: git@github.com:Yelp/detect-secrets 2 | rev: 0.10.3 3 | hooks: 4 | - id: detect-secrets 5 | args: ['--baseline', '.secrets.baseline'] 6 | exclude: .*/tests/.* -------------------------------------------------------------------------------- /app1/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KDemo1 3 | KDemo1 4 | Hello World! 5 | 6 | -------------------------------------------------------------------------------- /app2/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KDemo2 3 | KDemo2 4 | Hello World! 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app1/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app2/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app3/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app4/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app5/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app6/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app1/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app2/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app3/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app4/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app5/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app6/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | kotlin("android.extensions") 5 | } 6 | 7 | apply(from = "$rootDir/common.gradle") 8 | 9 | dependencies { 10 | implementation(project(":common")) 11 | } 12 | -------------------------------------------------------------------------------- /app3/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KDemo3 3 | KDemo3 4 | Hello World! 5 | cafe, dinner 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app1/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app2/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app3/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app4/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app5/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app6/src/main/res/mipmap/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app4/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KDemo4 3 | KDemo4 4 | Hello World! 5 | No results for \"%1$s\" 6 | lunch, shopping 7 | 8 | -------------------------------------------------------------------------------- /app5/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KDemo5 3 | KDemo5 4 | Hello World! 5 | No results for \"%1$s\" 6 | lunch, shopping 7 | 8 | -------------------------------------------------------------------------------- /app6/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | KDemo6 3 | KDemo6 4 | Hello World! 5 | No results for \"%1$s\" 6 | lunch, shopping 7 | 8 | -------------------------------------------------------------------------------- /app5/src/main/java/my/demo/app5/model/BusinessSearch.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app5.model 2 | 3 | import io.reactivex.Single 4 | import retrofit2.http.GET 5 | import retrofit2.http.Query 6 | 7 | interface BusinessSearch { 8 | @GET("v3/businesses/search?location=SF") 9 | fun search(@Query("term") term: String): Single 10 | } 11 | -------------------------------------------------------------------------------- /app6/src/main/java/my/demo/app6/model/BusinessSearch.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app6.model 2 | 3 | import io.reactivex.Single 4 | import retrofit2.http.GET 5 | import retrofit2.http.Query 6 | 7 | interface BusinessSearch { 8 | @GET("v3/businesses/search?location=SF") 9 | fun search(@Query("term") term: String): Single 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/my/demo/common/Factory.kt: -------------------------------------------------------------------------------- 1 | package my.demo.common 2 | 3 | interface Factory { 4 | var mock: T? 5 | fun instance(): T 6 | } 7 | 8 | open class Provider(init: () -> T) : Factory { 9 | override var mock: T? = null 10 | private val instance: T by lazy(init) 11 | override fun instance() = mock ?: instance 12 | } 13 | -------------------------------------------------------------------------------- /app5/src/main/java/my/demo/app5/model/BusinessRepo.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app5.model 2 | 3 | import io.reactivex.Single 4 | import my.demo.common.Factory 5 | import my.demo.common.Provider 6 | import my.demo.common.api 7 | 8 | open class BusinessRepo { 9 | companion object : Factory by Provider({ BusinessRepo() }) 10 | 11 | open fun search(term: String): Single { 12 | return api().search(term) 13 | } 14 | } -------------------------------------------------------------------------------- /app6/src/main/java/my/demo/app6/model/BusinessRepo.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app6.model 2 | 3 | import io.reactivex.Single 4 | import my.demo.common.Factory 5 | import my.demo.common.Provider 6 | import my.demo.common.api 7 | 8 | open class BusinessRepo { 9 | companion object : Factory by Provider({ BusinessRepo() }) 10 | 11 | open fun search(term: String): Single { 12 | return api().search(term) 13 | } 14 | } -------------------------------------------------------------------------------- /app4/src/main/java/my/demo/app4/model/BusinessRepo.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app4.model 2 | 3 | import androidx.lifecycle.ViewModel 4 | import io.reactivex.Single 5 | import my.demo.common.Factory 6 | import my.demo.common.Provider 7 | 8 | open class BusinessRepo : ViewModel() { 9 | companion object : Factory by Provider({ BusinessRepo() }) 10 | 11 | open fun search(term: String): Single> { 12 | return Single.just(listOf()) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | include(":app", 2 | ":app1", 3 | ":app2", 4 | ":app3", 5 | ":app4", 6 | ":app5", 7 | ":app6", 8 | ":common") 9 | 10 | pluginManagement { 11 | repositories { 12 | gradlePluginPortal() 13 | google() 14 | } 15 | resolutionStrategy { 16 | eachPlugin { 17 | if ("com.android" in requested.id.id) { 18 | useModule("com.android.tools.build:gradle:${requested.version}") 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app1/src/main/java/my/demo/app1/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app1 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | import kotlinx.android.synthetic.main.activity_main.* 7 | import kotlinx.android.synthetic.main.content_main.* 8 | 9 | class MainActivity : AppCompatActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_main) 14 | setSupportActionBar(toolbar) 15 | hiWorld.text = getString(R.string.greeting) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app2/src/main/java/my/demo/app2/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app2 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.activity_main.* 6 | 7 | class MainActivity : AppCompatActivity() { 8 | 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | setContentView(R.layout.activity_main) 12 | setSupportActionBar(toolbar) 13 | 14 | supportFragmentManager.beginTransaction() 15 | .replace(R.id.content_frame, MainFragment.newInstance()) 16 | .commit() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app3/src/main/java/my/demo/app3/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app3 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.activity_main.* 6 | 7 | class MainActivity : AppCompatActivity() { 8 | 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | setContentView(R.layout.activity_main) 12 | setSupportActionBar(toolbar) 13 | 14 | supportFragmentManager.beginTransaction() 15 | .replace(R.id.content_frame, MainFragment.newInstance()) 16 | .commit() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app4/src/main/java/my/demo/app4/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app4 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | import kotlinx.android.synthetic.main.activity_main.* 7 | 8 | class MainActivity : AppCompatActivity() { 9 | 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | super.onCreate(savedInstanceState) 12 | setContentView(R.layout.activity_main) 13 | setSupportActionBar(toolbar) 14 | 15 | supportFragmentManager.beginTransaction() 16 | .replace(R.id.content_frame, MainFragment.newInstance()) 17 | .commit() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app5/src/main/java/my/demo/app5/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app5 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | import kotlinx.android.synthetic.main.activity_main.* 7 | 8 | class MainActivity : AppCompatActivity() { 9 | 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | super.onCreate(savedInstanceState) 12 | setContentView(R.layout.activity_main) 13 | setSupportActionBar(toolbar) 14 | 15 | supportFragmentManager.beginTransaction() 16 | .replace(R.id.content_frame, MainFragment.newInstance()) 17 | .commit() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app6/src/main/java/my/demo/app6/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app6 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | import kotlinx.android.synthetic.main.activity_main.* 7 | 8 | class MainActivity : AppCompatActivity() { 9 | 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | super.onCreate(savedInstanceState) 12 | setContentView(R.layout.activity_main) 13 | setSupportActionBar(toolbar) 14 | 15 | supportFragmentManager.beginTransaction() 16 | .replace(R.id.content_frame, MainFragment.newInstance()) 17 | .commit() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2g \ 2 | -XX:MaxPermSize=256m \ 3 | -XX:+HeapDumpOnOutOfMemoryError \ 4 | -Dfile.encoding=UTF-8 \ 5 | -Duser.language=en \ 6 | -Duser.country=US 7 | 8 | org.gradle.parallel=true 9 | org.gradle.caching=true 10 | org.gradle.daemon=true 11 | 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand 13 | # Disable is specifically, as it is not compatible with the android plugin 3.1.2. Also, the gains 14 | # are minimum according to this conversation: https://github.com/gradle/gradle/issues/2868 15 | org.gradle.configureondemand=false 16 | 17 | android.useAndroidX = true 18 | android.enableJetifier = true 19 | -------------------------------------------------------------------------------- /app1/src/androidTest/java/my/demo/app1/MainActivityTest.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app1 2 | 3 | import androidx.test.espresso.Espresso.onView 4 | import androidx.test.espresso.assertion.ViewAssertions.matches 5 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 6 | import androidx.test.espresso.matcher.ViewMatchers.withText 7 | import androidx.test.rule.ActivityTestRule 8 | import org.junit.Rule 9 | import org.junit.Test 10 | 11 | class MainActivityTest { 12 | 13 | @get:Rule 14 | val activityRule = ActivityTestRule(MainActivity::class.java) 15 | 16 | @Test 17 | fun whenStarted_showsHelloWorld() { 18 | onView(withText(R.string.greeting)).check(matches(isDisplayed())) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app2/src/androidTest/java/my/demo/app2/MainActivityTest.kt: -------------------------------------------------------------------------------- 1 | package my.demo.app2 2 | 3 | import androidx.test.espresso.Espresso.onView 4 | import androidx.test.espresso.assertion.ViewAssertions.matches 5 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 6 | import androidx.test.espresso.matcher.ViewMatchers.withText 7 | import androidx.test.rule.ActivityTestRule 8 | import org.junit.Rule 9 | import org.junit.Test 10 | 11 | class MainActivityTest { 12 | 13 | @get:Rule 14 | val activityRule = ActivityTestRule(MainActivity::class.java) 15 | 16 | @Test 17 | fun whenStarted_showsHelloWorld() { 18 | onView(withText(R.string.greeting)).check(matches(isDisplayed())) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app2/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 | 10 | 11 | 15 | 16 | 10 | 11 | 15 | 16 | 10 | 11 | 15 | 16 | 10 | 11 | 15 | 16 | 10 | 11 | 15 | 16 | 10 | 11 | 15 | 16 |