refactor(ui): move maps to common code
iOS should work again, probably
This commit is contained in:
parent
b9fa8f77c7
commit
fb53422aac
14 changed files with 35 additions and 115 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
)
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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,
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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")
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue