Navigation Image

This commit is contained in:
Dimitris
2025-11-25 15:14:34 +01:00
parent b1a9a2c7fe
commit ce382e304c
20 changed files with 437 additions and 244 deletions

View File

@@ -52,22 +52,29 @@ import com.example.places.ui.theme.PlacesTheme
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import com.kouros.android.cars.carappservice.R
import com.kouros.navigation.car.BuildingLayer
import com.kouros.navigation.car.Puck
import com.kouros.navigation.car.RouteLayer
import com.kouros.navigation.data.Category
import com.kouros.navigation.data.Constants
import com.kouros.navigation.data.Constants.SHOW_THREED_BUILDING
import com.kouros.navigation.data.NavigationRepository
import com.kouros.navigation.data.StepData
import com.kouros.navigation.model.RouteModel
import com.kouros.navigation.model.ViewModel
import com.kouros.navigation.utils.NavigationUtils.getBooleanKeyValue
import com.kouros.navigation.utils.NavigationUtils.snapLocation
import com.kouros.navigation.utils.calculateZoom
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
import org.maplibre.compose.camera.CameraPosition
import org.maplibre.compose.camera.rememberCameraState
import org.maplibre.compose.expressions.dsl.const
import org.maplibre.compose.layers.Anchor
import org.maplibre.compose.layers.CircleLayer
import org.maplibre.compose.layers.FillLayer
import org.maplibre.compose.layers.LineLayer
import org.maplibre.compose.location.DesiredAccuracy
@@ -88,6 +95,7 @@ import kotlin.time.Duration.Companion.seconds
class MainActivity : ComponentActivity() {
private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.IO)
val routeData = MutableLiveData("")
val vieModel = ViewModel(NavigationRepository())
@@ -115,10 +123,16 @@ class MainActivity : ComponentActivity() {
var locationIndex = 0
var test = false
var simulate = false
init {
vieModel.route.observe(this, observer)
if (simulate) {
vieModel.loadRoute(
Constants.homeLocation,
Constants.home2Location
)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
@@ -262,10 +276,10 @@ class MainActivity : ComponentActivity() {
)
val userLocationState = rememberUserLocationState(locationProvider)
val locationState = locationProvider.location.collectAsState()
if (!test) {
if (!simulate) {
updateLocation(locationState.value)
} else {
test()
simulate()
}
if (locationState.value != null && lastLocation.latitude == 0.0) {
lastLocation.latitude = locationState.value?.position!!.latitude
@@ -290,8 +304,16 @@ class MainActivity : ComponentActivity() {
baseStyle = BaseStyle.Uri(Constants.STYLE),
) {
getBaseSource(id = "openmaptiles")?.let { tiles ->
FillLayer(id = "example", visible = false, source = tiles, sourceLayer = "building")
RouteLayer(route)
if (!getBooleanKeyValue(context = applicationContext, SHOW_THREED_BUILDING) && Constants.STYLE.contains("liberty")) {
BuildingLayer(tiles)
}
RouteLayer(route, "")
}
if (userLocationState.location != null) {
val location = Location(LocationManager.GPS_PROVIDER)
location.longitude = userLocationState.location!!.position.longitude
location.latitude = userLocationState.location!!.position.latitude
Puck(cameraState, location,)
}
LocationPuck(
idPrefix = "user-location1",
@@ -321,39 +343,6 @@ class MainActivity : ComponentActivity() {
duration = 1.seconds
)
}
// LaunchedEffect(position) {
// println("CameraPosition ${position!!.target.latitude}")
// cameraState.animateTo(
// finalPosition = CameraPosition(
// bearing = position!!.bearing,
// zoom = position!!.zoom,
// target = position!!.target,
// tilt = tilt
// ),
// duration = 3.seconds
// )
// }
}
@Composable
fun RouteLayer(routeData: String?) {
if (routeData!!.isNotEmpty()) {
val routes =
rememberGeoJsonSource(GeoJsonData.JsonString(routeData!!))
LineLayer(
id = "routes-casing",
source = routes,
color = const(Color.White),
width = const(10.dp),
)
LineLayer(
id = "routes",
source = routes,
color = const(Color.Blue),
width = const(8.dp),
)
}
}
fun updateLocation(location: org.maplibre.compose.location.Location?) {
@@ -380,7 +369,7 @@ class MainActivity : ComponentActivity() {
snapedLocation = snapLocation(location, routeModel.route.maneuverLocations())
bearing = routeModel.currentStep().bearing
routeModel.updateLocation(snapedLocation)
instruction.value = routeModel.currentStep()
instruction.postValue(routeModel.currentStep())
} else {
bearing = cameraPosition.value!!.bearing
}
@@ -394,14 +383,19 @@ class MainActivity : ComponentActivity() {
)
}
fun test() {
fun simulate() {
if (routeModel.isNavigating() && locationIndex < routeModel.route.waypoints.size) {
val loc = routeModel.route.waypoints[locationIndex]
lastLocation.longitude = loc[0]
lastLocation.latitude = loc[1]
updateTestLocation(lastLocation)
Thread.sleep(1_000)
locationIndex++
coroutineScope.launch {
delay(
100
)
val loc = routeModel.route.waypoints[locationIndex]
lastLocation.longitude = loc[0]
lastLocation.latitude = loc[1]
updateTestLocation(lastLocation)
Thread.sleep(1_000)
locationIndex++
}
}
}