From 71d3d1784754e3bb49837e605601edfc0c315b24 Mon Sep 17 00:00:00 2001 From: Dimitris Date: Sat, 21 Feb 2026 11:12:22 +0100 Subject: [PATCH] Settings --- app/build.gradle.kts | 4 +- .../com/kouros/navigation/ui/MainActivity.kt | 85 +++++++++--------- .../ui/components/ThemeColorPicker.kt | 52 ----------- .../navigation/ui/navigation/AppNavGraph.kt | 3 +- .../ui/settings/NavigationScreen.kt | 2 +- .../kouros/navigation/car/SurfaceRenderer.kt | 1 + .../data/tomtom/TomTomRepository.kt | 2 - .../navigation/model/SettingsViewModel.kt | 4 +- common/data/src/main/res/drawable/lanes.png | Bin 1041 -> 0 bytes 9 files changed, 50 insertions(+), 103 deletions(-) delete mode 100644 app/src/main/java/com/kouros/navigation/ui/components/ThemeColorPicker.kt delete mode 100644 common/data/src/main/res/drawable/lanes.png 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 4374cb2ff48c318b2d2a62adf6676367ebab2319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1041 zcmV+s1n&EZP)8adIKNTH*N$ML^ zGExmW4rWt{FMF=NgmqEIn7>tWlMI-H5ftSjx?3SP$$)mwK_|{3mbs3-guPL3)-lhu zm#`8V%m}khnYjt;<3>E3$sgR!mJ}r$re_c(oU>_{DC~3XFCeyN%cj@jb^zdW&SP$= zhZ3it6=pAqz&_Xh0%A!NWziUXWFR!V&0!6u$zUZ|G z@D!o1xs(N@5*A0R&Q(k=kr?ILUtR@HaJfg4Z)z>prjjSvl@9SSz-4HSIhmqFV3lis z0kL(EyJ1sn(aDEY_ATuq4u_z1W)q3PDA)e-S_BPdlsTJI3pzQPFRA7N@lAXp9ppI9 zM!h+aQyE23_K^roa_uj#elA4`=R7)M*Mb~}*Qf;CLtcE$z;et?UW8pyZ&nqd#9S;( zw?tr&Ykzs=Ii_OnzHw_oA9qsATl7n1mDUrJL9YGfwOQ5NmE+Zdg?Nivequq9R;`8o z<+T7~RdWZKAxK< z(}ve#Gu|ciA2+Z#IJc8awXnRrPC-$wBUemA?Gm@*ATVM{Brn|wlIGNC6Oe^E@BLLqrx75cf?CZ?}5}iSA3p@;5E#AWS z9PKg@9|Qlet|Tp2i!<LV{Z^T_sff1BJ@{)mRZmPwNI6NL_Jq{P3D7}(_X>O{;JviJN zbv<-3hH{x?V4Rz3@fZ%*MO+VE9E_qIEEO2$rdk-(;xrB)KPNGWqFm0@Qh{M^s)a!< z!a0$-q!P>AR11SzoWOqU$G+^yx-2N!+2^*v=SyPLVq+9#J@IfHiZV<18lQnlZV~}Y zp(wkEhl^3hCkMQO(a;4Rj!4^E#O>MWLD;3V+K)_MZ)!%<=RMS z=TtNtwiF51W0q?rp}<<4=RVnR9CM4~)?<}xE1}HHOiSK6*Ix2JN#Sq{0h3c{00000 LNkvXXu0mjfoFV2M