feat(android): init basic marker and polylines

This commit is contained in:
LavaDesu 2025-04-14 02:02:06 +10:00
parent 89ffc02e1d
commit 0ffd415874
Signed by: cilly
GPG key ID: 6500251E087653C9
5 changed files with 126 additions and 12 deletions

View file

@ -41,6 +41,7 @@ kotlin {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material)
implementation(compose.material3)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)

View file

@ -1,13 +1,96 @@
package moe.lava.banksia.native.maps
import android.app.ActivityManager
import android.content.Context
import android.os.Build
import android.util.DisplayMetrics
import android.view.View
import android.view.WindowManager
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.add
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetState
import androidx.compose.material3.SheetValue
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import com.google.android.gms.maps.model.CameraPosition
import com.google.android.gms.maps.model.LatLng
import com.google.maps.android.compose.ComposeMapColorScheme
import com.google.maps.android.compose.DefaultMapProperties
import com.google.maps.android.compose.DefaultMapUiSettings
import com.google.maps.android.compose.GoogleMap
import com.google.maps.android.compose.Marker
import com.google.maps.android.compose.Polyline
import com.google.maps.android.compose.rememberCameraPositionState
import kotlin.math.roundToInt
fun Point.toLatLng(): LatLng = LatLng(this.lat, this.lng)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
actual fun Maps(
modifier: Modifier,
markers: List<Marker>
markers: List<Marker>,
polylines: List<Polyline>,
cameraPosition: Point,
sheetState: SheetState,
) {
GoogleMap()
val extInsets = if (
sheetState.currentValue != SheetValue.Hidden ||
sheetState.targetValue != SheetValue.Hidden
) {
val context = LocalContext.current
val windowManager = remember { context.getSystemService(Context.WINDOW_SERVICE) as WindowManager }
val screenHeight = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
windowManager.currentWindowMetrics.bounds.height()
else {
var outMetrics = DisplayMetrics()
@Suppress("DEPRECATION")
windowManager.defaultDisplay.getMetrics(outMetrics)
outMetrics.heightPixels
}
val scaffoldOffset = sheetState.requireOffset().roundToInt()
(screenHeight - scaffoldOffset - WindowInsets.safeDrawing.getBottom(LocalDensity.current)).coerceAtLeast(0)
} else 0
var camPos = rememberCameraPositionState()
LaunchedEffect(cameraPosition) {
camPos.position = CameraPosition(cameraPosition.toLatLng(), 16.0f, 0.0f, 0.0f)
}
GoogleMap(
modifier = Modifier.fillMaxSize(),
cameraPositionState = camPos,
mapColorScheme = ComposeMapColorScheme.FOLLOW_SYSTEM,
properties = DefaultMapProperties.copy(
//mapStyleOptions = MapStyleOptions.loadRawResourceStyle(LocalContext.current, R.raw.def_mapstyle),
//isMyLocationEnabled = checkLocationPermission(),
),
uiSettings = DefaultMapUiSettings.copy(
zoomControlsEnabled = false,
myLocationButtonEnabled = false,
mapToolbarEnabled = false,
),
contentPadding = WindowInsets.safeDrawing.add(WindowInsets(bottom = extInsets)).asPaddingValues()
) {
for (marker in markers) {
Marker(
name = marker.name,
onClick = marker.onClick
)
}
for (polyline in polylines) {
Polyline(
points = polyline.points.map { it.toLatLng() },
color = polyline.colour
)
}
}
}

View file

@ -2,14 +2,16 @@ package moe.lava.banksia
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.BottomSheetScaffold
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material3.BottomSheetScaffold
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetValue
import androidx.compose.material3.rememberBottomSheetScaffoldState
import androidx.compose.material3.rememberStandardBottomSheetState
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@ -20,12 +22,25 @@ import banksia.composeapp.generated.resources.Res
import banksia.composeapp.generated.resources.compose_multiplatform
import moe.lava.banksia.native.maps.Maps
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@Preview
fun App() {
val scaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.Hidden,
skipHiddenState = false
)
)
MaterialTheme {
Scaffold {
Maps(modifier = Modifier.fillMaxSize())
BottomSheetScaffold(
scaffoldState = scaffoldState,
sheetContent = { Box(modifier = Modifier) },
) {
Maps(
modifier = Modifier.fillMaxSize(),
sheetState = scaffoldState.bottomSheetState,
)
}
}
}

View file

@ -1,12 +1,21 @@
package moe.lava.banksia.native.maps
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
data class Marker(val name: String)
data class Marker(val name: String, val onClick: () -> Boolean)
data class Point(val lat: Double, val lng: Double)
data class Polyline(val points: List<Point>, val colour: Color)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
expect fun Maps(
modifier: Modifier = Modifier,
markers: List<Marker> = listOf()
markers: List<Marker> = listOf(),
polylines: List<Polyline> = listOf(),
cameraPosition: Point = Point(-37.8136, 144.9631),
sheetState: SheetState,
)

View file

@ -1,12 +1,18 @@
package moe.lava.banksia.native.maps
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@OptIn(ExperimentalMaterial3Api::class)
@Composable
actual fun Maps(
modifier: Modifier,
markers: List<Marker>
markers: List<Marker>,
polylines: List<Polyline>,
cameraPosition: Point,
sheetState: SheetState,
) {
TODO("Not yet implemented")
}