Skip to content

Commit

Permalink
Kotlin 1.4 + Jetpack Compose alpha
Browse files Browse the repository at this point in the history
  • Loading branch information
joreilly committed Sep 5, 2020
1 parent 3ad9454 commit 83379ae
Show file tree
Hide file tree
Showing 32 changed files with 343 additions and 329 deletions.
13 changes: 4 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
### Android Galway Bus app using Kotlin Multiplatform shared code
### Galway Bus Kotlin Multiplatform project using Jetpack Compose and SwiftUI


[![Get it on Google Play](https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png)](https://play.google.com/store/apps/details?id=com.surrus.galwaybus)


Note also that this is using [REST endpoint](https://github.com/appsandwich/galwaybus) provided by @appsandwich to retrieve
Galway Bus route/timetable info (Thanks Vinny!)



### Kotlin Multiplatform

Currently this project is being mostly used as platform to explore some of the relatively new Kotlin Multiplatform
Expand All @@ -23,10 +18,10 @@ written a couple of post about some of my experiences doing this so far

* [Kotlin](https://kotlinlang.org/)
* [Kotlin Corooutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)
* [Kotlin Serialization](https://github.com/Kotlin/kotlinx.serialization)
* [Kotlinx Serialization](https://github.com/Kotlin/kotlinx.serialization)
* [Ktor client library](https://github.com/ktorio/ktor)
* [Android Architecture Components](https://developer.android.com/topic/libraries/architecture/index.html)
* [Android Support Libraries](https://developer.android.com/topic/libraries/support-library/index.html)
* [Koin](https://github.com/InsertKoinIO/koin)
* [Logger](https://github.com/orhanobut/logger)
* [Mockito](http://site.mockito.org/)
* [Jetpack Compose](https://developer.android.com/jetpack/compose)
* [SwiftUI](https://developer.apple.com/documentation/swiftui)
131 changes: 26 additions & 105 deletions SharedCode/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,6 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

//This is for MultiplatformSettings
debug {
// MPP libraries don't currently get this resolution automatically
matchingFallbacks = ['release']
}
}
}


Expand All @@ -46,17 +33,13 @@ kotlin {
}
}

fromPreset(presets.android, 'android')

macosX64("macOS")
android()
jvm()
}

js {
compileKotlinJs {
kotlinOptions.metaInfo = true
kotlinOptions.sourceMap = true
kotlinOptions.moduleKind = "commonjs"
kotlinOptions.main = "call"
browser {
}
}

Expand All @@ -70,115 +53,53 @@ kotlin {

sourceSets {
commonMain.dependencies {
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-common:${Versions.kotlin}"

// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:${Versions.kotlinCoroutines}"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinCoroutines}") {
force = true
}

// Ktor
implementation "io.ktor:ktor-client-core:${Versions.ktor}"
implementation "io.ktor:ktor-client-json:${Versions.ktor}"
implementation "io.ktor:ktor-client-logging:${Versions.ktor}"
implementation "io.ktor:ktor-client-serialization:${Versions.ktor}"
implementation("io.ktor:ktor-client-core:${Versions.ktor}")
implementation("io.ktor:ktor-client-json:${Versions.ktor}")
implementation("io.ktor:ktor-client-logging:${Versions.ktor}")
implementation("io.ktor:ktor-client-serialization:${Versions.ktor}")

// Serialize
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:${Versions.kotlinxSerialization}"
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:${Versions.kotlinxSerialization}")

// SQL Delight
implementation "com.squareup.sqldelight:runtime:${Versions.sqlDelight}"
implementation "com.squareup.sqldelight:coroutines-extensions:${Versions.sqlDelight}"
implementation("com.squareup.sqldelight:runtime:${Versions.sqlDelight}")
implementation("com.squareup.sqldelight:coroutines-extensions:${Versions.sqlDelight}")

// koin
api("org.koin:koin-core:${Versions.koin}")
}

androidMain.dependencies {
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"

// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.kotlinCoroutines}"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinCoroutines}"

// Ktor
implementation "io.ktor:ktor-client-android:${Versions.ktor}"
implementation "io.ktor:ktor-client-core-jvm:${Versions.ktor}"
implementation "io.ktor:ktor-client-json-jvm:${Versions.ktor}"
implementation "io.ktor:ktor-client-logging-jvm:${Versions.ktor}"
implementation "io.ktor:ktor-client-serialization-jvm:${Versions.ktor}"

// Serialize
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinxSerialization}"

// SQL Delight
implementation "com.squareup.sqldelight:android-driver:${Versions.sqlDelight}"
implementation "com.squareup.sqldelight:coroutines-extensions-jvm:${Versions.sqlDelight}"
implementation("io.ktor:ktor-client-android:${Versions.ktor}")
implementation("com.squareup.sqldelight:android-driver:${Versions.sqlDelight}")
}

iOSMain.dependencies {
// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:${Versions.kotlinCoroutines}"

// Ktor
implementation "io.ktor:ktor-client-ios:${Versions.ktor}"
implementation "io.ktor:ktor-client-core-native:${Versions.ktor}"
implementation "io.ktor:ktor-client-json-native:${Versions.ktor}"
implementation "io.ktor:ktor-client-logging-native:${Versions.ktor}"
implementation "io.ktor:ktor-client-serialization-native:${Versions.ktor}"

// Serialize
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:${Versions.kotlinxSerialization}"

// SQL Delight
implementation("io.ktor:ktor-client-ios:${Versions.ktor}")
implementation("com.squareup.sqldelight:native-driver:${Versions.sqlDelight}")
}

macOSMain.dependencies {
// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-macosx64:${Versions.kotlinCoroutines}"


// Ktor
implementation "io.ktor:ktor-client-curl:${Versions.ktor}"
implementation "io.ktor:ktor-client-core-macosx64:${Versions.ktor}"
implementation "io.ktor:ktor-client-json-macosx64:${Versions.ktor}"
implementation "io.ktor:ktor-client-logging-macosx64:${Versions.ktor}"
implementation "io.ktor:ktor-client-serialization-macosx64:${Versions.ktor}"

// Serialize
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-macosx64:${Versions.kotlinxSerialization}"

// SQL Delight
implementation "com.squareup.sqldelight:native-driver-macosx64:${Versions.sqlDelight}"
implementation "com.squareup.sqldelight:runtime-macosx64:${Versions.sqlDelight}"
implementation("io.ktor:ktor-client-ios:${Versions.ktor}")
implementation("com.squareup.sqldelight:native-driver-macosx64:${Versions.sqlDelight}")
}


jvmMain.dependencies {
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"

// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinCoroutines}"

// Ktor
implementation "io.ktor:ktor-client-core-jvm:${Versions.ktor}"
implementation "io.ktor:ktor-client-json-jvm:${Versions.ktor}"
implementation "io.ktor:ktor-client-serialization-jvm:${Versions.ktor}"
implementation Ktor.slf4j

// Serialize
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinxSerialization}"

// SQL Delight
implementation "com.squareup.sqldelight:sqlite-driver:${Versions.sqlDelight}"
implementation("io.ktor:ktor-client-apache:${Versions.ktor}")
//implementation(Ktor.slf4j)
//implementation("org.xerial:sqlite-jdbc:${Versions.sqliteJdbcDriver}")
implementation("com.squareup.sqldelight:sqlite-driver:${Versions.sqlDelight}")
}

jsMain.dependencies {
api Kotlin.stdlibJs
api Kotlin.serializationRuntimeJs
api Ktor.clientJs
api Ktor.clientJsonJs
api Ktor.clientLoggingJs
api Ktor.clientSerializationJs
implementation("io.ktor:ktor-client-js:${Versions.ktor}")
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,3 @@ actual fun createDb(): MyDatabase? {
return MyDatabase(driver)
}

actual fun ktorScope(block: suspend () -> Unit) {
GlobalScope.launch(Dispatchers.Main) { block() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,14 @@ import kotlinx.coroutines.launch

expect fun createDb() : MyDatabase?

// TEMP until following is resolved https://github.com/ktorio/ktor/issues/1622
expect fun ktorScope(block: suspend () -> Unit)


open class GalwayBusRepository {

private val galwayBusApi = GalwayBusApi()
private val galwayBusDb = createDb()
private val galwayBusQueries = galwayBusDb?.galwayBusQueries

init {
ktorScope {
GlobalScope.launch(Dispatchers.Main) {
fetchAndStoreBusStops()
}
}
Expand Down Expand Up @@ -77,7 +73,7 @@ open class GalwayBusRepository {
}

fun fetchBusListForRoute(routeId: String, success: (List<Bus>) -> Unit) {
ktorScope {
GlobalScope.launch(Dispatchers.Main) {
val busList = galwayBusApi.fetchBusListForRoute(routeId)
success(busList)
}
Expand All @@ -102,7 +98,7 @@ open class GalwayBusRepository {
}

fun fetchBusRoutes(success: (List<BusRoute>) -> Unit) {
ktorScope {
GlobalScope.launch(Dispatchers.Main) {
success(fetchBusRoutes())
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ import io.ktor.client.request.get
import io.ktor.client.request.parameter
import io.ktor.client.request.url
import kotlinx.serialization.Serializable
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.list
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration


@Serializable
Expand All @@ -31,7 +31,7 @@ data class GetBusListForRouteResponse(val bus: List<Bus>)
// https://github.com/appsandwich/galwaybus

class GalwayBusApi(val baseUrl: String = "https://galwaybus.herokuapp.com") {
private val nonStrictJson = Json(JsonConfiguration(isLenient = true, ignoreUnknownKeys = true))
private val nonStrictJson = Json { isLenient = true; ignoreUnknownKeys = true }

private val client by lazy {
HttpClient() {
Expand All @@ -40,12 +40,12 @@ class GalwayBusApi(val baseUrl: String = "https://galwaybus.herokuapp.com") {
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.ALL
level = LogLevel.INFO
}
}
}

private val busScheduleMapSerializer = MapSerializer(String.serializer(), MapSerializer(String.serializer(), String.serializer()).list)
private val busScheduleMapSerializer = MapSerializer(String.serializer(), ListSerializer(MapSerializer(String.serializer(), String.serializer())))


suspend fun fetchBusRoutes(): Map<String, BusRoute> {
Expand All @@ -58,7 +58,7 @@ class GalwayBusApi(val baseUrl: String = "https://galwaybus.herokuapp.com") {

suspend fun fetchSchedules(): Map<String, List<Map<String, String>>> {
val jsonString = client.get<String>("$baseUrl/schedules.json")
return nonStrictJson.parse(busScheduleMapSerializer, jsonString)
return nonStrictJson.decodeFromString(busScheduleMapSerializer, jsonString)
}

suspend fun fetchNearestStops(latitude: Double, longitude: Double): List<BusStop> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,22 @@ import io.ktor.client.request.parameter
import io.ktor.client.request.url
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration


class RTPIApi {
private val baseUrl = "https://data.smartdublin.ie/cgi-bin/rtpi"

private val nonStrictJson = Json(JsonConfiguration(isLenient = true, ignoreUnknownKeys = true))
private val nonStrictJson = Json { isLenient = true; ignoreUnknownKeys = true }

private val client by lazy {
HttpClient() {
install(JsonFeature) {
serializer = KotlinxSerializer(nonStrictJson)
}
// install(Logging) {
// logger = Logger.DEFAULT
// level = LogLevel.ALL
// }
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.INFO
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,3 @@ actual fun createDb(): MyDatabase? {
return MyDatabase(driver)
}

actual fun ktorScope(block: suspend () -> Unit) {
GlobalScope.launch(Dispatchers.Main) { block() }
}

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,3 @@ actual fun createDb(): MyDatabase? {
return null
}

actual fun ktorScope(block: suspend () -> Unit) {
GlobalScope.launch(Dispatchers.Main) { block() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,3 @@ actual fun createDb(): MyDatabase? {
return MyDatabase(driver)
}

actual fun ktorScope(block: suspend () -> Unit) = kotlinx.coroutines.runBlocking { block() }
1 change: 0 additions & 1 deletion SharedCode/src/macOSMain/kotlin/common/actual.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,3 @@ actual fun createDb(): MyDatabase? {
return MyDatabase(driver)
}

actual fun ktorScope(block: suspend () -> Unit) = kotlinx.coroutines.runBlocking { block() }
Loading

0 comments on commit 83379ae

Please sign in to comment.