refactor(ui): move maps to common code

iOS should work again, probably
This commit is contained in:
Cilly Leang 2026-02-27 22:53:38 +11:00
parent b9fa8f77c7
commit fb53422aac
Signed by: cilly
GPG key ID: 6500251E087653C9
14 changed files with 35 additions and 115 deletions

View file

@ -15,7 +15,7 @@ import moe.lava.banksia.client.datasource.remote.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.MapScreenViewModel 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.core.module.dsl.viewModelOf

View file

@ -5,7 +5,7 @@ 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.client.di.ClientModule
import moe.lava.banksia.di.CommonModules import moe.lava.banksia.di.CommonModules
import moe.lava.banksia.ui.screens.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
import org.koin.dsl.koinConfiguration import org.koin.dsl.koinConfiguration

View file

@ -27,7 +27,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.coerceAtMost import androidx.compose.ui.unit.coerceAtMost
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.lava.banksia.ui.components.RouteIcon import moe.lava.banksia.ui.components.RouteIcon
import moe.lava.banksia.ui.screens.MapScreenEvent import moe.lava.banksia.ui.screens.map.MapScreenEvent
import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.InfoPanelState
@Composable @Composable

View file

@ -24,7 +24,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.lava.banksia.ui.components.RouteIcon import moe.lava.banksia.ui.components.RouteIcon
import moe.lava.banksia.ui.screens.MapScreenEvent import moe.lava.banksia.ui.screens.map.MapScreenEvent
import moe.lava.banksia.ui.state.SearchState import moe.lava.banksia.ui.state.SearchState
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)

View file

@ -1,25 +0,0 @@
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.screens.MapScreenEvent
import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.util.BoxedValue
import moe.lava.banksia.util.Point
@Composable
expect fun getScreenHeight(): Int
@OptIn(ExperimentalMaterial3Api::class)
@Composable
expect fun Maps(
modifier: Modifier = Modifier.Companion,
state: MapState,
onEvent: (MapScreenEvent) -> Unit,
cameraPositionFlow: Flow<BoxedValue<CameraPosition>>,
setLastKnownLocation: (Point) -> Unit,
extInsets: WindowInsets,
)

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui.screens package moe.lava.banksia.ui.screens.map
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
@ -36,7 +36,6 @@ import moe.lava.banksia.ui.layout.InfoPanel
import moe.lava.banksia.ui.layout.Searcher import moe.lava.banksia.ui.layout.Searcher
import moe.lava.banksia.ui.layout.SheetStateWrapper import moe.lava.banksia.ui.layout.SheetStateWrapper
import moe.lava.banksia.ui.platform.BanksiaTheme import moe.lava.banksia.ui.platform.BanksiaTheme
import moe.lava.banksia.ui.platform.maps.Maps
import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.InfoPanelState
import moe.lava.banksia.util.Point import moe.lava.banksia.util.Point
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui.screens package moe.lava.banksia.ui.screens.map
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -20,13 +20,13 @@ import moe.lava.banksia.data.ptv.structures.PtvRoute
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
import moe.lava.banksia.model.RouteType import moe.lava.banksia.model.RouteType
import moe.lava.banksia.ui.components.getUIProperties 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.Polyline
import moe.lava.banksia.ui.state.InfoPanelState import moe.lava.banksia.ui.state.InfoPanelState
import moe.lava.banksia.ui.state.MapState import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.ui.state.SearchState import moe.lava.banksia.ui.state.SearchState
import moe.lava.banksia.ui.utils.map.CameraPosition
import moe.lava.banksia.ui.utils.map.CameraPositionBounds
import moe.lava.banksia.ui.utils.map.Marker
import moe.lava.banksia.ui.utils.map.Polyline
import moe.lava.banksia.util.BoxedValue import moe.lava.banksia.util.BoxedValue
import moe.lava.banksia.util.BoxedValue.Companion.box import moe.lava.banksia.util.BoxedValue.Companion.box
import moe.lava.banksia.util.LoopFlow.Companion.waitUntilSubscribed import moe.lava.banksia.util.LoopFlow.Companion.waitUntilSubscribed

View file

