refactor: split composeApp to client and ui

also renamed client.datasource to client.data, which made me realise
.gitignore was ignoring `data` and therefore some gtfsr source files
😭
This commit is contained in:
Cilly Leang 2026-03-02 00:09:33 +11:00
parent d3edabce36
commit 74338d6dce
Signed by: cilly
GPG key ID: 6500251E087653C9
62 changed files with 121 additions and 23 deletions

2
.gitignore vendored
View file

@ -19,4 +19,4 @@ captures
secrets.properties secrets.properties
shared/src/commonMain/kotlin/moe/lava/banksia/Constants.kt shared/src/commonMain/kotlin/moe/lava/banksia/Constants.kt
data/ /data/

55
client/build.gradle.kts Normal file
View file

@ -0,0 +1,55 @@
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.kotlinSerialization)
alias(libs.plugins.androidLibrary)
}
kotlin {
androidTarget {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
compilerOptions {
freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime")
}
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
androidMain.dependencies {
implementation(libs.compose.ui.tooling.preview)
implementation(libs.androidx.activity.compose)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.play.services.location)
}
commonMain.dependencies {
implementation(libs.koin.core)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.kotlinx.datetime)
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.contentnegotiation)
implementation(libs.ktor.serialization.kotlinx.json)
implementation(projects.shared)
}
}
}
android {
namespace = "moe.lava.banksia.client"
compileSdk = libs.versions.android.compileSdk.get().toInt()
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
defaultConfig {
minSdk = libs.versions.android.minSdk.get().toInt()
}
}

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.datasource.local package moe.lava.banksia.client.data.route
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
import moe.lava.banksia.room.dao.RouteDao import moe.lava.banksia.room.dao.RouteDao

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.datasource.remote package moe.lava.banksia.client.data.route
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.datasource.local package moe.lava.banksia.client.data.stop
import moe.lava.banksia.model.Stop import moe.lava.banksia.model.Stop
import moe.lava.banksia.room.dao.RouteDao import moe.lava.banksia.room.dao.RouteDao

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.client.datasource.remote package moe.lava.banksia.client.data.stop
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body

View file

