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.runtime)
implementation(compose.foundation) implementation(compose.foundation)
implementation(compose.material) implementation(compose.material)
implementation(compose.material3)
implementation(compose.ui) implementation(compose.ui)
implementation(compose.components.resources) implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview) implementation(compose.components.uiToolingPreview)

View file

@ -1,13 +1,96 @@
package moe.lava.banksia.native.maps 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.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier 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.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 @Composable
actual fun Maps( actual fun Maps(
modifier: Modifier, 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.animation.AnimatedVisibility
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.BottomSheetScaffold import androidx.compose.material3.BottomSheetScaffold
import androidx.compose.material.Button import androidx.compose.material3.MaterialTheme
import androidx.compose.material.MaterialTheme import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material.Scaffold import androidx.compose.material3.SheetValue
import androidx.compose.material.Text import androidx.compose.material3.rememberBottomSheetScaffoldState
import androidx.compose.material3.rememberStandardBottomSheetState
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -20,12 +22,25 @@ import banksia.composeapp.generated.resources.Res
import banksia.composeapp.generated.resources.compose_multiplatform import banksia.composeapp.generated.resources.compose_multiplatform
import moe.lava.banksia.native.maps.Maps import moe.lava.banksia.native.maps.Maps
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@Preview @Preview
fun App() { fun App() {
val scaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.Hidden,
skipHiddenState = false
)
)
MaterialTheme { MaterialTheme {
Scaffold { BottomSheetScaffold(
Maps(modifier = Modifier.fillMaxSize()) 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 package moe.lava.banksia.native.maps
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier 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 @Composable
expect fun Maps( expect fun Maps(
modifier: Modifier = Modifier, 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 package moe.lava.banksia.native.maps
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
actual fun Maps( actual fun Maps(
modifier: Modifier, modifier: Modifier,
markers: List<Marker> markers: List<Marker>,
polylines: List<Polyline>,
cameraPosition: Point,
sheetState: SheetState,
) { ) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }