From c6b739e511a3598f40038cd44db15bb5937c6e55 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Tue, 5 Aug 2025 00:37:28 +1000 Subject: [PATCH] refactor: large treewide renaming --- .../src/androidMain/AndroidManifest.xml | 2 +- .../moe/lava/banksia/{ => ui}/MainActivity.kt | 10 +--- .../platform}/BanksiaTheme.android.kt | 2 +- .../platform}/maps/Maps.android.kt | 34 +++++++---- .../moe/lava/banksia/native/maps/Maps.kt | 51 ---------------- .../kotlin/moe/lava/banksia/{ => ui}/App.kt | 37 ++++++------ .../moe/lava/banksia/ui/BanksiaViewModel.kt | 18 +++--- .../components/RouteIcon.kt} | 45 +++++++------- .../lava/banksia/ui/{ => layout}/InfoPanel.kt | 58 +++++++++++-------- .../lava/banksia/ui/{ => layout}/Searcher.kt | 29 ++++++---- .../{native => ui/platform}/BanksiaTheme.kt | 2 +- .../ui/platform/maps/CameraPosition.kt | 6 ++ .../ui/platform/maps/CameraPositionBounds.kt | 3 + .../moe/lava/banksia/ui/platform/maps/Maps.kt | 24 ++++++++ .../lava/banksia/ui/platform/maps/Marker.kt | 21 +++++++ .../lava/banksia/ui/platform/maps/Point.kt | 3 + .../lava/banksia/ui/platform/maps/Polyline.kt | 5 ++ .../moe/lava/banksia/ui/state/MapState.kt | 4 +- .../banksia/{ => ui}/MainViewController.kt | 2 +- .../platform}/BanksiaTheme.ios.kt | 2 +- .../{native => ui/platform}/maps/Maps.ios.kt | 2 +- server/build.gradle.kts | 2 +- .../lava/banksia/{ => server}/Application.kt | 2 +- .../banksia/{ => util}/Logging.android.kt | 2 +- .../moe/lava/banksia/api/ptv/PtvService.kt | 4 +- .../moe/lava/banksia/util/BoxedValue.kt | 0 .../kotlin/moe/lava/banksia/util/CacheMap.kt | 1 - .../moe/lava/banksia/{ => util}/Logging.kt | 4 +- .../kotlin/moe/lava/banksia/util/LoopFlow.kt | 1 - .../lava/banksia/{ => util}/Logging.ios.kt | 2 +- .../lava/banksia/{ => util}/Logging.jvm.kt | 2 +- 31 files changed, 206 insertions(+), 174 deletions(-) rename composeApp/src/androidMain/kotlin/moe/lava/banksia/{ => ui}/MainActivity.kt (68%) rename composeApp/src/androidMain/kotlin/moe/lava/banksia/{native => ui/platform}/BanksiaTheme.android.kt (95%) rename composeApp/src/androidMain/kotlin/moe/lava/banksia/{native => ui/platform}/maps/Maps.android.kt (87%) delete mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/native/maps/Maps.kt rename composeApp/src/commonMain/kotlin/moe/lava/banksia/{ => ui}/App.kt (88%) rename composeApp/src/commonMain/kotlin/moe/lava/banksia/{api/ptv/structures/RouteType.kt => ui/components/RouteIcon.kt} (81%) rename composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/{ => layout}/InfoPanel.kt (66%) rename composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/{ => layout}/Searcher.kt (77%) rename composeApp/src/commonMain/kotlin/moe/lava/banksia/{native => ui/platform}/BanksiaTheme.kt (94%) create mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPosition.kt create mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPositionBounds.kt create mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.kt create mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Marker.kt create mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Point.kt create mode 100644 composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Polyline.kt rename composeApp/src/iosMain/kotlin/moe/lava/banksia/{ => ui}/MainViewController.kt (81%) rename composeApp/src/iosMain/kotlin/moe/lava/banksia/{native => ui/platform}/BanksiaTheme.ios.kt (91%) rename composeApp/src/iosMain/kotlin/moe/lava/banksia/{native => ui/platform}/maps/Maps.ios.kt (95%) rename server/src/main/kotlin/moe/lava/banksia/{ => server}/Application.kt (93%) rename shared/src/androidMain/kotlin/moe/lava/banksia/{ => util}/Logging.android.kt (88%) rename {composeApp => shared}/src/commonMain/kotlin/moe/lava/banksia/util/BoxedValue.kt (100%) rename shared/src/commonMain/kotlin/moe/lava/banksia/{ => util}/Logging.kt (86%) rename shared/src/iosMain/kotlin/moe/lava/banksia/{ => util}/Logging.ios.kt (85%) rename shared/src/jvmMain/kotlin/moe/lava/banksia/{ => util}/Logging.jvm.kt (88%) diff --git a/composeApp/src/androidMain/AndroidManifest.xml b/composeApp/src/androidMain/AndroidManifest.xml index d1aacd5..1e57403 100644 --- a/composeApp/src/androidMain/AndroidManifest.xml +++ b/composeApp/src/androidMain/AndroidManifest.xml @@ -18,7 +18,7 @@ + android:name=".ui.MainActivity"> diff --git a/composeApp/src/androidMain/kotlin/moe/lava/banksia/MainActivity.kt b/composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/MainActivity.kt similarity index 68% rename from composeApp/src/androidMain/kotlin/moe/lava/banksia/MainActivity.kt rename to composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/MainActivity.kt index ebf9d24..1a7f2c9 100644 --- a/composeApp/src/androidMain/kotlin/moe/lava/banksia/MainActivity.kt +++ b/composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/MainActivity.kt @@ -1,11 +1,9 @@ -package moe.lava.banksia +package moe.lava.banksia.ui import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -17,9 +15,3 @@ class MainActivity : ComponentActivity() { } } } - -@Preview -@Composable -fun AppAndroidPreview() { - App() -} diff --git a/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/BanksiaTheme.android.kt b/composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.android.kt similarity index 95% rename from composeApp/src/androidMain/kotlin/moe/lava/banksia/native/BanksiaTheme.android.kt rename to composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.android.kt index 0ae9d20..4d294e8 100644 --- a/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/BanksiaTheme.android.kt +++ b/composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.android.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.native +package moe.lava.banksia.ui.platform import android.os.Build import androidx.compose.material3.ColorScheme diff --git a/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt b/composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.android.kt similarity index 87% rename from composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt rename to composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.android.kt index a7d0051..9353b18 100644 --- a/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt +++ b/composeApp/src/androidMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.android.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.native.maps +package moe.lava.banksia.ui.platform.maps import android.Manifest import android.content.pm.PackageManager @@ -41,12 +41,11 @@ import com.google.maps.android.compose.rememberCameraPositionState import com.google.maps.android.compose.rememberMarkerState import kotlinx.coroutines.flow.Flow import moe.lava.banksia.R -import moe.lava.banksia.api.ptv.structures.ComposableRouteIcon -import moe.lava.banksia.native.BanksiaTheme import moe.lava.banksia.ui.BanksiaEvent +import moe.lava.banksia.ui.components.RouteIcon +import moe.lava.banksia.ui.platform.BanksiaTheme import moe.lava.banksia.ui.state.MapState import moe.lava.banksia.util.BoxedValue -import com.google.android.gms.maps.model.CameraPosition as GoogleCameraPosition fun Point.toLatLng(): LatLng = LatLng(this.lat, this.lng) @@ -94,19 +93,30 @@ actual fun Maps( LaunchedEffect(Unit) { fusedLocation.lastLocation.addOnSuccessListener { if (it != null) { - camPos.position = GoogleCameraPosition(LatLng(it.latitude, it.longitude), 16.0f, 0.0f, 0.0f) + camPos.position = com.google.android.gms.maps.model.CameraPosition( + LatLng( + it.latitude, + it.longitude + ), 16.0f, 0.0f, 0.0f + ) setLastKnownLocation(Point(it.latitude, it.longitude)) } } } GoogleMap( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.Companion.fillMaxSize(), cameraPositionState = camPos, - mapColorScheme = if (isSystemInDarkTheme()) { ComposeMapColorScheme.DARK } else { - ComposeMapColorScheme.LIGHT }, + mapColorScheme = if (isSystemInDarkTheme()) { + ComposeMapColorScheme.DARK + } else { + ComposeMapColorScheme.LIGHT + }, properties = DefaultMapProperties.copy( - mapStyleOptions = MapStyleOptions.loadRawResourceStyle(LocalContext.current, R.raw.def_mapstyle), + mapStyleOptions = MapStyleOptions.loadRawResourceStyle( + LocalContext.current, + R.raw.def_mapstyle + ), isMyLocationEnabled = checkLocationPermission(), ), uiSettings = DefaultMapUiSettings.copy( @@ -114,7 +124,7 @@ actual fun Maps( myLocationButtonEnabled = false, mapToolbarEnabled = false, ), - contentPadding = WindowInsets.safeDrawing.add(extInsets).asPaddingValues() + contentPadding = WindowInsets.Companion.safeDrawing.add(extInsets).asPaddingValues() ) { // [TODO]: Slight lag when routes with many stops such as the 901 bus is set for (marker in state.stops) { @@ -130,7 +140,7 @@ actual fun Maps( } ) { Box( - modifier = Modifier + modifier = Modifier.Companion .size(12.dp) .clip(CircleShape) .background(BanksiaTheme.colors.surface) @@ -150,7 +160,7 @@ actual fun Maps( false } ) { - ComposableRouteIcon( + RouteIcon( size = 30.dp, routeType = marker.type, ) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/maps/Maps.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/maps/Maps.kt deleted file mode 100644 index a87eec4..0000000 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/maps/Maps.kt +++ /dev/null @@ -1,51 +0,0 @@ -package moe.lava.banksia.native.maps - -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import kotlinx.coroutines.flow.Flow -import moe.lava.banksia.api.ptv.structures.PtvRouteType -import moe.lava.banksia.ui.BanksiaEvent -import moe.lava.banksia.ui.state.MapState -import moe.lava.banksia.util.BoxedValue - -sealed class Marker { - abstract val point: Point - - data class Stop( - override val point: Point, - val id: Int, - val type: PtvRouteType, - val colour: Color, - ) : Marker() - - data class Vehicle( - override val point: Point, - val ref: String, - val type: PtvRouteType, - ) : Marker() -} -data class Point(val lat: Double, val lng: Double) -data class Polyline(val points: List, val colour: Color) - -data class CameraPositionBounds(val northeast: Point, val southwest: Point) -data class CameraPosition( - val centre: Point = Point(-37.8136, 144.9631), - val bounds: CameraPositionBounds? = null, -) - -@Composable -expect fun getScreenHeight(): Int - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -expect fun Maps( - modifier: Modifier = Modifier, - state: MapState, - onEvent: (BanksiaEvent) -> Unit, - cameraPositionFlow: Flow>, - setLastKnownLocation: (Point) -> Unit, - extInsets: WindowInsets, -) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/App.kt similarity index 88% rename from composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt rename to composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/App.kt index 6db2cb0..aba3b62 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/App.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia +package moe.lava.banksia.ui import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets @@ -41,19 +41,16 @@ import dev.icerock.moko.geo.compose.BindLocationTrackerEffect import dev.icerock.moko.geo.compose.LocationTrackerAccuracy import dev.icerock.moko.geo.compose.rememberLocationTrackerFactory import kotlinx.coroutines.launch -import moe.lava.banksia.native.BanksiaTheme -import moe.lava.banksia.native.maps.Maps -import moe.lava.banksia.native.maps.Point -import moe.lava.banksia.native.maps.getScreenHeight import moe.lava.banksia.resources.Res import moe.lava.banksia.resources.my_location_24 -import moe.lava.banksia.ui.BanksiaEvent -import moe.lava.banksia.ui.BanksiaViewModel -import moe.lava.banksia.ui.InfoPanel -import moe.lava.banksia.ui.Searcher +import moe.lava.banksia.ui.layout.InfoPanel +import moe.lava.banksia.ui.layout.Searcher +import moe.lava.banksia.ui.platform.BanksiaTheme +import moe.lava.banksia.ui.platform.maps.Maps +import moe.lava.banksia.ui.platform.maps.Point +import moe.lava.banksia.ui.platform.maps.getScreenHeight import moe.lava.banksia.ui.state.InfoPanelState import org.jetbrains.compose.resources.painterResource -import org.jetbrains.compose.ui.tooling.preview.Preview import kotlin.coroutines.cancellation.CancellationException import kotlin.math.roundToInt @@ -61,7 +58,6 @@ val MELBOURNE = Point(-37.8136, 144.9631) @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) @Composable -@Preview fun App( viewModel: BanksiaViewModel = viewModel() ) { @@ -91,7 +87,8 @@ fun App( ) { val offset = runCatching { sheetState.requireOffset() } val scaffoldOffset = offset.getOrDefault(0.0f).roundToInt() - (getScreenHeight() - scaffoldOffset - WindowInsets.safeDrawing.getBottom(LocalDensity.current)).coerceAtLeast(0) + (getScreenHeight() - scaffoldOffset - WindowInsets.Companion.safeDrawing.getBottom( + LocalDensity.current)).coerceAtLeast(0) } else 0 LaunchedEffect(infoState) { @@ -111,7 +108,7 @@ fun App( BottomSheetScaffold( scaffoldState = scaffoldState, sheetPeekHeight = (handleHeight + peekHeight) * peekHeightMultiplier, - modifier = Modifier.fillMaxSize(), + modifier = Modifier.Companion.fillMaxSize(), sheetContent = { InfoPanel( state = infoState, @@ -122,20 +119,20 @@ fun App( sheetDragHandle = { val density = LocalDensity.current Box( - Modifier + Modifier.Companion .fillMaxWidth() .padding(horizontal = 10.dp) .onSizeChanged { handleHeight = with(density) { it.height.toDp() } } ) { - BottomSheetDefaults.DragHandle(modifier = Modifier.align(Alignment.Center)) + BottomSheetDefaults.DragHandle(modifier = Modifier.Companion.align(Alignment.Companion.Center)) } }, sheetSwipeEnabled = sheetSwipeEnabled, ) { Maps( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.Companion.fillMaxSize(), state = mapState, onEvent = viewModel::handleEvent, cameraPositionFlow = viewModel.cameraChangeEmitter, @@ -178,8 +175,12 @@ fun App( } Box( - Modifier.windowInsetsPadding(WindowInsets.safeContent.add(WindowInsets(bottom = extInsets))), - contentAlignment = Alignment.BottomEnd + Modifier.Companion.windowInsetsPadding( + WindowInsets.Companion.safeContent.add( + WindowInsets(bottom = extInsets) + ) + ), + contentAlignment = Alignment.Companion.BottomEnd ) { FloatingActionButton( containerColor = MaterialTheme.colorScheme.surfaceContainer, diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/BanksiaViewModel.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/BanksiaViewModel.kt index fa1a8bb..5644851 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/BanksiaViewModel.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/BanksiaViewModel.kt @@ -18,19 +18,19 @@ import kotlinx.datetime.Instant import moe.lava.banksia.api.ptv.PtvService import moe.lava.banksia.api.ptv.structures.PtvRoute import moe.lava.banksia.api.ptv.structures.PtvRouteType -import moe.lava.banksia.api.ptv.structures.getProperties -import moe.lava.banksia.log -import moe.lava.banksia.native.maps.CameraPosition -import moe.lava.banksia.native.maps.CameraPositionBounds -import moe.lava.banksia.native.maps.Marker -import moe.lava.banksia.native.maps.Point -import moe.lava.banksia.native.maps.Polyline +import moe.lava.banksia.ui.components.getUIProperties +import moe.lava.banksia.ui.platform.maps.CameraPosition +import moe.lava.banksia.ui.platform.maps.CameraPositionBounds +import moe.lava.banksia.ui.platform.maps.Marker +import moe.lava.banksia.ui.platform.maps.Point +import moe.lava.banksia.ui.platform.maps.Polyline import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.MapState import moe.lava.banksia.ui.state.SearchState import moe.lava.banksia.util.BoxedValue import moe.lava.banksia.util.BoxedValue.Companion.box import moe.lava.banksia.util.LoopFlow.Companion.waitUntilSubscribed +import moe.lava.banksia.util.log sealed class BanksiaEvent { data object DismissState : BanksiaEvent() @@ -256,7 +256,7 @@ class BanksiaViewModel : ViewModel() { ptvService.route(route.routeId, true) else route - val colour = routeWithGeo.routeType.getProperties().colour + val colour = routeWithGeo.routeType.getUIProperties().colour val polylines = mutableListOf() val allPoints = mutableListOf() @@ -309,7 +309,7 @@ class BanksiaViewModel : ViewModel() { private suspend fun buildStops(route: PtvRoute) { val stops = ptvService.stopsByRoute(route.routeId, route.routeType) - val colour = route.routeType.getProperties().colour + val colour = route.routeType.getUIProperties().colour val markers = stops .filter { it.stopLatitude != null && it.stopLongitude != null } diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/api/ptv/structures/RouteType.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/components/RouteIcon.kt similarity index 81% rename from composeApp/src/commonMain/kotlin/moe/lava/banksia/api/ptv/structures/RouteType.kt rename to composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/components/RouteIcon.kt index 9b50daa..c048eab 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/api/ptv/structures/RouteType.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/components/RouteIcon.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.api.ptv.structures +package moe.lava.banksia.ui.components import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Row @@ -11,6 +11,7 @@ import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import moe.lava.banksia.api.ptv.structures.PtvRouteType import moe.lava.banksia.resources.Res import moe.lava.banksia.resources.bus import moe.lava.banksia.resources.bus_background @@ -31,7 +32,8 @@ data class RouteTypeProperties( val background: DrawableResource, val icon: DrawableResource, ) -fun PtvRouteType.getProperties(): RouteTypeProperties { + +fun PtvRouteType.getUIProperties(): RouteTypeProperties { val colour = when (this) { PtvRouteType.TRAIN -> Color(0xFF0072CE) PtvRouteType.TRAM -> Color(0xFF78BE20) @@ -40,34 +42,25 @@ fun PtvRouteType.getProperties(): RouteTypeProperties { } val (drawable, background, icon) = when (this) { PtvRouteType.TRAM -> Triple( - Res.drawable.tram, Res.drawable.tram_background, Res.drawable.tram_icon) + Res.drawable.tram, Res.drawable.tram_background, Res.drawable.tram_icon + ) PtvRouteType.TRAIN, PtvRouteType.VLINE -> Triple( - Res.drawable.train, Res.drawable.train_background, Res.drawable.train_icon) + Res.drawable.train, Res.drawable.train_background, Res.drawable.train_icon + ) PtvRouteType.BUS, PtvRouteType.NIGHT_BUS -> Triple( - Res.drawable.bus, Res.drawable.bus_background, Res.drawable.bus_icon) + Res.drawable.bus, Res.drawable.bus_background, Res.drawable.bus_icon + ) } return RouteTypeProperties(colour, drawable, background, icon) } -const val ICON_PADDING = 0.25f - -@Preview @Composable -private fun RouteIconPreview() { - Row { - ComposableRouteIcon(routeType = PtvRouteType.TRAIN) - ComposableRouteIcon(routeType = PtvRouteType.TRAM) - ComposableRouteIcon(routeType = PtvRouteType.BUS) - } -} - -@Composable -fun ComposableRouteIcon( - modifier: Modifier = Modifier, +fun RouteIcon( + modifier: Modifier = Modifier.Companion, size: Dp = 40.dp, routeType: PtvRouteType, ) { - val properties = routeType.getProperties() + val properties = routeType.getUIProperties() Image( painter = painterResource(properties.icon), contentDescription = null, @@ -81,5 +74,15 @@ fun ComposableRouteIcon( ) } +const val ICON_PADDING = 0.25f + +@Preview @Composable -inline fun PtvRouteType.ComposableIcon(modifier: Modifier = Modifier) = ComposableRouteIcon(modifier, routeType = this) +private fun RouteIconPreview() { + Row { + RouteIcon(routeType = PtvRouteType.TRAIN) + RouteIcon(routeType = PtvRouteType.TRAM) + RouteIcon(routeType = PtvRouteType.BUS) + } +} + diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/InfoPanel.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/layout/InfoPanel.kt similarity index 66% rename from composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/InfoPanel.kt rename to composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/layout/InfoPanel.kt index 5262a33..745f777 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/InfoPanel.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/layout/InfoPanel.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.ui +package moe.lava.banksia.ui.layout import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -29,7 +29,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.coerceAtMost import androidx.compose.ui.unit.dp -import moe.lava.banksia.api.ptv.structures.ComposableRouteIcon +import moe.lava.banksia.ui.BanksiaEvent +import moe.lava.banksia.ui.components.RouteIcon import moe.lava.banksia.ui.state.InfoPanelState @Composable @@ -44,7 +45,7 @@ fun InfoPanel( val localDensity = LocalDensity.current Column( - Modifier + Modifier.Companion .fillMaxWidth() .padding(horizontal = 24.dp) .heightIn(max = 250.dp) @@ -63,10 +64,10 @@ fun InfoPanel( if (state.loading) CircularProgressIndicator( - modifier = Modifier.width(32.dp).align(Alignment.CenterEnd) + modifier = Modifier.Companion.width(32.dp).align(Alignment.Companion.CenterEnd) ) } - Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.safeContent)) + Spacer(Modifier.Companion.windowInsetsBottomHeight(WindowInsets.Companion.safeContent)) } } @@ -75,14 +76,14 @@ private inline fun RouteInfoPanel( state: InfoPanelState.Route, onEvent: (BanksiaEvent) -> Unit, ) { - Column(Modifier.fillMaxWidth()) { + Column(Modifier.Companion.fillMaxWidth()) { Row { - ComposableRouteIcon(routeType = state.type) + RouteIcon(routeType = state.type) Text( state.name, style = MaterialTheme.typography.titleLarge, - fontWeight = FontWeight.SemiBold, - textAlign = TextAlign.Start + fontWeight = FontWeight.Companion.SemiBold, + textAlign = TextAlign.Companion.Start ) } } @@ -93,14 +94,14 @@ private inline fun RunInfoPanel( state: InfoPanelState.Run, onEvent: (BanksiaEvent) -> Unit, ) { - Column(Modifier.fillMaxWidth()) { + Column(Modifier.Companion.fillMaxWidth()) { Row { - ComposableRouteIcon(routeType = state.type) + RouteIcon(routeType = state.type) Text( "${state.direction} via ${state.routeName ?: "..."}", style = MaterialTheme.typography.titleLarge, - fontWeight = FontWeight.SemiBold, - textAlign = TextAlign.Start + fontWeight = FontWeight.Companion.SemiBold, + textAlign = TextAlign.Companion.Start ) } } @@ -111,29 +112,38 @@ private inline fun StopInfoPanel( state: InfoPanelState.Stop, onEvent: (BanksiaEvent) -> Unit, ) { - Column(Modifier.fillMaxWidth()) { + Column(Modifier.Companion.fillMaxWidth()) { Text( state.name, style = MaterialTheme.typography.titleLarge, - fontWeight = FontWeight.SemiBold, - textAlign = TextAlign.Start + fontWeight = FontWeight.Companion.SemiBold, + textAlign = TextAlign.Companion.Start ) state.subname?.let { Text( "/ $it", - modifier = Modifier.padding(start = 5.dp), + modifier = Modifier.Companion.padding(start = 5.dp), style = MaterialTheme.typography.titleSmall, - color = Color.Gray, - fontWeight = FontWeight.SemiBold, - textAlign = TextAlign.Start + color = Color.Companion.Gray, + fontWeight = FontWeight.Companion.SemiBold, + textAlign = TextAlign.Companion.Start ) } state.departures?.let { - Spacer(Modifier.height(5.dp)) + Spacer(Modifier.Companion.height(5.dp)) it.forEach { (name, formatted) -> - Row(verticalAlignment = Alignment.CenterVertically) { - Text(name, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold) - Text(formatted, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.padding(horizontal = 5.dp)) + Row(verticalAlignment = Alignment.Companion.CenterVertically) { + Text( + name, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Companion.SemiBold + ) + Text( + formatted, + maxLines = 1, + overflow = TextOverflow.Companion.Ellipsis, + modifier = Modifier.Companion.padding(horizontal = 5.dp) + ) } } } diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/Searcher.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/layout/Searcher.kt similarity index 77% rename from composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/Searcher.kt rename to composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/layout/Searcher.kt index 6afe9d8..3dbe38f 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/Searcher.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/layout/Searcher.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.ui +package moe.lava.banksia.ui.layout import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.clickable @@ -23,7 +23,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import moe.lava.banksia.api.ptv.structures.ComposableRouteIcon +import moe.lava.banksia.ui.BanksiaEvent +import moe.lava.banksia.ui.components.RouteIcon import moe.lava.banksia.ui.state.SearchState @OptIn(ExperimentalMaterial3Api::class) @@ -43,16 +44,16 @@ fun Searcher( label = "padding" ) - Box(modifier = Modifier.fillMaxSize()) { + Box(modifier = Modifier.Companion.fillMaxSize()) { SearchBar( - modifier = Modifier - .align(Alignment.TopCenter) + modifier = Modifier.Companion + .align(Alignment.Companion.TopCenter) .fillMaxWidth() .padding(horizontal = animatedPadding), shadowElevation = 6.dp, // Elevation level 3 inputField = { SearchBarDefaults.InputField( - modifier = Modifier.padding(horizontal = 20.dp - animatedPadding), + modifier = Modifier.Companion.padding(horizontal = 20.dp - animatedPadding), query = state.text, onQueryChange = { onEvent(BanksiaEvent.SearchUpdate(it)) }, onSearch = {}, @@ -64,7 +65,13 @@ fun Searcher( Icon( imageVector = Icons.Default.Clear, contentDescription = null, - modifier = Modifier.clickable { onEvent(BanksiaEvent.SearchUpdate("")) } + modifier = Modifier.Companion.clickable { + onEvent( + BanksiaEvent.SearchUpdate( + "" + ) + ) + } ) } ) @@ -72,15 +79,15 @@ fun Searcher( expanded = expanded, onExpandedChange = onExpandedChange, ) { - LazyColumn(modifier = Modifier.fillMaxWidth()) { + LazyColumn(modifier = Modifier.Companion.fillMaxWidth()) { for (entry in state.entries) { item { ListItem( headlineContent = { Text(entry.mainText) }, supportingContent = { entry.subText?.let { Text(it) } }, - leadingContent = { ComposableRouteIcon(routeType = entry.routeType) }, - colors = ListItemDefaults.colors(containerColor = Color.Transparent), - modifier = Modifier + leadingContent = { RouteIcon(routeType = entry.routeType) }, + colors = ListItemDefaults.colors(containerColor = Color.Companion.Transparent), + modifier = Modifier.Companion .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 4.dp) .clickable { diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/BanksiaTheme.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.kt similarity index 94% rename from composeApp/src/commonMain/kotlin/moe/lava/banksia/native/BanksiaTheme.kt rename to composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.kt index 4f2d298..7c3367c 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/BanksiaTheme.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.native +package moe.lava.banksia.ui.platform import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.ColorScheme diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPosition.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPosition.kt new file mode 100644 index 0000000..0e9ad04 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPosition.kt @@ -0,0 +1,6 @@ +package moe.lava.banksia.ui.platform.maps + +data class CameraPosition( + val centre: Point = Point(-37.8136, 144.9631), + val bounds: CameraPositionBounds? = null, +) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPositionBounds.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPositionBounds.kt new file mode 100644 index 0000000..3e1f1e4 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/CameraPositionBounds.kt @@ -0,0 +1,3 @@ +package moe.lava.banksia.ui.platform.maps + +data class CameraPositionBounds(val northeast: Point, val southwest: Point) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.kt new file mode 100644 index 0000000..b14d430 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.kt @@ -0,0 +1,24 @@ +package moe.lava.banksia.ui.platform.maps + +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import kotlinx.coroutines.flow.Flow +import moe.lava.banksia.ui.BanksiaEvent +import moe.lava.banksia.ui.state.MapState +import moe.lava.banksia.util.BoxedValue + +@Composable +expect fun getScreenHeight(): Int + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +expect fun Maps( + modifier: Modifier = Modifier.Companion, + state: MapState, + onEvent: (BanksiaEvent) -> Unit, + cameraPositionFlow: Flow>, + setLastKnownLocation: (Point) -> Unit, + extInsets: WindowInsets, +) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Marker.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Marker.kt new file mode 100644 index 0000000..9ad25b3 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Marker.kt @@ -0,0 +1,21 @@ +package moe.lava.banksia.ui.platform.maps + +import androidx.compose.ui.graphics.Color +import moe.lava.banksia.api.ptv.structures.PtvRouteType + +sealed class Marker { + abstract val point: Point + + data class Stop( + override val point: Point, + val id: Int, + val type: PtvRouteType, + val colour: Color, + ) : Marker() + + data class Vehicle( + override val point: Point, + val ref: String, + val type: PtvRouteType, + ) : Marker() +} diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Point.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Point.kt new file mode 100644 index 0000000..840328a --- /dev/null +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Point.kt @@ -0,0 +1,3 @@ +package moe.lava.banksia.ui.platform.maps + +data class Point(val lat: Double, val lng: Double) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Polyline.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Polyline.kt new file mode 100644 index 0000000..1721454 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/platform/maps/Polyline.kt @@ -0,0 +1,5 @@ +package moe.lava.banksia.ui.platform.maps + +import androidx.compose.ui.graphics.Color + +data class Polyline(val points: List, val colour: Color) diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/state/MapState.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/state/MapState.kt index 15258a1..d06018c 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/state/MapState.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/ui/state/MapState.kt @@ -1,7 +1,7 @@ package moe.lava.banksia.ui.state -import moe.lava.banksia.native.maps.Marker -import moe.lava.banksia.native.maps.Polyline +import moe.lava.banksia.ui.platform.maps.Marker +import moe.lava.banksia.ui.platform.maps.Polyline data class MapState( val stops: List = listOf(), diff --git a/composeApp/src/iosMain/kotlin/moe/lava/banksia/MainViewController.kt b/composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/MainViewController.kt similarity index 81% rename from composeApp/src/iosMain/kotlin/moe/lava/banksia/MainViewController.kt rename to composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/MainViewController.kt index 9c140c7..0ea9193 100644 --- a/composeApp/src/iosMain/kotlin/moe/lava/banksia/MainViewController.kt +++ b/composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/MainViewController.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia +package moe.lava.banksia.ui import androidx.compose.ui.window.ComposeUIViewController diff --git a/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/BanksiaTheme.ios.kt b/composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.ios.kt similarity index 91% rename from composeApp/src/iosMain/kotlin/moe/lava/banksia/native/BanksiaTheme.ios.kt rename to composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.ios.kt index 234025b..8ed5bf0 100644 --- a/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/BanksiaTheme.ios.kt +++ b/composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/platform/BanksiaTheme.ios.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.native +package moe.lava.banksia.ui.platform import androidx.compose.material3.ColorScheme import androidx.compose.material3.darkColorScheme diff --git a/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt b/composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.ios.kt similarity index 95% rename from composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt rename to composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.ios.kt index b2f134c..fb87278 100644 --- a/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt +++ b/composeApp/src/iosMain/kotlin/moe/lava/banksia/ui/platform/maps/Maps.ios.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia.native.maps +package moe.lava.banksia.ui.platform.maps import androidx.compose.foundation.layout.WindowInsets import androidx.compose.material3.ExperimentalMaterial3Api diff --git a/server/build.gradle.kts b/server/build.gradle.kts index be8adbd..01f96da 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -7,7 +7,7 @@ plugins { group = "moe.lava.banksia" version = "1.0.0" application { - mainClass.set("moe.lava.banksia.ApplicationKt") + mainClass.set("moe.lava.banksia.server.ApplicationKt") applicationDefaultJvmArgs = listOf("-Dio.ktor.development=${extra["io.ktor.development"] ?: "false"}") } diff --git a/server/src/main/kotlin/moe/lava/banksia/Application.kt b/server/src/main/kotlin/moe/lava/banksia/server/Application.kt similarity index 93% rename from server/src/main/kotlin/moe/lava/banksia/Application.kt rename to server/src/main/kotlin/moe/lava/banksia/server/Application.kt index 57115f2..6ef6271 100644 --- a/server/src/main/kotlin/moe/lava/banksia/Application.kt +++ b/server/src/main/kotlin/moe/lava/banksia/server/Application.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia +package moe.lava.banksia.server import io.ktor.server.application.Application import io.ktor.server.engine.embeddedServer diff --git a/shared/src/androidMain/kotlin/moe/lava/banksia/Logging.android.kt b/shared/src/androidMain/kotlin/moe/lava/banksia/util/Logging.android.kt similarity index 88% rename from shared/src/androidMain/kotlin/moe/lava/banksia/Logging.android.kt rename to shared/src/androidMain/kotlin/moe/lava/banksia/util/Logging.android.kt index dd6b2d9..31c3072 100644 --- a/shared/src/androidMain/kotlin/moe/lava/banksia/Logging.android.kt +++ b/shared/src/androidMain/kotlin/moe/lava/banksia/util/Logging.android.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia +package moe.lava.banksia.util import android.util.Log diff --git a/shared/src/commonMain/kotlin/moe/lava/banksia/api/ptv/PtvService.kt b/shared/src/commonMain/kotlin/moe/lava/banksia/api/ptv/PtvService.kt index e3771d8..7f05dbe 100644 --- a/shared/src/commonMain/kotlin/moe/lava/banksia/api/ptv/PtvService.kt +++ b/shared/src/commonMain/kotlin/moe/lava/banksia/api/ptv/PtvService.kt @@ -24,10 +24,10 @@ import moe.lava.banksia.api.ptv.structures.PtvRoute import moe.lava.banksia.api.ptv.structures.PtvRouteType import moe.lava.banksia.api.ptv.structures.PtvRun import moe.lava.banksia.api.ptv.structures.PtvStop -import moe.lava.banksia.error -import moe.lava.banksia.log import moe.lava.banksia.util.CacheMap import moe.lava.banksia.util.LoopFlow.Companion.initWith +import moe.lava.banksia.util.error +import moe.lava.banksia.util.log import moe.lava.banksia.util.loopFlow import okio.ByteString.Companion.encodeUtf8 import kotlin.random.Random diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/util/BoxedValue.kt b/shared/src/commonMain/kotlin/moe/lava/banksia/util/BoxedValue.kt similarity index 100% rename from composeApp/src/commonMain/kotlin/moe/lava/banksia/util/BoxedValue.kt rename to shared/src/commonMain/kotlin/moe/lava/banksia/util/BoxedValue.kt diff --git a/shared/src/commonMain/kotlin/moe/lava/banksia/util/CacheMap.kt b/shared/src/commonMain/kotlin/moe/lava/banksia/util/CacheMap.kt index 4605505..f04d2e9 100644 --- a/shared/src/commonMain/kotlin/moe/lava/banksia/util/CacheMap.kt +++ b/shared/src/commonMain/kotlin/moe/lava/banksia/util/CacheMap.kt @@ -3,7 +3,6 @@ package moe.lava.banksia.util import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import moe.lava.banksia.error class CacheMap( coroutineScope: CoroutineScope, diff --git a/shared/src/commonMain/kotlin/moe/lava/banksia/Logging.kt b/shared/src/commonMain/kotlin/moe/lava/banksia/util/Logging.kt similarity index 86% rename from shared/src/commonMain/kotlin/moe/lava/banksia/Logging.kt rename to shared/src/commonMain/kotlin/moe/lava/banksia/util/Logging.kt index 16f42d6..2fe62a4 100644 --- a/shared/src/commonMain/kotlin/moe/lava/banksia/Logging.kt +++ b/shared/src/commonMain/kotlin/moe/lava/banksia/util/Logging.kt @@ -1,5 +1,5 @@ -package moe.lava.banksia +package moe.lava.banksia.util -expect fun log(tag: String, msg: String) fun error(tag: String, throwable: Throwable) = error(tag, "", throwable) +expect fun log(tag: String, msg: String) expect fun error(tag: String, msg: String, throwable: Throwable? = null) diff --git a/shared/src/commonMain/kotlin/moe/lava/banksia/util/LoopFlow.kt b/shared/src/commonMain/kotlin/moe/lava/banksia/util/LoopFlow.kt index 95c71b0..c4127d0 100644 --- a/shared/src/commonMain/kotlin/moe/lava/banksia/util/LoopFlow.kt +++ b/shared/src/commonMain/kotlin/moe/lava/banksia/util/LoopFlow.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first -import moe.lava.banksia.log import kotlin.experimental.ExperimentalTypeInference @OptIn(ExperimentalCoroutinesApi::class) diff --git a/shared/src/iosMain/kotlin/moe/lava/banksia/Logging.ios.kt b/shared/src/iosMain/kotlin/moe/lava/banksia/util/Logging.ios.kt similarity index 85% rename from shared/src/iosMain/kotlin/moe/lava/banksia/Logging.ios.kt rename to shared/src/iosMain/kotlin/moe/lava/banksia/util/Logging.ios.kt index b16e01c..b58b89a 100644 --- a/shared/src/iosMain/kotlin/moe/lava/banksia/Logging.ios.kt +++ b/shared/src/iosMain/kotlin/moe/lava/banksia/util/Logging.ios.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia +package moe.lava.banksia.util actual fun log(tag: String, msg: String) { TODO("Not yet implemented") diff --git a/shared/src/jvmMain/kotlin/moe/lava/banksia/Logging.jvm.kt b/shared/src/jvmMain/kotlin/moe/lava/banksia/util/Logging.jvm.kt similarity index 88% rename from shared/src/jvmMain/kotlin/moe/lava/banksia/Logging.jvm.kt rename to shared/src/jvmMain/kotlin/moe/lava/banksia/util/Logging.jvm.kt index df35a04..0a1ea10 100644 --- a/shared/src/jvmMain/kotlin/moe/lava/banksia/Logging.jvm.kt +++ b/shared/src/jvmMain/kotlin/moe/lava/banksia/util/Logging.jvm.kt @@ -1,4 +1,4 @@ -package moe.lava.banksia +package moe.lava.banksia.util actual fun log(tag: String, msg: String) { println("[$tag] $msg")