From 0ffd415874d9deb4706a3b4fab21f5a8ff824268 Mon Sep 17 00:00:00 2001 From: LavaDesu Date: Mon, 14 Apr 2025 02:02:06 +1000 Subject: [PATCH] feat(android): init basic marker and polylines --- composeApp/build.gradle.kts | 1 + .../lava/banksia/native/maps/Maps.android.kt | 87 ++++++++++++++++++- .../commonMain/kotlin/moe/lava/banksia/App.kt | 29 +++++-- .../moe/lava/banksia/native/maps/Maps.kt | 13 ++- .../moe/lava/banksia/native/maps/Maps.ios.kt | 8 +- 5 files changed, 126 insertions(+), 12 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index dabf147..d06db07 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -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) diff --git a/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt b/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt index 887ad39..3e8e76c 100644 --- a/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt +++ b/composeApp/src/androidMain/kotlin/moe/lava/banksia/native/maps/Maps.android.kt @@ -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 + markers: List, + polylines: List, + 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 + ) + } + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt b/composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt index c716b52..f1fdc17 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/App.kt @@ -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, + ) } } } \ No newline at end of file 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 index 101a288..cf9a3b3 100644 --- a/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/maps/Maps.kt +++ b/composeApp/src/commonMain/kotlin/moe/lava/banksia/native/maps/Maps.kt @@ -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, val colour: Color) +@OptIn(ExperimentalMaterial3Api::class) @Composable expect fun Maps( modifier: Modifier = Modifier, - markers: List = listOf() + markers: List = listOf(), + polylines: List = listOf(), + cameraPosition: Point = Point(-37.8136, 144.9631), + sheetState: SheetState, ) \ No newline at end of file diff --git a/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt b/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt index 34f50f7..f93dbf7 100644 --- a/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt +++ b/composeApp/src/iosMain/kotlin/moe/lava/banksia/native/maps/Maps.ios.kt @@ -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 + markers: List, + polylines: List, + cameraPosition: Point, + sheetState: SheetState, ) { TODO("Not yet implemented") } \ No newline at end of file