@ -1,10 +1,7 @@
@file:Suppress("COMPOSE_APPLIER_CALL_MISMATCH") @file:Suppress("COMPOSE_APPLIER_CALL_MISMATCH")
package moe.lava.banksia.ui.platform.maps package moe.lava.banksia.ui.screens.map
import android.Manifest
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.add import androidx.compose.foundation.layout.add
import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.asPaddingValues
@ -13,15 +10,9 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.android.gms.location.LocationServices
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
@ -29,9 +20,9 @@ import kotlinx.serialization.json.decodeFromJsonElement
import moe.lava.banksia.model.RouteType import moe.lava.banksia.model.RouteType
import moe.lava.banksia.ui.components.getUIProperties import moe.lava.banksia.ui.components.getUIProperties
import moe.lava.banksia.ui.platform.BanksiaTheme import moe.lava.banksia.ui.platform.BanksiaTheme
import moe.lava.banksia.ui.screens.MELBOURNE
import moe.lava.banksia.ui.screens.MapScreenEvent
import moe.lava.banksia.ui.state.MapState import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.ui.utils.map.CameraPosition
import moe.lava.banksia.ui.utils.map.Marker
import moe.lava.banksia.util.BoxedValue import moe.lava.banksia.util.BoxedValue
import moe.lava.banksia.util.Point import moe.lava.banksia.util.Point
import moe.lava.banksia.util.log import moe.lava.banksia.util.log
@ -54,24 +45,11 @@ import org.maplibre.spatialk.geojson.FeatureCollection
import org.maplibre.spatialk.geojson.Position import org.maplibre.spatialk.geojson.Position
import org.maplibre.spatialk.geojson.dsl.addFeature import org.maplibre.spatialk.geojson.dsl.addFeature
import org.maplibre.spatialk.geojson.dsl.buildFeatureCollection import org.maplibre.spatialk.geojson.dsl.buildFeatureCollection
import org.maplibre.compose.camera.CameraPosition as MLCameraPosition import org.maplibre.compose.camera.CameraPosition as MLCameraPosition
import org.maplibre.spatialk.geojson.Point as MLPoint import org.maplibre.spatialk.geojson.Point as MLPoint
fun Point.toPos(): Position = Position(this.lng, this.lat) fun Point.toPos(): Position = Position(this.lng, this.lat)
@Composable
private fun checkLocationPermission() =
ContextCompat.checkSelfPermission(LocalContext.current, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
@Composable
actual fun getScreenHeight(): Int {
val dp = LocalConfiguration.current.screenHeightDp.dp
return with(LocalDensity.current) {
dp.roundToPx()
}
}
@Serializable @Serializable
data class MarkerProps( data class MarkerProps(
val type: RouteType, val type: RouteType,
@ -108,7 +86,7 @@ private val colorTypeExpression @Composable get() = switch(
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
actual fun Maps( fun Maps(
modifier: Modifier, modifier: Modifier,
state: MapState, state: MapState,
onEvent: (MapScreenEvent) -> Unit, onEvent: (MapScreenEvent) -> Unit,
@ -141,21 +119,21 @@ actual fun Maps(
)) ))
} }
} }
//
val ctx = LocalContext.current // val ctx = LocalContext.current
val fusedLocation = remember { LocationServices.getFusedLocationProviderClient(ctx) } // val fusedLocation = remember { LocationServices.getFusedLocationProviderClient(ctx) }
LaunchedEffect(Unit) { // LaunchedEffect(Unit) {
@SuppressLint("MissingPermission") // @SuppressLint("MissingPermission")
fusedLocation.lastLocation.addOnSuccessListener { // fusedLocation.lastLocation.addOnSuccessListener {
if (it != null) { // if (it != null) {
camPos.position = MLCameraPosition( // camPos.position = MLCameraPosition(
zoom = 16.0, // zoom = 16.0,
target = Position(it.longitude, it.latitude) // target = Position(it.longitude, it.latitude)
) // )
setLastKnownLocation(Point(it.latitude, it.longitude)) // setLastKnownLocation(Point(it.latitude, it.longitude))
} // }
} // }
} // }
MaplibreMap( MaplibreMap(
modifier = modifier, modifier = modifier,

View file

@ -1,7 +1,7 @@
package moe.lava.banksia.ui.state package moe.lava.banksia.ui.state
import moe.lava.banksia.ui.platform.maps.Marker import moe.lava.banksia.ui.utils.map.Marker
import moe.lava.banksia.ui.platform.maps.Polyline import moe.lava.banksia.ui.utils.map.Polyline
data class MapState( data class MapState(
val stops: List<Marker.Stop> = listOf(), val stops: List<Marker.Stop> = listOf(),

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui.platform.maps package moe.lava.banksia.ui.utils.map
import moe.lava.banksia.util.Point import moe.lava.banksia.util.Point

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui.platform.maps package moe.lava.banksia.ui.utils.map
import moe.lava.banksia.util.Point import moe.lava.banksia.util.Point

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui.platform.maps package moe.lava.banksia.ui.utils.map
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import moe.lava.banksia.model.RouteType import moe.lava.banksia.model.RouteType

View file

@ -1,4 +1,4 @@
package moe.lava.banksia.ui.platform.maps package moe.lava.banksia.ui.utils.map
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import moe.lava.banksia.util.Point import moe.lava.banksia.util.Point

View file

@ -1,32 +0,0 @@
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.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalWindowInfo
import kotlinx.coroutines.flow.Flow
import moe.lava.banksia.ui.screens.MapScreenEvent
import moe.lava.banksia.ui.state.MapState
import moe.lava.banksia.util.BoxedValue
import moe.lava.banksia.util.Point
@OptIn(ExperimentalComposeUiApi::class)
@Composable
actual fun getScreenHeight(): Int {
return LocalWindowInfo.current.containerSize.height
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
actual fun Maps(
modifier: Modifier,
state: MapState,
onEvent: (MapScreenEvent) -> Unit,
cameraPositionFlow: Flow<BoxedValue<CameraPosition>>,
setLastKnownLocation: (Point) -> Unit,
extInsets: WindowInsets,
) {
TODO("Not yet implemented")
}