@ -8,17 +8,15 @@ import io.ktor.client.plugins.plugin
import io.ktor.serialization.kotlinx.json.json import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import moe.lava.banksia.Constants import moe.lava.banksia.Constants
import moe.lava.banksia.client.datasource.local.RouteLocalDataSource import moe.lava.banksia.client.data.route.RouteLocalDataSource
import moe.lava.banksia.client.datasource.local.StopLocalDataSource import moe.lava.banksia.client.data.route.RouteRemoteDataSource
import moe.lava.banksia.client.datasource.remote.RouteRemoteDataSource import moe.lava.banksia.client.data.stop.StopLocalDataSource
import moe.lava.banksia.client.datasource.remote.StopRemoteDataSource import moe.lava.banksia.client.data.stop.StopRemoteDataSource
import moe.lava.banksia.client.repository.RouteRepository import moe.lava.banksia.client.repository.RouteRepository
import moe.lava.banksia.client.repository.StopRepository import moe.lava.banksia.client.repository.StopRepository
import moe.lava.banksia.data.ptv.PtvService import moe.lava.banksia.data.ptv.PtvService
import moe.lava.banksia.ui.screens.map.MapScreenViewModel
import moe.lava.banksia.util.log import moe.lava.banksia.util.log
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module import org.koin.dsl.module
val ClientModule = module { val ClientModule = module {
@ -52,7 +50,4 @@ val ClientModule = module {
// Repositories // Repositories
singleOf(::RouteRepository) singleOf(::RouteRepository)
singleOf(::StopRepository) singleOf(::StopRepository)
// ViewModel
viewModelOf(::MapScreenViewModel)
} }

View file

@ -2,8 +2,8 @@ package moe.lava.banksia.client.repository
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import moe.lava.banksia.client.datasource.local.RouteLocalDataSource import moe.lava.banksia.client.data.route.RouteLocalDataSource
import moe.lava.banksia.client.datasource.remote.RouteRemoteDataSource import moe.lava.banksia.client.data.route.RouteRemoteDataSource
class RouteRepository( class RouteRepository(
private val local: RouteLocalDataSource, private val local: RouteLocalDataSource,

View file

@ -2,8 +2,8 @@ package moe.lava.banksia.client.repository
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import moe.lava.banksia.client.datasource.local.StopLocalDataSource import moe.lava.banksia.client.data.stop.StopLocalDataSource
import moe.lava.banksia.client.datasource.remote.StopRemoteDataSource import moe.lava.banksia.client.data.stop.StopRemoteDataSource
class StopRepository( class StopRepository(
private val local: StopLocalDataSource, private val local: StopLocalDataSource,

View file

@ -28,6 +28,7 @@ dependencyResolutionManagement {
} }
} }
include(":composeApp") include(":client")
include(":server") include(":server")
include(":shared") include(":shared")
include(":ui")

View file

@ -0,0 +1,12 @@
package moe.lava.banksia.data.gtfsr
import com.google.transit.realtime.FeedMessage
abstract class GtfsRealtime(protected val data: FeedMessage) {
companion object {
inline fun <T: GtfsRealtime> parse(ctor: (FeedMessage) -> T, data: ByteArray): T {
val message = FeedMessage.ADAPTER.decode(data)
return ctor(message)
}
}
}

View file

@ -0,0 +1,22 @@
package moe.lava.banksia.data.gtfsr
import com.google.transit.realtime.FeedMessage
import moe.lava.banksia.util.Point
class RealtimeVehiclePositions(data: FeedMessage) : GtfsRealtime(data) {
private val positions = mutableMapOf<String, Point>()
init {
data.entity
.mapNotNull { ent ->
if (ent.vehicle?.position == null) return@mapNotNull null
ent.id to ent.vehicle.position.run {
Point(latitude.toDouble(), longitude.toDouble())
}
}
.let { positions.putAll(it) }
}
fun getAll() = positions.toMap()
fun forTrip(tripId: String) = positions[tripId]
}

View file

@ -34,7 +34,6 @@ kotlin {
} }
sourceSets { sourceSets {
androidMain.dependencies { androidMain.dependencies {
implementation(libs.compose.ui.tooling.preview) implementation(libs.compose.ui.tooling.preview)
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose)
@ -63,8 +62,10 @@ kotlin {
implementation(libs.maplibre.compose) implementation(libs.maplibre.compose)
implementation(libs.moko.geo) implementation(libs.moko.geo)
implementation(libs.moko.geo.compose) implementation(libs.moko.geo.compose)
implementation(projects.shared)
implementation(libs.ui.backhandler) implementation(libs.ui.backhandler)
implementation(projects.client)
implementation(projects.shared)
} }
} }
} }

View file

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

View file

@ -3,8 +3,8 @@ package moe.lava.banksia.ui
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import moe.lava.banksia.client.di.ClientModule
import moe.lava.banksia.di.CommonModules import moe.lava.banksia.di.CommonModules
import moe.lava.banksia.ui.di.AppModule
import moe.lava.banksia.ui.screens.map.MapScreen import moe.lava.banksia.ui.screens.map.MapScreen
import org.koin.compose.KoinMultiplatformApplication import org.koin.compose.KoinMultiplatformApplication
import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.annotation.KoinExperimentalAPI
@ -14,7 +14,7 @@ import org.koin.dsl.koinConfiguration
@Composable @Composable
fun App() { fun App() {
KoinMultiplatformApplication(config = koinConfiguration { KoinMultiplatformApplication(config = koinConfiguration {
modules(CommonModules, ClientModule) modules(CommonModules, AppModule)
}) { }) {
MapScreen() MapScreen()
} }

View file

@ -0,0 +1,12 @@
package moe.lava.banksia.ui.di
import moe.lava.banksia.client.di.ClientModule
import moe.lava.banksia.ui.screens.map.MapScreenViewModel
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
val AppModule = module {
includes(ClientModule)
// ViewModel
viewModelOf(::MapScreenViewModel)
}