mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
More fixes for SettingsScreen.kt and its states
This commit is contained in:
1 parent
466c029be6
commit
6572dd4eab
5 files changed
+181
-230
No files matched your search
@@ -82,13 +82,17 @@ fun MapScreen(viewModel: MapViewModel = hiltViewModel()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setStationPosition(stationPos: GeoPos, mapView: MapView) {
|
private fun setStationPosition(stationPos: GeoPos, mapView: MapView) {
|
||||||
Marker(mapView).apply {
|
try {
|
||||||
setInfoWindow(null)
|
Marker(mapView).apply {
|
||||||
setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
|
setInfoWindow(null)
|
||||||
icon = ContextCompat.getDrawable(mapView.context, R.drawable.ic_position)
|
setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
|
||||||
position = GeoPoint(stationPos.lat, stationPos.lon)
|
icon = ContextCompat.getDrawable(mapView.context, R.drawable.ic_position)
|
||||||
mapView.overlays[0] = this
|
position = GeoPoint(stationPos.lat, stationPos.lon)
|
||||||
mapView.invalidate()
|
mapView.overlays[0] = this
|
||||||
|
mapView.invalidate()
|
||||||
|
}
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
Timber.d(exception)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,20 +101,24 @@ private fun setPositions(
|
|||||||
) {
|
) {
|
||||||
val markers = FolderOverlay()
|
val markers = FolderOverlay()
|
||||||
posMap.entries.forEach {
|
posMap.entries.forEach {
|
||||||
Marker(mapView).apply {
|
try {
|
||||||
setInfoWindow(null)
|
Marker(mapView).apply {
|
||||||
setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER)
|
setInfoWindow(null)
|
||||||
icon = getCustomTextIcon(it.key.data.name, mapView)
|
setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER)
|
||||||
try {
|
icon = getCustomTextIcon(it.key.data.name, mapView)
|
||||||
position = GeoPoint(it.value.lat, it.value.lon)
|
try {
|
||||||
} catch (exception: IllegalArgumentException) {
|
position = GeoPoint(it.value.lat, it.value.lon)
|
||||||
println(exception.stackTraceToString())
|
} catch (exception: IllegalArgumentException) {
|
||||||
|
println(exception.stackTraceToString())
|
||||||
|
}
|
||||||
|
setOnMarkerClickListener { _, _ ->
|
||||||
|
action(it.key)
|
||||||
|
return@setOnMarkerClickListener true
|
||||||
|
}
|
||||||
|
markers.add(this)
|
||||||
}
|
}
|
||||||
setOnMarkerClickListener { _, _ ->
|
} catch (exception: Exception) {
|
||||||
action(it.key)
|
Timber.d(exception)
|
||||||
return@setOnMarkerClickListener true
|
|
||||||
}
|
|
||||||
markers.add(this)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mapView.overlays[3] = markers
|
mapView.overlays[3] = markers
|
||||||
|
|||||||
+46
-116
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.*
|
|||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
@@ -25,7 +24,6 @@ import androidx.hilt.navigation.compose.hiltViewModel
|
|||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import com.rtbishop.look4sat.BuildConfig
|
import com.rtbishop.look4sat.BuildConfig
|
||||||
import com.rtbishop.look4sat.R
|
import com.rtbishop.look4sat.R
|
||||||
import com.rtbishop.look4sat.domain.model.OtherSettings
|
|
||||||
import com.rtbishop.look4sat.presentation.CardButton
|
import com.rtbishop.look4sat.presentation.CardButton
|
||||||
import com.rtbishop.look4sat.presentation.MainTheme
|
import com.rtbishop.look4sat.presentation.MainTheme
|
||||||
import com.rtbishop.look4sat.presentation.gotoUrl
|
import com.rtbishop.look4sat.presentation.gotoUrl
|
||||||
@@ -50,7 +48,7 @@ fun SettingsScreen(navController: NavController) {
|
|||||||
else -> Manifest.permission.BLUETOOTH_CONNECT
|
else -> Manifest.permission.BLUETOOTH_CONNECT
|
||||||
}
|
}
|
||||||
val bluetoothRequest = rememberLauncherForActivityResult(bluetoothContract) { isGranted ->
|
val bluetoothRequest = rememberLauncherForActivityResult(bluetoothContract) { isGranted ->
|
||||||
viewModel.setBTEnabled(isGranted)
|
// viewModel.setBTEnabled(isGranted)
|
||||||
if (!isGranted) showToast(context, bluetoothError)
|
if (!isGranted) showToast(context, bluetoothError)
|
||||||
}
|
}
|
||||||
val locationContract = ActivityResultContracts.RequestMultiplePermissions()
|
val locationContract = ActivityResultContracts.RequestMultiplePermissions()
|
||||||
@@ -59,51 +57,43 @@ fun SettingsScreen(navController: NavController) {
|
|||||||
val locationPermFine = Manifest.permission.ACCESS_FINE_LOCATION
|
val locationPermFine = Manifest.permission.ACCESS_FINE_LOCATION
|
||||||
val locationRequest = rememberLauncherForActivityResult(locationContract) { permissions ->
|
val locationRequest = rememberLauncherForActivityResult(locationContract) { permissions ->
|
||||||
when {
|
when {
|
||||||
permissions[locationPermFine] == true -> viewModel.setPositionFromGps()
|
permissions[locationPermFine] == true -> viewModel.locationSettings.value.setGpsLoc
|
||||||
permissions[locationPermCoarse] == true -> viewModel.setPositionFromNet()
|
permissions[locationPermCoarse] == true -> viewModel.locationSettings.value.setGpsLoc
|
||||||
else -> showToast(context, locationError)
|
else -> showToast(context, locationError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val contentContract = ActivityResultContracts.GetContent()
|
val contentContract = ActivityResultContracts.GetContent()
|
||||||
val contentRequest = rememberLauncherForActivityResult(contentContract) { uri ->
|
val contentRequest = rememberLauncherForActivityResult(contentContract) { uri ->
|
||||||
uri?.let { viewModel.updateFromFile(uri.toString()) }
|
uri?.let { viewModel.dataSettings.value.updateFromFile(uri.toString()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Location settings
|
// Location settings
|
||||||
|
val locSettings = viewModel.locationSettings.value
|
||||||
val setGpsLoc = { locationRequest.launch(arrayOf(locationPermCoarse, locationPermFine)) }
|
val setGpsLoc = { locationRequest.launch(arrayOf(locationPermCoarse, locationPermFine)) }
|
||||||
val geoPos = viewModel.getStationPosition()
|
|
||||||
val showPosDialog = rememberSaveable { mutableStateOf(false) }
|
val showPosDialog = rememberSaveable { mutableStateOf(false) }
|
||||||
val togglePosDialog = { showPosDialog.value = showPosDialog.value.not() }
|
val togglePosDialog = { showPosDialog.value = showPosDialog.value.not() }
|
||||||
val savePos = { lat: Double, lon: Double -> viewModel.setStationPosition(lat, lon) }
|
|
||||||
if (showPosDialog.value) {
|
if (showPosDialog.value) {
|
||||||
PositionDialog(lat = geoPos.lat, lon = geoPos.lon, hide = togglePosDialog, save = savePos)
|
PositionDialog(
|
||||||
|
locSettings.getLatitude,
|
||||||
|
locSettings.getLongitude,
|
||||||
|
togglePosDialog,
|
||||||
|
locSettings.setManualLoc
|
||||||
|
)
|
||||||
}
|
}
|
||||||
val qthLocator = viewModel.getStationLocator()
|
|
||||||
val showLocDialog = rememberSaveable { mutableStateOf(false) }
|
val showLocDialog = rememberSaveable { mutableStateOf(false) }
|
||||||
val toggleLocDialog = { showLocDialog.value = showLocDialog.value.not() }
|
val toggleLocDialog = { showLocDialog.value = showLocDialog.value.not() }
|
||||||
val saveLocator = { locator: String -> viewModel.setPositionFromQth(locator) }
|
|
||||||
if (showLocDialog.value) {
|
if (showLocDialog.value) {
|
||||||
LocatorDialog(qthLocator = qthLocator, hide = toggleLocDialog, save = saveLocator)
|
LocatorDialog(locSettings.getLocator, toggleLocDialog, locSettings.setQthLoc)
|
||||||
}
|
}
|
||||||
// Data settings
|
|
||||||
val updateFromWeb = { viewModel.updateFromWeb() }
|
|
||||||
val updateFromFile = { contentRequest.launch("*/*") }
|
|
||||||
val clearAllData = { viewModel.clearAllData() }
|
|
||||||
// Other settings
|
|
||||||
val otherSettings = viewModel.otherSettings.collectAsState()
|
|
||||||
val setUtc = { value: Boolean -> viewModel.setUtcState(value) }
|
|
||||||
val setUpdate = { value: Boolean -> viewModel.setUpdateState(value) }
|
|
||||||
val setSweep = { value: Boolean -> viewModel.setSweepState(value) }
|
|
||||||
val setSensor = { value: Boolean -> viewModel.setSensorState(value) }
|
|
||||||
|
|
||||||
// Screen setup
|
// Screen setup
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)
|
modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)
|
||||||
) {
|
) {
|
||||||
item { CardAbout(BuildConfig.VERSION_NAME) }
|
item { CardAbout(BuildConfig.VERSION_NAME) }
|
||||||
item { LocationCard(setGpsLoc, togglePosDialog, toggleLocDialog) }
|
item { LocationCard(locSettings, setGpsLoc, togglePosDialog, toggleLocDialog) }
|
||||||
item { DataCard(updateFromWeb, updateFromFile, clearAllData) }
|
item { DataCard(viewModel.dataSettings.value) { contentRequest.launch("*/*") } }
|
||||||
item { OtherCard(otherSettings.value, setUtc, setUpdate, setSweep, setSensor) }
|
item { OtherCard(viewModel.otherSettings.value) }
|
||||||
item { CardCredits() }
|
item { CardCredits() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -164,36 +154,33 @@ private fun CardAbout(version: String, modifier: Modifier = Modifier) {
|
|||||||
@Preview(showBackground = true)
|
@Preview(showBackground = true)
|
||||||
@Composable
|
@Composable
|
||||||
private fun LocationCardPreview() {
|
private fun LocationCardPreview() {
|
||||||
MainTheme { LocationCard({}, {}, {}) }
|
MainTheme { }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun LocationCard(
|
private fun LocationCard(
|
||||||
setGpsLoc: () -> Unit, togglePosDialog: () -> Unit, toggleLocDialog: () -> Unit
|
settings: LocationSettings,
|
||||||
|
setGpsLoc: () -> Unit,
|
||||||
|
togglePosDialog: () -> Unit,
|
||||||
|
toggleLocDialog: () -> Unit
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
|
||||||
// setPositionText(viewModel.getStationPosition())
|
|
||||||
ElevatedCard(modifier = Modifier.fillMaxWidth()) {
|
ElevatedCard(modifier = Modifier.fillMaxWidth()) {
|
||||||
Column(modifier = Modifier.padding(4.dp)) {
|
Column(modifier = Modifier.padding(4.dp)) {
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
Text(text = "Station position")
|
Text(text = "Station position")
|
||||||
LinearProgressIndicator(
|
UpdateIndicator(isUpdating = settings.getUpdating, Modifier.weight(1f))
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.padding(start = 6.dp, end = 6.dp)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = "Updated: 3 Mar 2023 - 15:51")
|
Text(text = "Updated: ${settings.getLastUpdated}")
|
||||||
Text(text = "QTH: IO91vl")
|
Text(text = "QTH: ${settings.getLocator}")
|
||||||
}
|
}
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = "Latitude: *")
|
Text(text = "Latitude: ${settings.getLatitude}")
|
||||||
Text(text = "Longitude: *")
|
Text(text = "Longitude: ${settings.getLongitude}")
|
||||||
}
|
}
|
||||||
Row(horizontalArrangement = Arrangement.SpaceEvenly) {
|
Row(horizontalArrangement = Arrangement.SpaceEvenly) {
|
||||||
CardButton(
|
CardButton(
|
||||||
@@ -216,48 +203,40 @@ private fun LocationCard(
|
|||||||
@Preview(showBackground = true)
|
@Preview(showBackground = true)
|
||||||
@Composable
|
@Composable
|
||||||
private fun DataCardPreview() {
|
private fun DataCardPreview() {
|
||||||
MainTheme { DataCard({}, {}, {}) }
|
MainTheme { }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun DataCard(updateOnline: () -> Unit, updateFile: () -> Unit, clearData: () -> Unit) {
|
private fun DataCard(settings: DataSettings, updateFromFile: () -> Unit) {
|
||||||
val context = LocalContext.current
|
|
||||||
// setUpdateTime(viewModel.getLastUpdateTime())
|
|
||||||
// viewModel.entriesTotal
|
|
||||||
// viewModel.radiosTotal
|
|
||||||
ElevatedCard(modifier = Modifier.fillMaxWidth()) {
|
ElevatedCard(modifier = Modifier.fillMaxWidth()) {
|
||||||
Column(modifier = Modifier.padding(4.dp)) {
|
Column(modifier = Modifier.padding(4.dp)) {
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
Text(text = "Satellite data")
|
Text(text = "Satellite data")
|
||||||
LinearProgressIndicator(
|
UpdateIndicator(isUpdating = settings.getUpdating, Modifier.weight(1f))
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.padding(start = 6.dp, end = 6.dp)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = "Updated: 3 Mar 2023 - 15:51")
|
Text(text = "Updated: ${settings.getLastUpdated}")
|
||||||
Text(text = "")
|
Text(text = "")
|
||||||
}
|
}
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = "Satellites: 7749")
|
Text(text = "Satellites: ${settings.getSatellites}")
|
||||||
Text(text = "Transceivers: 2240")
|
Text(text = "Transceivers: ${settings.getRadios}")
|
||||||
}
|
}
|
||||||
Row(horizontalArrangement = Arrangement.SpaceEvenly) {
|
Row(horizontalArrangement = Arrangement.SpaceEvenly) {
|
||||||
CardButton(
|
CardButton(
|
||||||
onClick = updateOnline, // viewModel.updateFromWeb()
|
onClick = settings.updateFromWeb, // viewModel.updateFromWeb()
|
||||||
text = stringResource(id = R.string.btn_web), modifier = Modifier.weight(1f)
|
text = stringResource(id = R.string.btn_web), modifier = Modifier.weight(1f)
|
||||||
)
|
)
|
||||||
CardButton(
|
CardButton(
|
||||||
onClick = updateFile, // contentRequest.launch("*/*")
|
onClick = updateFromFile, // contentRequest.launch("*/*")
|
||||||
text = stringResource(id = R.string.btn_file), modifier = Modifier.weight(1f)
|
text = stringResource(id = R.string.btn_file), modifier = Modifier.weight(1f)
|
||||||
)
|
)
|
||||||
CardButton(
|
CardButton(
|
||||||
onClick = clearData, // viewModel.clearAllData()
|
onClick = settings.clearAllData, // viewModel.clearAllData()
|
||||||
text = stringResource(id = R.string.btn_clear), modifier = Modifier.weight(1f)
|
text = stringResource(id = R.string.btn_clear), modifier = Modifier.weight(1f)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -317,13 +296,7 @@ private fun OtherCardPreview() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun OtherCard(
|
private fun OtherCard(settings: OtherSettings) {
|
||||||
settings: OtherSettings,
|
|
||||||
setUtc: (Boolean) -> Unit,
|
|
||||||
setUpdate: (Boolean) -> Unit,
|
|
||||||
setSweep: (Boolean) -> Unit,
|
|
||||||
setSensor: (Boolean) -> Unit
|
|
||||||
) {
|
|
||||||
ElevatedCard(modifier = Modifier.fillMaxWidth()) {
|
ElevatedCard(modifier = Modifier.fillMaxWidth()) {
|
||||||
Column(modifier = Modifier.padding(4.dp)) {
|
Column(modifier = Modifier.padding(4.dp)) {
|
||||||
Text(text = stringResource(id = R.string.other_title))
|
Text(text = stringResource(id = R.string.other_title))
|
||||||
@@ -333,7 +306,7 @@ private fun OtherCard(
|
|||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(id = R.string.other_switch_utc))
|
Text(text = stringResource(id = R.string.other_switch_utc))
|
||||||
Switch(checked = settings.isUtcEnabled, onCheckedChange = { setUtc(it) })
|
Switch(checked = settings.getUtc, onCheckedChange = { settings.setUtc(it) })
|
||||||
} // viewModel.setUseUTC(isChecked)
|
} // viewModel.setUseUTC(isChecked)
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
@@ -341,7 +314,7 @@ private fun OtherCard(
|
|||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(id = R.string.other_switch_update))
|
Text(text = stringResource(id = R.string.other_switch_update))
|
||||||
Switch(checked = settings.isUpdateEnabled, onCheckedChange = { setUpdate(it) })
|
Switch(checked = settings.getUpdate, onCheckedChange = { settings.setUpdate(it) })
|
||||||
} // AutoUpdateEnabled(isChecked)
|
} // AutoUpdateEnabled(isChecked)
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
@@ -349,7 +322,7 @@ private fun OtherCard(
|
|||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(id = R.string.other_switch_sweep))
|
Text(text = stringResource(id = R.string.other_switch_sweep))
|
||||||
Switch(checked = settings.isSweepEnabled, onCheckedChange = { setSweep(it) })
|
Switch(checked = settings.getSweep, onCheckedChange = { settings.setSweep(it) })
|
||||||
} // viewModel.setShowSweep(isChecked)
|
} // viewModel.setShowSweep(isChecked)
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
@@ -357,65 +330,15 @@ private fun OtherCard(
|
|||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(id = R.string.other_switch_sensors))
|
Text(text = stringResource(id = R.string.other_switch_sensors))
|
||||||
Switch(checked = settings.isSensorEnabled, onCheckedChange = { setSensor(it) })
|
Switch(checked = settings.getSensor, onCheckedChange = { settings.setSensor(it) })
|
||||||
} // viewModel.setUseCompass(isChecked)
|
} // viewModel.setUseCompass(isChecked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//private fun handleStationPosition(pos: DataState<GeoPos>) {
|
|
||||||
// when (pos) {
|
|
||||||
// is DataState.Success -> {
|
|
||||||
// setPositionText(pos.data)
|
|
||||||
// binding.settingsLocation.locationProgress.isIndeterminate = false
|
|
||||||
// viewModel.setPositionHandled()
|
|
||||||
// showToast(getString(R.string.location_success))
|
|
||||||
// }
|
|
||||||
// is DataState.Error -> {
|
|
||||||
// binding.settingsLocation.locationProgress.isIndeterminate = false
|
|
||||||
// viewModel.setPositionHandled()
|
|
||||||
// showToast(pos.message.toString())
|
|
||||||
// }
|
|
||||||
// DataState.Loading -> {
|
|
||||||
// binding.settingsLocation.locationProgress.isIndeterminate = true
|
|
||||||
// }
|
|
||||||
// DataState.Handled -> {}
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//private fun setPositionText(geoPos: GeoPos) {
|
|
||||||
// binding.run {
|
|
||||||
// val latFormat = getString(R.string.location_lat)
|
|
||||||
// val lonFormat = getString(R.string.location_lon)
|
|
||||||
// settingsLocation.locationLat.text = String.format(latFormat, geoPos.lat)
|
|
||||||
// settingsLocation.locationLon.text = String.format(lonFormat, geoPos.lon)
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//private fun handleSatState(state: DataState<Long>) {
|
|
||||||
// when (state) {
|
|
||||||
// is DataState.Success -> {
|
|
||||||
// binding.settingsData.dataProgress.isIndeterminate = false
|
|
||||||
// setUpdateTime(state.data)
|
|
||||||
// viewModel.setUpdateHandled()
|
|
||||||
// if (state.data == 0L) {
|
|
||||||
// showToast(getString(R.string.data_clear_success))
|
// showToast(getString(R.string.data_clear_success))
|
||||||
// } else {
|
|
||||||
// showToast(getString(R.string.data_success))
|
// showToast(getString(R.string.data_success))
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// is DataState.Error -> {
|
|
||||||
// binding.settingsData.dataProgress.isIndeterminate = false
|
|
||||||
// viewModel.setUpdateHandled()
|
|
||||||
// showToast(getString(R.string.data_error))
|
|
||||||
// }
|
|
||||||
// is DataState.Loading -> {
|
|
||||||
// binding.settingsData.dataProgress.isIndeterminate = true
|
|
||||||
// }
|
|
||||||
// is DataState.Handled -> {}
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
//
|
||||||
//private fun setUpdateTime(updateTime: Long) {
|
//private fun setUpdateTime(updateTime: Long) {
|
||||||
// val updatePattern = getString(R.string.data_update)
|
// val updatePattern = getString(R.string.data_update)
|
||||||
@@ -469,3 +392,10 @@ private fun CardCredits(modifier: Modifier = Modifier) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun UpdateIndicator(isUpdating: Boolean, modifier: Modifier = Modifier) = if (isUpdating) {
|
||||||
|
LinearProgressIndicator(modifier = modifier.padding(start = 6.dp, end = 6.dp))
|
||||||
|
} else {
|
||||||
|
LinearProgressIndicator(modifier = modifier.padding(start = 6.dp, end = 6.dp), progress = 0f)
|
||||||
|
}
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
package com.rtbishop.look4sat.presentation.settingsScreen
|
||||||
|
|
||||||
|
data class LocationSettings(
|
||||||
|
val getUpdating: Boolean,
|
||||||
|
val getLastUpdated: Long,
|
||||||
|
val getLatitude: Double,
|
||||||
|
val getLongitude: Double,
|
||||||
|
val getLocator: String,
|
||||||
|
val setGpsLoc: () -> Unit,
|
||||||
|
val setManualLoc: (Double, Double) -> Unit,
|
||||||
|
val setQthLoc: (String) -> Unit
|
||||||
|
)
|
||||||
|
|
||||||
|
data class DataSettings(
|
||||||
|
val getUpdating: Boolean,
|
||||||
|
val getLastUpdated: Long,
|
||||||
|
val getSatellites: Int,
|
||||||
|
val getRadios: Int,
|
||||||
|
val updateFromWeb: () -> Unit,
|
||||||
|
val updateFromFile: (String) -> Unit,
|
||||||
|
val clearAllData: () -> Unit
|
||||||
|
)
|
||||||
|
|
||||||
|
data class OtherSettings(
|
||||||
|
val getUtc: Boolean,
|
||||||
|
val getUpdate: Boolean,
|
||||||
|
val getSweep: Boolean,
|
||||||
|
val getSensor: Boolean,
|
||||||
|
val setUtc: (Boolean) -> Unit,
|
||||||
|
val setUpdate: (Boolean) -> Unit,
|
||||||
|
val setSweep: (Boolean) -> Unit,
|
||||||
|
val setSensor: (Boolean) -> Unit
|
||||||
|
)
|
||||||
+74
-86
@@ -17,17 +17,16 @@
|
|||||||
*/
|
*/
|
||||||
package com.rtbishop.look4sat.presentation.settingsScreen
|
package com.rtbishop.look4sat.presentation.settingsScreen
|
||||||
|
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.rtbishop.look4sat.domain.IDataRepository
|
import com.rtbishop.look4sat.domain.IDataRepository
|
||||||
import com.rtbishop.look4sat.domain.ILocationManager
|
import com.rtbishop.look4sat.domain.ILocationManager
|
||||||
import com.rtbishop.look4sat.domain.ISettingsManager
|
import com.rtbishop.look4sat.domain.ISettingsManager
|
||||||
import com.rtbishop.look4sat.domain.model.DataState
|
import com.rtbishop.look4sat.domain.model.DataState
|
||||||
import com.rtbishop.look4sat.domain.model.OtherSettings
|
|
||||||
import com.rtbishop.look4sat.domain.predict.GeoPos
|
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.SharedFlow
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
@@ -37,100 +36,89 @@ class SettingsViewModel @Inject constructor(
|
|||||||
private val settings: ISettingsManager
|
private val settings: ISettingsManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private val _otherSettings = MutableStateFlow(
|
private val defaultLocationSettings = LocationSettings(false,
|
||||||
OtherSettings(
|
settings.getLastUpdateTime(),
|
||||||
settings.isUtcEnabled(),
|
locationManager.getStationPosition().lat,
|
||||||
settings.isUpdateEnabled(),
|
locationManager.getStationPosition().lon,
|
||||||
settings.isSweepEnabled(),
|
settings.loadStationLocator(),
|
||||||
settings.isSensorEnabled()
|
{ locationManager.setPositionFromGps() },
|
||||||
)
|
{ lat, lon -> locationManager.setStationPosition(lat, lon) },
|
||||||
)
|
{ locationManager.setPositionFromQth(it) })
|
||||||
val otherSettings: StateFlow<OtherSettings> = _otherSettings
|
var locationSettings = mutableStateOf(defaultLocationSettings)
|
||||||
|
private set
|
||||||
|
|
||||||
fun setUtcState(value: Boolean) {
|
private val defaultDataSettings = DataSettings(false,
|
||||||
|
settings.getLastUpdateTime(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
{ repository.updateFromWeb() },
|
||||||
|
{ repository.updateFromFile(it) },
|
||||||
|
{ repository.clearAllData() })
|
||||||
|
var dataSettings = mutableStateOf(defaultDataSettings)
|
||||||
|
private set
|
||||||
|
|
||||||
|
private val defaultOtherSettings = OtherSettings(settings.isUtcEnabled(),
|
||||||
|
settings.isUpdateEnabled(),
|
||||||
|
settings.isSweepEnabled(),
|
||||||
|
settings.isSensorEnabled(),
|
||||||
|
{ setUtc(it) },
|
||||||
|
{ setUpdate(it) },
|
||||||
|
{ setSweep(it) },
|
||||||
|
{ setSensor(it) })
|
||||||
|
var otherSettings = mutableStateOf(defaultOtherSettings)
|
||||||
|
private set
|
||||||
|
|
||||||
|
init {
|
||||||
|
viewModelScope.launch {
|
||||||
|
repository.updateState.collect {
|
||||||
|
val isUpdating = it is DataState.Loading
|
||||||
|
dataSettings.value = dataSettings.value.copy(
|
||||||
|
getUpdating = isUpdating, getLastUpdated = settings.getLastUpdateTime()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
viewModelScope.launch {
|
||||||
|
combine(repository.getEntriesTotal(), repository.getRadiosTotal()) { sats, radios ->
|
||||||
|
dataSettings.value =
|
||||||
|
dataSettings.value.copy(getSatellites = sats, getRadios = radios)
|
||||||
|
}.collect {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setUtc(value: Boolean) {
|
||||||
settings.setUtcState(value)
|
settings.setUtcState(value)
|
||||||
_otherSettings.value = otherSettings.value.copy(isUtcEnabled = value)
|
otherSettings.value = otherSettings.value.copy(getUtc = value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setUpdateState(value: Boolean) {
|
private fun setUpdate(value: Boolean) {
|
||||||
settings.setUpdateState(value)
|
settings.setUpdateState(value)
|
||||||
_otherSettings.value = otherSettings.value.copy(isUpdateEnabled = value)
|
otherSettings.value = otherSettings.value.copy(getUpdate = value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setSweepState(value: Boolean) {
|
private fun setSweep(value: Boolean) {
|
||||||
settings.setSweepState(value)
|
settings.setSweepState(value)
|
||||||
_otherSettings.value = otherSettings.value.copy(isSweepEnabled = value)
|
otherSettings.value = otherSettings.value.copy(getSweep = value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setSensorState(value: Boolean) {
|
private fun setSensor(value: Boolean) {
|
||||||
settings.setSensorState(value)
|
settings.setSensorState(value)
|
||||||
_otherSettings.value = otherSettings.value.copy(isSensorEnabled = value)
|
otherSettings.value = otherSettings.value.copy(getSensor = value)
|
||||||
}
|
}
|
||||||
|
|
||||||
val entriesTotal = repository.getEntriesTotal()
|
// fun getRotatorEnabled(): Boolean = settings.getRotatorEnabled()
|
||||||
val radiosTotal = repository.getRadiosTotal()
|
// fun setRotatorEnabled(value: Boolean) = settings.setRotatorEnabled(value)
|
||||||
|
// fun getRotatorServer(): String = settings.getRotatorServer()
|
||||||
fun updateFromFile(uri: String) = repository.updateFromFile(uri)
|
// fun setRotatorServer(value: String) = settings.setRotatorServer(value)
|
||||||
|
// fun getRotatorPort(): String = settings.getRotatorPort()
|
||||||
fun updateFromWeb() = repository.updateFromWeb()
|
// fun setRotatorPort(value: String) = settings.setRotatorPort(value)
|
||||||
|
// fun getBTEnabled(): Boolean = settings.getBTEnabled()
|
||||||
fun clearAllData() = repository.clearAllData()
|
// fun setBTEnabled(value: Boolean) = settings.setBTEnabled(value)
|
||||||
|
// fun getBTFormat(): String = settings.getBTFormat()
|
||||||
fun getUseUTC(): Boolean = settings.isUtcEnabled()
|
// fun setBTFormat(value: String) = settings.setBTFormat(value)
|
||||||
|
|
||||||
fun getLastUpdateTime(): Long = settings.getLastUpdateTime()
|
|
||||||
|
|
||||||
fun getAutoUpdateEnabled(): Boolean = settings.isUpdateEnabled()
|
|
||||||
|
|
||||||
fun getUseCompass(): Boolean = settings.isSensorEnabled()
|
|
||||||
|
|
||||||
fun getShowSweep(): Boolean = settings.isSweepEnabled()
|
|
||||||
|
|
||||||
fun getRotatorEnabled(): Boolean = settings.getRotatorEnabled()
|
|
||||||
|
|
||||||
fun setRotatorEnabled(value: Boolean) = settings.setRotatorEnabled(value)
|
|
||||||
|
|
||||||
fun getRotatorServer(): String = settings.getRotatorServer()
|
|
||||||
|
|
||||||
fun setRotatorServer(value: String) = settings.setRotatorServer(value)
|
|
||||||
|
|
||||||
fun getRotatorPort(): String = settings.getRotatorPort()
|
|
||||||
|
|
||||||
fun setRotatorPort(value: String) = settings.setRotatorPort(value)
|
|
||||||
|
|
||||||
fun getBTEnabled(): Boolean = settings.getBTEnabled()
|
|
||||||
|
|
||||||
fun setBTEnabled(value: Boolean) = settings.setBTEnabled(value)
|
|
||||||
|
|
||||||
fun getBTFormat(): String = settings.getBTFormat()
|
|
||||||
|
|
||||||
fun setBTFormat(value: String) = settings.setBTFormat(value)
|
|
||||||
|
|
||||||
// fun getBTDeviceName(): String = settings.getBTDeviceName()
|
// fun getBTDeviceName(): String = settings.getBTDeviceName()
|
||||||
|
|
||||||
// fun setBTDeviceName(value: String) = settings.setBTDeviceName(value)
|
// fun setBTDeviceName(value: String) = settings.setBTDeviceName(value)
|
||||||
|
// fun getBTDeviceAddr(): String = settings.getBTDeviceAddr()
|
||||||
fun getBTDeviceAddr(): String = settings.getBTDeviceAddr()
|
// fun setBTDeviceAddr(value: String) = settings.setBTDeviceAddr(value)
|
||||||
|
|
||||||
fun setBTDeviceAddr(value: String) = settings.setBTDeviceAddr(value)
|
|
||||||
|
|
||||||
fun getDataUpdateState() = repository.updateState
|
|
||||||
|
|
||||||
fun setUpdateHandled() = repository.setUpdateStateHandled()
|
|
||||||
|
|
||||||
val stationPosition: SharedFlow<DataState<GeoPos>> = locationManager.stationPosition
|
|
||||||
|
|
||||||
fun getStationPosition(): GeoPos = locationManager.getStationPosition()
|
|
||||||
|
|
||||||
fun getStationLocator(): String = settings.loadStationLocator()
|
|
||||||
|
|
||||||
fun setStationPosition(lat: Double, lon: Double) = locationManager.setStationPosition(lat, lon)
|
|
||||||
|
|
||||||
fun setPositionFromGps() = locationManager.setPositionFromGps()
|
|
||||||
|
|
||||||
fun setPositionFromNet() = locationManager.setPositionFromNet()
|
|
||||||
|
|
||||||
fun setPositionFromQth(qthString: String) = locationManager.setPositionFromQth(qthString)
|
|
||||||
|
|
||||||
fun setPositionHandled() = locationManager.setPositionHandled()
|
|
||||||
}
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package com.rtbishop.look4sat.domain.model
|
|
||||||
|
|
||||||
data class OtherSettings(
|
|
||||||
val isUtcEnabled: Boolean,
|
|
||||||
val isUpdateEnabled: Boolean,
|
|
||||||
val isSweepEnabled: Boolean,
|
|
||||||
val isSensorEnabled: Boolean
|
|
||||||
)
|
|
||||||
Reference in new issue
Block a user