Settings
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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<StepData> by lazy {
|
||||
MutableLiveData<StepData>()
|
||||
MutableLiveData()
|
||||
}
|
||||
val nextStepData: MutableLiveData<StepData> by lazy {
|
||||
MutableLiveData<StepData>()
|
||||
MutableLiveData()
|
||||
}
|
||||
var lastLocation = location(0.0, 0.0)
|
||||
val observer = Observer<String> { 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
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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") {
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user