@@ -8,22 +8,33 @@ package com.maptilerdemo.maptilermobiledemo
88
99import android.content.Context
1010import android.graphics.BitmapFactory
11- import android.graphics.Color
11+ import android.location.Location
1212import android.util.Log
13+ import androidx.activity.compose.rememberLauncherForActivityResult
14+ import androidx.activity.result.contract.ActivityResultContracts
1315import androidx.compose.foundation.layout.Arrangement
1416import androidx.compose.foundation.layout.Box
1517import androidx.compose.foundation.layout.Column
1618import androidx.compose.foundation.layout.fillMaxSize
1719import androidx.compose.foundation.layout.padding
1820import androidx.compose.runtime.Composable
21+ import androidx.compose.runtime.DisposableEffect
22+ import androidx.compose.runtime.MutableState
23+ import androidx.compose.runtime.mutableStateOf
24+ import androidx.compose.runtime.remember
1925import androidx.compose.ui.Alignment
2026import androidx.compose.ui.Modifier
27+ import androidx.compose.ui.graphics.Color
28+ import androidx.compose.ui.graphics.toArgb
2129import androidx.compose.ui.unit.dp
2230import androidx.navigation.NavController
2331import com.maptiler.maptilersdk.MTConfig
2432import com.maptiler.maptilersdk.annotations.MTMarker
2533import com.maptiler.maptilersdk.annotations.MTTextPopup
2634import com.maptiler.maptilersdk.events.MTEvent
35+ import com.maptiler.maptilersdk.location.MTLocationError
36+ import com.maptiler.maptilersdk.location.MTLocationManager
37+ import com.maptiler.maptilersdk.location.MTLocationManagerDelegate
2738import com.maptiler.maptilersdk.map.LngLat
2839import com.maptiler.maptilersdk.map.MTMapOptions
2940import com.maptiler.maptilersdk.map.MTMapView
@@ -47,6 +58,54 @@ fun HomeScreen(
4758 context : Context ,
4859) {
4960 val mapController = MapController (context)
61+ val locationManager = remember(context) { MTLocationManager (context) }
62+ val userMarker: MutableState <MTMarker ?> = remember { mutableStateOf(null ) }
63+
64+ val permissionLauncher =
65+ rememberLauncherForActivityResult(
66+ ActivityResultContracts .RequestMultiplePermissions (),
67+ ) { grants ->
68+ val granted =
69+ (grants[android.Manifest .permission.ACCESS_FINE_LOCATION ] == true ) ||
70+ (grants[android.Manifest .permission.ACCESS_COARSE_LOCATION ] == true )
71+ if (granted) {
72+ locationManager.startLocationUpdates()
73+ } else {
74+ Log .w(" Demo App" , " Location permission denied by user" )
75+ }
76+ }
77+
78+ DisposableEffect (Unit ) {
79+ // Wire delegate; stop on dispose
80+ locationManager.delegate =
81+ object : MTLocationManagerDelegate {
82+ override fun didUpdateLocation (location : Location ) {
83+ val lngLat = LngLat (location.longitude, location.latitude)
84+ val marker = userMarker.value
85+ if (marker == null ) {
86+ val newMarker = MTMarker (lngLat, Color .Blue .toArgb())
87+ userMarker.value = newMarker
88+ mapController.controller.style?.addMarker(newMarker)
89+
90+ mapController.controller.easeTo(MTCameraOptions ((lngLat)))
91+ } else {
92+ marker.setCoordinates(lngLat, mapController.controller)
93+ }
94+ }
95+
96+ override fun didFailWithError (error : Throwable ) {
97+ if (error is MTLocationError ) {
98+ Log .e(" Demo App" , " Location error: ${error.message} " )
99+ } else {
100+ Log .e(" Demo App" , " Location error: $error " )
101+ }
102+ }
103+ }
104+ onDispose {
105+ locationManager.stopLocationUpdates()
106+ locationManager.delegate = null
107+ }
108+ }
50109
51110 val options = MTMapOptions ()
52111 options.setMapTilerLogoIsVisible(true )
@@ -79,8 +138,8 @@ fun HomeScreen(
79138 } else if (type == MTLayerType .FILL ) {
80139 try {
81140 val layer = MTFillLayer (" fillLayer" , " openmapsource" )
82- layer.color = Color .BLUE
83- layer.outlineColor = Color .CYAN
141+ layer.color = Color .Blue .toArgb()
142+ layer.outlineColor = Color .Cyan .toArgb()
84143 layer.sourceLayer = " aeroway"
85144 mapController.controller.style?.addLayer(layer)
86145 } catch (error: MTStyleError ) {
@@ -89,7 +148,7 @@ fun HomeScreen(
89148 } else if (type == MTLayerType .LINE ) {
90149 try {
91150 val layer = MTLineLayer (" lineLayer" , " openmapsource" )
92- layer.color = Color .BLUE
151+ layer.color = Color .Blue .toArgb()
93152 layer.sourceLayer = " water"
94153 mapController.controller.style?.addLayer(layer)
95154 } catch (error: MTStyleError ) {
@@ -127,6 +186,24 @@ fun HomeScreen(
127186 Modifier
128187 .padding(10 .dp),
129188 )
189+
190+ LocationControl (
191+ onLocate = {
192+ if (locationManager.hasLocationPermission()) {
193+ locationManager.startLocationUpdates()
194+ } else {
195+ permissionLauncher.launch(
196+ arrayOf(
197+ android.Manifest .permission.ACCESS_FINE_LOCATION ,
198+ android.Manifest .permission.ACCESS_COARSE_LOCATION ,
199+ ),
200+ )
201+ }
202+ },
203+ modifier =
204+ Modifier
205+ .padding(10 .dp),
206+ )
130207 }
131208
132209 NavigationControl (
0 commit comments