Skip to content

Commit 2bb448c

Browse files
authored
Merge pull request #269 from yschimke/cleanup
A bunch of minor edits.
2 parents 1699b60 + ed3704e commit 2bb448c

File tree

12 files changed

+90
-104
lines changed

12 files changed

+90
-104
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ fastlane/report.xml
3737
keystore.properties
3838
api-*.json
3939

40+
/.kotlin/

common/build.gradle.kts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
12
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
23

34
plugins {
@@ -66,9 +67,11 @@ kotlin {
6667
}
6768

6869
androidMain.dependencies {
69-
implementation(libs.ktor.client.android)
70+
implementation(libs.ktor.client.okhttp)
71+
implementation(libs.okhttp.core)
7072
// workaround for https://youtrack.jetbrains.com/issue/CMP-5959/Invalid-redirect-in-window-core#focus=Comments-27-10365630.0-0
7173
implementation("androidx.window:window-core:1.3.0")
74+
implementation(libs.slf4j.android)
7275
}
7376

7477
appleMain.dependencies {
@@ -116,7 +119,10 @@ multiplatformSwiftPackage {
116119
}
117120

118121
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
119-
kotlinOptions.jvmTarget = "17"
122+
compilerOptions {
123+
jvmTarget.set(JvmTarget.JVM_17)
124+
freeCompilerArgs.add("-Xexpect-actual-classes")
125+
}
120126
}
121127

122128
kotlin.sourceSets.all {

common/src/androidMain/kotlin/dev/johnoreilly/common/di/AndroidApplicationComponent.kt

+3-7
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,18 @@ import androidx.room.Room
66
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
77
import dev.johnoreilly.common.database.AppDatabase
88
import dev.johnoreilly.common.database.dbFileName
9-
import dev.johnoreilly.common.ui.BikeShareApp
10-
import io.ktor.client.engine.android.Android
9+
import io.ktor.client.engine.okhttp.OkHttp
1110
import kotlinx.coroutines.Dispatchers
1211
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
1312
import software.amazon.lastmile.kotlin.inject.anvil.MergeComponent
1413
import software.amazon.lastmile.kotlin.inject.anvil.SingleIn
1514

16-
1715
@MergeComponent(AppScope::class)
1816
@SingleIn(AppScope::class)
1917
abstract class AndroidApplicationComponent(val application: Application): SharedApplicationComponent {
20-
abstract val bikeShareApp: BikeShareApp
21-
22-
override fun getHttpClientEngine() = Android.create()
18+
override fun httpClientEngine() = OkHttp.create()
2319

24-
override fun getRoomDatabase() = createRoomDatabase(application)
20+
override fun appDatabase() = createRoomDatabase(application)
2521

2622
companion object
2723
}

common/src/commonMain/kotlin/dev/johnoreilly/common/di/SharedApplicationComponent.kt

+16-19
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package dev.johnoreilly.common.di
22

33
import dev.johnoreilly.common.database.AppDatabase
4-
import dev.johnoreilly.common.remote.CityBikesApi
5-
import dev.johnoreilly.common.repository.CityBikesRepository
6-
import dev.johnoreilly.common.viewmodel.CountriesViewModelShared
7-
import dev.johnoreilly.common.viewmodel.NetworksViewModelShared
8-
import dev.johnoreilly.common.viewmodel.StationsViewModelShared
4+
import dev.johnoreilly.common.ui.BikeShareApp
95
import io.ktor.client.HttpClient
106
import io.ktor.client.engine.HttpClientEngine
117
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
8+
import io.ktor.client.plugins.defaultRequest
129
import io.ktor.client.plugins.logging.DEFAULT
1310
import io.ktor.client.plugins.logging.LogLevel
1411
import io.ktor.client.plugins.logging.Logger
@@ -18,33 +15,33 @@ import kotlinx.serialization.json.Json
1815
import me.tatarka.inject.annotations.Provides
1916
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
2017
import software.amazon.lastmile.kotlin.inject.anvil.ContributesTo
18+
import software.amazon.lastmile.kotlin.inject.anvil.SingleIn
2119

2220
@ContributesTo(AppScope::class)
21+
@SingleIn(AppScope::class)
2322
interface SharedApplicationComponent {
24-
25-
val countriesViewModel: CountriesViewModelShared
26-
val networksViewModel: NetworksViewModelShared
27-
val stationsViewModel: StationsViewModelShared
28-
29-
30-
val repository: CityBikesRepository
31-
val cityBikesApi: CityBikesApi
32-
33-
val json: Json
34-
@Provides get() = Json { isLenient = true; ignoreUnknownKeys = true; useAlternativeNames = false }
23+
val bikeShareApp: BikeShareApp
3524

3625
@Provides
37-
fun getHttpClientEngine(): HttpClientEngine
26+
fun json(): Json = Json { isLenient = true; ignoreUnknownKeys = true; useAlternativeNames = false }
3827

3928
@Provides
40-
fun getRoomDatabase(): AppDatabase
29+
fun httpClientEngine(): HttpClientEngine
4130

31+
@Provides
32+
fun appDatabase(): AppDatabase
4233

4334
@Provides
44-
fun httpClient(): HttpClient = createHttpClient(getHttpClientEngine(), json)
35+
fun httpClient(httpClientEngine: HttpClientEngine, json: Json): HttpClient =
36+
createHttpClient(httpClientEngine, json)
4537
}
4638

4739
fun createHttpClient(httpClientEngine: HttpClientEngine, json: Json) = HttpClient(httpClientEngine) {
40+
expectSuccess = true
41+
42+
defaultRequest {
43+
url("https://api.citybik.es/")
44+
}
4845
install(ContentNegotiation) {
4946
json(json)
5047
}

common/src/commonMain/kotlin/dev/johnoreilly/common/remote/CityBikesApi.kt

+3-5
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,13 @@ fun Station.slots(): Int {
3232
}
3333

3434
@Inject
35-
class CityBikesApi(private val client: HttpClient,
36-
private val baseUrl: String = "https://api.citybik.es/v2/networks"
37-
) {
35+
class CityBikesApi(private val client: HttpClient) {
3836

3937
suspend fun fetchNetworkList(): NetworkListResult {
40-
return client.get(baseUrl).body()
38+
return client.get("/v2/networks").body()
4139
}
4240

4341
suspend fun fetchBikeShareInfo(network: String): NetworkResult {
44-
return client.get("$baseUrl/$network").body()
42+
return client.get("/v2/networks/$network").body()
4543
}
4644
}

common/src/commonMain/kotlin/dev/johnoreilly/common/ui/BikeShareContent.kt

-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import com.slack.circuit.foundation.rememberCircuitNavigator
1010
import dev.johnoreilly.common.screens.CountryListScreen
1111
import me.tatarka.inject.annotations.Inject
1212

13-
14-
1513
typealias BikeShareApp = @Composable () -> Unit
1614

1715
@Inject

common/src/iosMain/kotlin/dev/johnoreilly/common/di/IosApplicationComponent.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import androidx.room.Room
44
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
55
import dev.johnoreilly.common.database.AppDatabase
66
import dev.johnoreilly.common.database.dbFileName
7+
import dev.johnoreilly.common.viewmodel.CountriesViewModelShared
8+
import dev.johnoreilly.common.viewmodel.NetworksViewModelShared
9+
import dev.johnoreilly.common.viewmodel.StationsViewModelShared
710
import io.ktor.client.engine.darwin.Darwin
811
import kotlinx.coroutines.Dispatchers
912
import kotlinx.coroutines.IO
@@ -20,9 +23,13 @@ import software.amazon.lastmile.kotlin.inject.anvil.SingleIn
2023
@SingleIn(AppScope::class)
2124
abstract class IosApplicationComponent: SharedApplicationComponent {
2225

23-
override fun getHttpClientEngine() = Darwin.create()
26+
abstract val countriesViewModel: CountriesViewModelShared
27+
abstract val networksViewModel: NetworksViewModelShared
28+
abstract val stationsViewModel: StationsViewModelShared
2429

25-
override fun getRoomDatabase() = createRoomDatabase()
30+
override fun httpClientEngine() = Darwin.create()
31+
32+
override fun appDatabase() = createRoomDatabase()
2633
}
2734

2835
@MergeComponent.CreateComponent

common/src/jvmMain/kotlin/dev/johnoreilly/common/di/DesktopApplicationComponent.kt

+2-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import androidx.room.Room
44
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
55
import dev.johnoreilly.common.database.AppDatabase
66
import dev.johnoreilly.common.database.dbFileName
7-
import dev.johnoreilly.common.ui.BikeShareApp
87
import io.ktor.client.engine.java.Java
98
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
109
import software.amazon.lastmile.kotlin.inject.anvil.MergeComponent
@@ -15,11 +14,9 @@ import java.io.File
1514
@MergeComponent(AppScope::class)
1615
@SingleIn(AppScope::class)
1716
abstract class DesktopApplicationComponent: SharedApplicationComponent {
18-
abstract val bikeShareApp: BikeShareApp
17+
override fun httpClientEngine() = Java.create()
1918

20-
override fun getHttpClientEngine() = Java.create()
21-
22-
override fun getRoomDatabase() = createRoomDatabase()
19+
override fun appDatabase() = createRoomDatabase()
2320
}
2421

2522
fun createRoomDatabase(): AppDatabase {

compose-web/build.gradle.kts

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import org.jetbrains.compose.ExperimentalComposeLibrary
2-
31
plugins {
42
alias(libs.plugins.kotlinMultiplatform)
53
alias(libs.plugins.jetbrainsCompose)
@@ -11,6 +9,7 @@ group = "com.example"
119
version = "1.0-SNAPSHOT"
1210

1311
kotlin {
12+
@Suppress("OPT_IN_USAGE")
1413
wasmJs {
1514
moduleName = "bikeshare"
1615
browser {
@@ -40,7 +39,3 @@ kotlin {
4039
}
4140
}
4241
}
43-
44-
compose.experimental {
45-
web.application {}
46-
}

gradle/libs.versions.toml

+31-40
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,27 @@
22
kotlin = "2.1.0"
33
ksp = "2.1.0-1.0.29"
44

5-
coroutines = "1.9.0"
6-
kotlinxSerialization = "1.7.3"
7-
8-
95
androidGradlePlugin = "8.7.3"
6+
androidxActivity = "1.9.3"
7+
androidxComposeBom = "2024.12.01"
8+
androidxLifecycle = "2.8.7"
9+
androidxNavigationCompose = "2.8.5"
10+
androidxRoom = "2.7.0-alpha12"
1011
circuit = "0.24.0"
11-
kotlininject = "0.7.2"
12+
compose-multiplatform = "1.7.3"
13+
composeAdaptiveLayout = "1.0.0"
14+
coroutines = "1.9.0"
15+
junit = "4.13.2"
16+
kmpNativeCoroutines = "1.0.0-ALPHA-38"
17+
kmpObservableViewModel = "1.0.0-BETA-7"
1218
kotlin-inject-anvil = "0.1.1"
19+
kotlininject = "0.7.2"
20+
kotlinxSerialization = "1.7.3"
1321
ktor = "3.0.1"
22+
okhttp = "5.0.0-alpha.14"
1423
slf4j = "2.0.16"
15-
kmpNativeCoroutines = "1.0.0-ALPHA-38"
16-
kmpObservableViewModel = "1.0.0-BETA-7"
17-
18-
compose-multiplatform = "1.7.3"
19-
composeAdaptiveLayout = "1.0.0"
20-
androidxActivity = "1.9.3"
21-
androidxRoom = "2.7.0-alpha12"
24+
slf4jAndroid = "2.0.7-0"
2225
sqlite = "2.5.0-alpha12"
23-
androidxComposeBom = "2024.12.01"
24-
androidxNavigationCompose = "2.8.5"
25-
androidxLifecycle = "2.8.7"
26-
junit = "4.13.2"
2726

2827
minSdk = "24"
2928
targetSdk = "34"
@@ -40,50 +39,42 @@ androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", versi
4039
androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
4140
androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" }
4241
androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended" }
42+
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
43+
androidx-compose-material3-WindowSizeClass = { group = "androidx.compose.material3", name="material3-window-size-class" }
4344
androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime" }
4445
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" }
4546
androidx-compose-ui-test = { group = "androidx.compose.ui", name = "ui-test" }
4647
androidx-compose-ui-test-junit = { group = "androidx.compose.ui", name = "ui-test-junit4" }
4748
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
4849
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
4950
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
50-
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
51-
androidx-compose-material3-WindowSizeClass = { group = "androidx.compose.material3", name="material3-window-size-class" }
52-
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidxNavigationCompose" }
5351
androidx-lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" }
54-
55-
56-
compose-adaptive = { module = "org.jetbrains.compose.material3.adaptive:adaptive", version.ref = "composeAdaptiveLayout" }
57-
compose-adaptive-layout = { module = "org.jetbrains.compose.material3.adaptive:adaptive-layout", version.ref = "composeAdaptiveLayout" }
58-
59-
52+
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidxNavigationCompose" }
6053
androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "androidxRoom" }
6154
androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "androidxRoom" }
62-
sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
63-
6455
circuit-foundation = { module = "com.slack.circuit:circuit-foundation", version.ref = "circuit" }
65-
kotlinInject-compiler = { module = "me.tatarka.inject:kotlin-inject-compiler-ksp", version.ref = "kotlininject" }
66-
kotlinInject-runtime = { module = "me.tatarka.inject:kotlin-inject-runtime", version.ref = "kotlininject" }
67-
56+
compose-adaptive = { module = "org.jetbrains.compose.material3.adaptive:adaptive", version.ref = "composeAdaptiveLayout" }
57+
compose-adaptive-layout = { module = "org.jetbrains.compose.material3.adaptive:adaptive-layout", version.ref = "composeAdaptiveLayout" }
58+
junit = { module = "junit:junit", version.ref = "junit" }
59+
kmpObservableViewModel = { module = "com.rickclephas.kmp:kmp-observableviewmodel-core", version.ref = "kmpObservableViewModel" }
6860
kotlinInject-anvil-compiler = { group = "software.amazon.lastmile.kotlin.inject.anvil", name = "compiler", version.ref = "kotlin-inject-anvil" }
6961
kotlinInject-anvil-runtime = { group = "software.amazon.lastmile.kotlin.inject.anvil", name = "runtime", version.ref = "kotlin-inject-anvil" }
7062
kotlinInject-anvil-runtime-optional = { group = "software.amazon.lastmile.kotlin.inject.anvil", name = "runtime-optional", version.ref = "kotlin-inject-anvil" }
71-
72-
63+
kotlinInject-compiler = { module = "me.tatarka.inject:kotlin-inject-compiler-ksp", version.ref = "kotlininject" }
64+
kotlinInject-runtime = { module = "me.tatarka.inject:kotlin-inject-runtime", version.ref = "kotlininject" }
65+
ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
7366
ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
67+
ktor-client-ios = { group = "io.ktor", name = "ktor-client-ios", version.ref = "ktor" }
68+
ktor-client-java = { group = "io.ktor", name = "ktor-client-java", version.ref = "ktor" }
7469
ktor-client-json = { group = "io.ktor", name = "ktor-client-json", version.ref = "ktor" }
7570
ktor-client-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktor" }
71+
ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" }
7672
ktor-client-serialization = { group = "io.ktor", name = "ktor-client-serialization", version.ref = "ktor" }
77-
ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
78-
ktor-client-android = { group = "io.ktor", name = "ktor-client-android", version.ref = "ktor" }
79-
ktor-client-ios = { group = "io.ktor", name = "ktor-client-ios", version.ref = "ktor" }
80-
ktor-client-java = { group = "io.ktor", name = "ktor-client-java", version.ref = "ktor" }
8173
ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" }
74+
okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref="okhttp" }
8275
slf4j = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
83-
84-
kmpObservableViewModel = { module = "com.rickclephas.kmp:kmp-observableviewmodel-core", version.ref = "kmpObservableViewModel" }
85-
86-
junit = { module = "junit:junit", version.ref = "junit" }
76+
slf4j-android = { module = "uk.uuid.slf4j:slf4j-android", version.ref = "slf4jAndroid" }
77+
sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
8778

8879
[bundles]
8980
ktor-common = ["ktor-client-core", "ktor-client-json", "ktor-client-logging", "ktor-client-serialization", "ktor-client-content-negotiation", "ktor-serialization-kotlinx-json"]

0 commit comments

Comments
 (0)