diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d7d0ef1..f9adde0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "com.kouros.navigation" minSdk = 33 targetSdk = 36 - versionCode = 43 - versionName = "0.2.0.43" + versionCode = 45 + versionName = "0.2.0.45" base.archivesName = "navi-$versionName" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt index bca859d..229b585 100644 --- a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt +++ b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt @@ -22,8 +22,6 @@ import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon -import androidx.compose.material3.SheetState -import androidx.compose.material3.SheetValue import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text @@ -36,7 +34,6 @@ import androidx.compose.runtime.mutableDoubleStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -56,15 +53,14 @@ import com.kouros.navigation.MainApplication.Companion.navigationViewModel import com.kouros.navigation.data.Constants.DESTINATION_ARRIVAL_DISTANCE import com.kouros.navigation.data.Constants.homeVogelhart import com.kouros.navigation.data.StepData -import com.kouros.navigation.data.datastore.DataStoreManager import com.kouros.navigation.model.BaseStyleModel import com.kouros.navigation.model.MockLocation import com.kouros.navigation.model.RouteModel -import com.kouros.navigation.repository.SettingsRepository import com.kouros.navigation.ui.app.AppViewModel import com.kouros.navigation.ui.app.appViewModel import com.kouros.navigation.ui.navigation.AppNavGraph import com.kouros.navigation.ui.theme.NavigationTheme +import com.kouros.navigation.utils.GeoUtils.snapLocation import com.kouros.navigation.utils.bearing import com.kouros.navigation.utils.getSettingsViewModel import com.kouros.navigation.utils.location @@ -74,9 +70,7 @@ import io.ticofab.androidgpxparser.parser.domain.TrackSegment import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import org.joda.time.DateTime import org.maplibre.compose.camera.CameraPosition import org.maplibre.compose.location.DesiredAccuracy @@ -95,14 +89,13 @@ class MainActivity : ComponentActivity() { val routeModel = RouteModel() var tilt = 50.0 val useMock = false - val type = 3 // 1 simulate 2 test 3 gpx 4 testSingle + val type = 1 // 1 simulate 2 test 3 gpx 4 testSingle - var currentIndex = 0 val stepData: MutableLiveData by lazy { - MutableLiveData() + MutableLiveData() } val nextStepData: MutableLiveData by lazy { - MutableLiveData() + MutableLiveData() } var lastLocation = location(0.0, 0.0) val observer = Observer { newRoute -> @@ -130,14 +123,10 @@ class MainActivity : ComponentActivity() { private lateinit var locationManager: LocationManager private lateinit var fusedLocationClient: FusedLocationProviderClient - private lateinit var mock: MockLocation - private var loadRecentPlaces = false - lateinit var baseStyle: BaseStyle.Json - @RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION]) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -226,7 +215,7 @@ class MainActivity : ComponentActivity() { sheetPeekHeightState.value = sheetPeekHeight } } - NavigationTheme (useDarkTheme = darkMode == 1) { + NavigationTheme(useDarkTheme = darkMode == 1) { BottomSheetScaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) @@ -268,7 +257,7 @@ class MainActivity : ComponentActivity() { if (lastRoute.isNotEmpty()) { navigationViewModel.route.value = lastRoute } - AppNavGraph(applicationContext = applicationContext, this) + AppNavGraph(this) } @Composable @@ -315,31 +304,41 @@ class MainActivity : ComponentActivity() { fun updateLocation(location: Location?) { if (location != null && lastLocation.latitude != location.position.latitude && lastLocation.longitude != location.position.longitude) { val currentLocation = location(location.position.longitude, location.position.latitude) - val bearing = bearing(lastLocation, currentLocation, cameraPosition.value!!.bearing) - with(routeModel) { - if (isNavigating()) { - updateLocation(applicationContext,currentLocation, navigationViewModel) - stepData.value = currentStep() - nextStepData.value = nextStep() - if (navState.maneuverType in 39..42 && routeCalculator.leftStepDistance() < DESTINATION_ARRIVAL_DISTANCE) { - // stopNavigation() - navState = navState.copy(arrived = true) - routeData.value = "" - } + if (routeModel.isNavigating()) { + val snapedLocation = + snapLocation(currentLocation, routeModel.route.maneuverLocations()) + updateLocationInternal(snapedLocation, location) + } else { + updateLocationInternal(currentLocation, location) + } + } + } + + fun updateLocationInternal(currentLocation: android.location.Location, location: Location?) { + val bearing = bearing(lastLocation, currentLocation, cameraPosition.value!!.bearing) + with(routeModel) { + if (isNavigating()) { + updateLocation(applicationContext, currentLocation, navigationViewModel) + stepData.value = currentStep() + nextStepData.value = nextStep() + if (navState.maneuverType in 39..42 && routeCalculator.leftStepDistance() < DESTINATION_ARRIVAL_DISTANCE) { + // stopNavigation() + navState = navState.copy(arrived = true) + routeData.value = "" } } - //val zoom = calculateZoom(location.speed) - val zoom = 16.0 - cameraPosition.postValue( - cameraPosition.value!!.copy( - zoom = zoom, target = location.position, bearing = bearing - ), - ) - lastLocation = currentLocation - if (!loadRecentPlaces) { - navigationViewModel.loadRecentPlaces(applicationContext, lastLocation, 0F) - loadRecentPlaces = true - } + } + //val zoom = calculateZoom(location.speed) + val zoom = 16.0 + cameraPosition.postValue( + cameraPosition.value!!.copy( + zoom = zoom, target = location!!.position, bearing = bearing + ), + ) + lastLocation = currentLocation + if (!loadRecentPlaces) { + navigationViewModel.loadRecentPlaces(applicationContext, lastLocation, 0F) + loadRecentPlaces = true } } @@ -397,7 +396,8 @@ class MainActivity : ComponentActivity() { for ((index, step) in routeModel.curLeg.steps.withIndex()) { //if (index in 3..3) { for ((windex, waypoint) in step.maneuver.waypoints.withIndex()) { - routeModel.updateLocation(applicationContext, + routeModel.updateLocation( + applicationContext, location(waypoint[0], waypoint[1]), navigationViewModel ) val step = routeModel.currentStep() @@ -418,7 +418,8 @@ class MainActivity : ComponentActivity() { if (1 == 1) { mock.setMockLocation(latitude, longitude) } else { - routeModel.updateLocation(applicationContext, + routeModel.updateLocation( + applicationContext, location(longitude, latitude), navigationViewModel ) } diff --git a/app/src/main/java/com/kouros/navigation/ui/components/ThemeColorPicker.kt b/app/src/main/java/com/kouros/navigation/ui/components/ThemeColorPicker.kt deleted file mode 100644 index 0ca8354..0000000 --- a/app/src/main/java/com/kouros/navigation/ui/components/ThemeColorPicker.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.kouros.navigation.ui.components - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import com.kouros.navigation.data.NavigationThemeColor - -@Composable -fun ThemeColorPicker( - selectedColor: Long, - onColorSelected: (Long) -> Unit -) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - horizontalArrangement = Arrangement.SpaceBetween - ) { - NavigationThemeColor.entries.forEach { themeColor -> - - val isSelected = selectedColor == themeColor.color - - Box( - modifier = Modifier - .size(36.dp) - .clip(CircleShape) - .background(Color(themeColor.color)) - .border( - width = if (isSelected) 3.dp else 0.dp, - color = if (isSelected) MaterialTheme.colorScheme.onSurface else Color.Transparent, - shape = CircleShape - ) - .clickable { - onColorSelected(themeColor.color) - } - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kouros/navigation/ui/navigation/AppNavGraph.kt b/app/src/main/java/com/kouros/navigation/ui/navigation/AppNavGraph.kt index aaa4cad..779be24 100644 --- a/app/src/main/java/com/kouros/navigation/ui/navigation/AppNavGraph.kt +++ b/app/src/main/java/com/kouros/navigation/ui/navigation/AppNavGraph.kt @@ -1,6 +1,5 @@ package com.kouros.navigation.ui.navigation -import android.content.Context import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -10,7 +9,7 @@ import com.kouros.navigation.ui.settings.SettingsRoute @Composable -fun AppNavGraph(applicationContext: Context, mainActivity: MainActivity) { +fun AppNavGraph(mainActivity: MainActivity) { val navController = rememberNavController() NavHost(navController = navController, startDestination = "startScreen") { diff --git a/app/src/main/java/com/kouros/navigation/ui/settings/NavigationScreen.kt b/app/src/main/java/com/kouros/navigation/ui/settings/NavigationScreen.kt index 12a64d9..0cd2e64 100644 --- a/app/src/main/java/com/kouros/navigation/ui/settings/NavigationScreen.kt +++ b/app/src/main/java/com/kouros/navigation/ui/settings/NavigationScreen.kt @@ -119,8 +119,8 @@ fun NavigationSettings(viewModel: SettingsViewModel) { TextField( value = key, onValueChange = { + viewModel.onTomTomApiKeyChanged(it) key = it - viewModel::onTomTomApiKeyChanged }, label = { Text(stringResource(R.string.tomtom_api_key)) }, textStyle = TextStyle(color = Color.Green, fontWeight = FontWeight.Bold), diff --git a/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt b/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt index 2db89cb..48b166a 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt @@ -289,6 +289,7 @@ class SurfaceRenderer( ) else { carOrientation.toDouble() } + println("Bearing $bearing") val zoom = if (viewStyle == ViewStyle.VIEW) { calculateZoom(location.speed.toDouble()) } else { diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt index 529d5cb..36dffd2 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt @@ -13,8 +13,6 @@ import kotlinx.coroutines.runBlocking private const val routeUrl = "https://api.tomtom.com/routing/1/calculateRoute/" -//const val tomtomApiKey = "678k5v6940cSXXIS5oD92qIrDgW3RBZ3" - const val tomtomTrafficUrl = "https://api.tomtom.com/traffic/services/5/incidentDetails" private const val tomtomFields = diff --git a/common/data/src/main/java/com/kouros/navigation/model/SettingsViewModel.kt b/common/data/src/main/java/com/kouros/navigation/model/SettingsViewModel.kt index ecb2477..22024ef 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/SettingsViewModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/SettingsViewModel.kt @@ -85,7 +85,7 @@ class SettingsViewModel(private val repository: SettingsRepository) : ViewModel( viewModelScope.launch { repository.setLastRoute(route) } } - fun onTomTomApiKeyChanged(route: String) { - viewModelScope.launch { repository.setTomTomApiKey(route) } + fun onTomTomApiKeyChanged(key: String) { + viewModelScope.launch { repository.setTomTomApiKey(key) } } } diff --git a/common/data/src/main/res/drawable/lanes.png b/common/data/src/main/res/drawable/lanes.png deleted file mode 100644 index 4374cb2..0000000 Binary files a/common/data/src/main/res/drawable/lanes.png and /dev/null differ