feat: location button, and abstracting extInsets to common code
This commit is contained in:
parent
cdbf1970ec
commit
e428883d01
9 changed files with 178 additions and 38 deletions
|
|
@ -1,9 +1,18 @@
|
|||
package moe.lava.banksia
|
||||
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.add
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.safeContent
|
||||
import androidx.compose.foundation.layout.safeDrawing
|
||||
import androidx.compose.foundation.layout.windowInsetsPadding
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.LocationOn
|
||||
import androidx.compose.material3.BottomSheetScaffold
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.FloatingActionButton
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.SheetValue
|
||||
import androidx.compose.material3.rememberBottomSheetScaffoldState
|
||||
|
|
@ -12,12 +21,26 @@ import androidx.compose.runtime.Composable
|
|||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import dev.icerock.moko.geo.compose.BindLocationTrackerEffect
|
||||
import dev.icerock.moko.geo.compose.LocationTrackerAccuracy
|
||||
import dev.icerock.moko.geo.compose.rememberLocationTrackerFactory
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.launch
|
||||
import moe.lava.banksia.api.ptv.PtvService
|
||||
import moe.lava.banksia.native.maps.Maps
|
||||
import moe.lava.banksia.native.maps.Point
|
||||
import moe.lava.banksia.native.maps.getScreenHeight
|
||||
import moe.lava.banksia.resources.Res
|
||||
import moe.lava.banksia.resources.my_location_24
|
||||
import moe.lava.banksia.ui.Searcher
|
||||
import org.jetbrains.compose.resources.painterResource
|
||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
|
|
@ -30,17 +53,43 @@ fun App() {
|
|||
)
|
||||
)
|
||||
|
||||
val locationFactory = rememberLocationTrackerFactory(LocationTrackerAccuracy.Best)
|
||||
val locationTracker = remember { locationFactory.createLocationTracker() }
|
||||
BindLocationTrackerEffect(locationTracker)
|
||||
var lastLocation by remember { mutableStateOf(Point(-37.8136, 144.9631)) }
|
||||
var newCameraPosition by remember { mutableStateOf<Point?>(Point(-37.8136, 144.9631)) }
|
||||
var searchTextState by remember { mutableStateOf("") }
|
||||
var searchExpandedState by remember { mutableStateOf(false) }
|
||||
|
||||
val sheetState = scaffoldState.bottomSheetState
|
||||
val extInsets = if (
|
||||
sheetState.currentValue != SheetValue.Hidden ||
|
||||
sheetState.targetValue != SheetValue.Hidden
|
||||
) {
|
||||
val scaffoldOffset = sheetState.requireOffset().roundToInt()
|
||||
(getScreenHeight() - scaffoldOffset - WindowInsets.safeDrawing.getBottom(LocalDensity.current)).coerceAtLeast(0)
|
||||
} else 0
|
||||
|
||||
var scope = rememberCoroutineScope()
|
||||
scope.launch {
|
||||
val flow = locationTracker.getLocationsFlow()
|
||||
locationTracker.startTracking()
|
||||
flow.distinctUntilChanged().collect {
|
||||
lastLocation = Point(it.latitude, it.longitude)
|
||||
}
|
||||
}
|
||||
|
||||
MaterialTheme {
|
||||
BottomSheetScaffold(
|
||||
scaffoldState = scaffoldState,
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
sheetContent = { Box(modifier = Modifier) },
|
||||
) {
|
||||
Maps(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
sheetState = scaffoldState.bottomSheetState,
|
||||
newCameraPosition = newCameraPosition,
|
||||
cameraPositionUpdated = { newCameraPosition = null },
|
||||
extInsets = extInsets,
|
||||
)
|
||||
Searcher(
|
||||
ptvService = PtvService(),
|
||||
|
|
@ -50,6 +99,20 @@ fun App() {
|
|||
onTextChange = { searchTextState = it },
|
||||
onRouteChange = {}
|
||||
)
|
||||
|
||||
Box(
|
||||
Modifier.windowInsetsPadding(WindowInsets.safeContent.add(WindowInsets(bottom = extInsets))),
|
||||
contentAlignment = Alignment.BottomEnd
|
||||
) {
|
||||
FloatingActionButton(
|
||||
containerColor = MaterialTheme.colorScheme.surfaceContainer,
|
||||
onClick = {
|
||||
newCameraPosition = lastLocation
|
||||
},
|
||||
) {
|
||||
Icon(painterResource(Res.drawable.my_location_24), "Move to current location")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,17 +5,22 @@ import androidx.compose.material3.SheetState
|
|||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.Dp
|
||||
|
||||
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)
|
||||
|
||||
@Composable
|
||||
expect fun getScreenHeight(): Int
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
expect fun Maps(
|
||||
modifier: Modifier = Modifier,
|
||||
markers: List<Marker> = listOf(),
|
||||
polylines: List<Polyline> = listOf(),
|
||||
cameraPosition: Point = Point(-37.8136, 144.9631),
|
||||
sheetState: SheetState,
|
||||
newCameraPosition: Point? = Point(-37.8136, 144.9631),
|
||||
cameraPositionUpdated: () -> Unit,
|
||||
extInsets: Int,
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue