diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt index ee0f66ac..38c3b55c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/common/Components.kt @@ -232,9 +232,10 @@ fun EmptyListCard(message: String) { Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { Column( horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp), + verticalArrangement = Arrangement.spacedBy(24.dp), modifier = Modifier.padding(32.dp) ) { + Text(text = """¯\_(ツ)_/¯""", fontSize = 32.sp) Text(text = stringResource(R.string.empty_list_message), fontSize = 21.sp) Text(text = message, fontSize = 18.sp, textAlign = TextAlign.Center) } @@ -242,7 +243,7 @@ fun EmptyListCard(message: String) { } fun getDefaultPass(): OrbitalPass { - val orbitalData = OrbitalData("||=<☉>=||", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0.0) + val orbitalData = OrbitalData(""" ¯\_(ツ)_/¯ ⚠️""", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0.0) val satellite = NearEarthObject(orbitalData) return OrbitalPass(0L, 0.0, Long.MAX_VALUE, 0.0, 0, 0.0, satellite, 0f) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt index 014f5271..d311bb03 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt @@ -120,7 +120,7 @@ private fun PassesScreen(uiState: PassesState, navigateToRadar: (Int, Long) -> U } ) } - ) { isVerticalLayout -> + ) { _ -> PassesList( isRefreshing = uiState.isRefreshing, passes = uiState.itemsList, diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt index 178718bd..9741fdca 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt @@ -12,10 +12,8 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn @@ -100,77 +98,69 @@ private fun RadarScreen(uiState: RadarState, navigateUp: () -> Unit) { if(isVerticalLayout()) { ElevatedCard(modifier = Modifier.weight(1f)) { Box(contentAlignment = Alignment.Center) { - if (uiState.orbitalPos == null) { - ElevatedCard(modifier = Modifier.fillMaxSize()) {} - } - uiState.orbitalPos?.let { position -> - RadarViewCompose( - item = position, - items = uiState.satTrack, - azimElev = uiState.orientationValues, - shouldShowSweep = uiState.shouldShowSweep, - shouldUseCompass = uiState.shouldUseCompass, - modifier = Modifier.align(Alignment.Center) - ) - Column( - verticalArrangement = Arrangement.SpaceBetween, - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 6.dp, vertical = 4.dp) + RadarViewCompose( + item = uiState.orbitalPos, + items = uiState.satTrack, + azimElev = uiState.orientationValues, + shouldShowSweep = uiState.shouldShowSweep, + shouldUseCompass = uiState.shouldUseCompass, + modifier = Modifier.align(Alignment.Center) + ) + Column( + verticalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 6.dp, vertical = 4.dp) + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() ) { - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - RadarTextTop( - position.azimuth, - stringResource(R.string.radar_az_text), - true - ) - RadarTextTop( - position.elevation, - stringResource(R.string.radar_el_text), - false - ) - } - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - RadarTextBottom( - position.altitude, - stringResource(R.string.radar_alt_text), - true - ) - RadarTextBottom( - position.distance, - stringResource(R.string.radar_dist_text), - false - ) - } + RadarTextTop( + uiState.orbitalPos?.azimuth ?: 0.0, + stringResource(R.string.radar_az_text), + true + ) + RadarTextTop( + uiState.orbitalPos?.elevation ?: 0.0, + stringResource(R.string.radar_el_text), + false + ) + } + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + RadarTextBottom( + uiState.orbitalPos?.altitude ?: 0.0, + stringResource(R.string.radar_alt_text), + true + ) + RadarTextBottom( + uiState.orbitalPos?.distance ?: 0.0, + stringResource(R.string.radar_dist_text), + false + ) } } } } ElevatedCard(modifier = Modifier.weight(1f)) { if (uiState.transmitters.isEmpty()) { - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Icon( - painter = painterResource(R.drawable.ic_radios), - contentDescription = null, - modifier = Modifier.size(64.dp) - ) - Spacer(modifier = Modifier.height(16.dp)) - Text( - text = "This satellite doesn't have any known transcievers...", - textAlign = TextAlign.Center, - fontSize = 18.sp, - modifier = Modifier.padding(16.dp) - ) + Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(24.dp), + modifier = Modifier.padding(32.dp) + ) { + Text(text = """¯\_(ツ)_/¯""", fontSize = 32.sp) + Text(text = stringResource(R.string.empty_list_message), fontSize = 21.sp) + Text( + text = stringResource(R.string.radar_no_data), + fontSize = 18.sp, + textAlign = TextAlign.Center + ) + } } } else { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { @@ -185,77 +175,69 @@ private fun RadarScreen(uiState: RadarState, navigateUp: () -> Unit) { Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { ElevatedCard(modifier = Modifier.weight(1f)) { Box(contentAlignment = Alignment.Center) { - if (uiState.orbitalPos == null) { - ElevatedCard(modifier = Modifier.fillMaxSize()) {} - } - uiState.orbitalPos?.let { position -> - RadarViewCompose( - item = position, - items = uiState.satTrack, - azimElev = uiState.orientationValues, - shouldShowSweep = uiState.shouldShowSweep, - shouldUseCompass = false, - modifier = Modifier.align(Alignment.Center) - ) - Column( - verticalArrangement = Arrangement.SpaceBetween, - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 6.dp, vertical = 4.dp) + RadarViewCompose( + item = uiState.orbitalPos, + items = uiState.satTrack, + azimElev = uiState.orientationValues, + shouldShowSweep = uiState.shouldShowSweep, + shouldUseCompass = false, + modifier = Modifier.align(Alignment.Center) + ) + Column( + verticalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 6.dp, vertical = 4.dp) + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() ) { - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - RadarTextTop( - position.azimuth, - stringResource(R.string.radar_az_text), - true - ) - RadarTextTop( - position.elevation, - stringResource(R.string.radar_el_text), - false - ) - } - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - RadarTextBottom( - position.altitude, - stringResource(R.string.radar_alt_text), - true - ) - RadarTextBottom( - position.distance, - stringResource(R.string.radar_dist_text), - false - ) - } + RadarTextTop( + uiState.orbitalPos?.azimuth ?: 0.0, + stringResource(R.string.radar_az_text), + true + ) + RadarTextTop( + uiState.orbitalPos?.elevation ?: 0.0, + stringResource(R.string.radar_el_text), + false + ) + } + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + RadarTextBottom( + uiState.orbitalPos?.altitude ?: 0.0, + stringResource(R.string.radar_alt_text), + true + ) + RadarTextBottom( + uiState.orbitalPos?.distance ?: 0.0, + stringResource(R.string.radar_dist_text), + false + ) } } } } ElevatedCard(modifier = Modifier.weight(1f)) { if (uiState.transmitters.isEmpty()) { - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Icon( - painter = painterResource(R.drawable.ic_radios), - contentDescription = null, - modifier = Modifier.size(64.dp) - ) - Spacer(modifier = Modifier.height(16.dp)) - Text( - text = "This satellite doesn't have any known transcievers...", - textAlign = TextAlign.Center, - fontSize = 18.sp, - modifier = Modifier.padding(16.dp) - ) + Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(24.dp), + modifier = Modifier.padding(32.dp) + ) { + Text(text = """¯\_(ツ)_/¯""", fontSize = 32.sp) + Text(text = stringResource(R.string.empty_list_message), fontSize = 21.sp) + Text( + text = stringResource(R.string.radar_no_data), + fontSize = 18.sp, + textAlign = TextAlign.Center + ) + } } } else { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt index 06c15c15..1c85564c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt @@ -42,7 +42,7 @@ import kotlin.math.sin @Composable fun RadarViewCompose( - item: OrbitalPos, + item: OrbitalPos?, items: List, azimElev: Pair, shouldShowSweep: Boolean, @@ -144,7 +144,7 @@ fun RadarViewCompose( drawInfo(radius, trackColor, measurer, 3) translate(center.x, center.y) { drawTrack(trackPath.value, trackEffect.value, aimColor, trackColor) - if (item.elevation > 0) { + if (item != null && item.elevation > 0) { drawPosition(item, radius, animScale.value, trackColor) } if (shouldUseCompass) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt index 5ea6e365..7564a074 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -33,7 +34,6 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -72,7 +72,7 @@ fun NavGraphBuilder.settingsDestination() { private fun SettingsScreen(uiState: SettingsState) { // Permissions setup val bluetoothContract = ActivityResultContracts.RequestPermission() - val bluetoothError = stringResource(R.string.prefs_BTremote_perm_error) + val bluetoothError = stringResource(R.string.prefs_bt_perm_error) val bluetoothPerm = when { Build.VERSION.SDK_INT < Build.VERSION_CODES.S -> Manifest.permission.BLUETOOTH else -> Manifest.permission.BLUETOOTH_CONNECT @@ -100,8 +100,7 @@ private fun SettingsScreen(uiState: SettingsState) { } // Position settings - val positionSettings = uiState.positionSettings - val stationPos = positionSettings.stationPos + val posSettings = uiState.positionSettings val setGpsPos = { locationRequest.launch(arrayOf(locationPermCoarse, locationPermFine)) } val setGeoPos = { lat: Double, lon: Double -> uiState.sendAction(SettingsAction.SetGeoPosition(lat, lon)) @@ -113,12 +112,12 @@ private fun SettingsScreen(uiState: SettingsState) { val posDialogState = rememberSaveable { mutableStateOf(false) } val showPosDialog = { posDialogState.value = posDialogState.value.not() } if (posDialogState.value) { - PositionDialog(stationPos.latitude, stationPos.longitude, showPosDialog, setGeoPos) + PositionDialog(posSettings.stationPos.latitude, posSettings.stationPos.longitude, showPosDialog, setGeoPos) } val locDialogState = rememberSaveable { mutableStateOf(false) } val showLocDialog = { locDialogState.value = locDialogState.value.not() } if (locDialogState.value) { - LocatorDialog(positionSettings.stationPos.qthLocator, showLocDialog, setQthPos) + LocatorDialog(posSettings.stationPos.qthLocator, showLocDialog, setQthPos) } // Data settings @@ -146,32 +145,40 @@ private fun SettingsScreen(uiState: SettingsState) { val toggleSweep = { value: Boolean -> uiState.sendAction(SettingsAction.ToggleSweep(value)) } val toggleSensor = { value: Boolean -> uiState.sendAction(SettingsAction.ToggleSensor(value)) } val uriHandler = LocalUriHandler.current + val appUrl = stringResource(R.string.prefs_app_url) + val donateUrl = stringResource(R.string.prefs_donate_url) + val fdroidTitle = stringResource(R.string.prefs_fdroid_title) + val fdroidUrl = stringResource(R.string.prefs_fdroid_url) + val gitHubTitle = stringResource(R.string.prefs_github_title) + val gitHubUrl = stringResource(R.string.prefs_github_url) + val licenseUrl = stringResource(R.string.prefs_license_url) + val privacyUrl = stringResource(R.string.prefs_privacy_url) ScreenColumn( topBar = { isVerticalLayout -> if (isVerticalLayout) { TopBar { - TopCard(onClick = { uriHandler.openUri("https://play.google.com/store/apps/details?id=com.rtbishop.look4sat") }, version = uiState.appVersionName, modifier = Modifier.weight(1f)) - PrimaryIconCard(onClick = { uriHandler.openUri("https://ko-fi.com/rt_bishop") }, resId = R.drawable.ic_pound) + TopCard(onClick = { uriHandler.openUri(appUrl) }, version = uiState.appVersionName, modifier = Modifier.weight(1f)) + PrimaryIconCard(onClick = { uriHandler.openUri(donateUrl) }, resId = R.drawable.ic_pound) } TopBar { Row(modifier = Modifier.weight(1f), horizontalArrangement = Arrangement.spacedBy(6.dp)) { - BotCard(onClick = { uriHandler.openUri("https://www.gnu.org/licenses/gpl-3.0.html") }, R.drawable.ic_license, "Licence", modifier = Modifier.weight(1f)) - BotCard(onClick = { uriHandler.openUri("https://sites.google.com/view/look4sat-privacy-policy/home") }, R.drawable.ic_policy, "Privacy", modifier = Modifier.weight(1f)) + BotCard(onClick = { uriHandler.openUri(fdroidUrl) }, R.drawable.ic_fdroid, fdroidTitle, modifier = Modifier.weight(1f)) + BotCard(onClick = { uriHandler.openUri(gitHubUrl) }, R.drawable.ic_github, gitHubTitle, modifier = Modifier.weight(1f)) } - IconCard(action = { uriHandler.openUri("https://f-droid.org/en/packages/com.rtbishop.look4sat/") }, resId = R.drawable.ic_fdroid) - IconCard(action = { uriHandler.openUri("https://github.com/rt-bishop/Look4Sat/") }, resId = R.drawable.ic_github) + IconCard(action = { uriHandler.openUri(licenseUrl) }, resId = R.drawable.ic_license) + IconCard(action = { uriHandler.openUri(privacyUrl) }, resId = R.drawable.ic_policy) } } else { TopBar { - PrimaryIconCard(onClick = { uriHandler.openUri("https://ko-fi.com/rt_bishop") }, resId = R.drawable.ic_pound) - TopCard(onClick = { uriHandler.openUri("https://play.google.com/store/apps/details?id=com.rtbishop.look4sat") }, version = uiState.appVersionName, modifier = Modifier.weight(1f)) + PrimaryIconCard(onClick = { uriHandler.openUri(donateUrl) }, resId = R.drawable.ic_pound) + TopCard(onClick = { uriHandler.openUri(appUrl) }, version = uiState.appVersionName, modifier = Modifier.weight(1f)) Row(modifier = Modifier.weight(1f), horizontalArrangement = Arrangement.spacedBy(6.dp)) { - BotCard(onClick = { uriHandler.openUri("https://www.gnu.org/licenses/gpl-3.0.html") }, R.drawable.ic_license, "Licence", modifier = Modifier.weight(1f)) - BotCard(onClick = { uriHandler.openUri("https://sites.google.com/view/look4sat-privacy-policy/home") }, R.drawable.ic_policy, "Privacy", modifier = Modifier.weight(1f)) + BotCard(onClick = { uriHandler.openUri(fdroidUrl) }, R.drawable.ic_fdroid, fdroidTitle, modifier = Modifier.weight(1f)) + BotCard(onClick = { uriHandler.openUri(gitHubUrl) }, R.drawable.ic_github, gitHubTitle, modifier = Modifier.weight(1f)) } - IconCard(action = { uriHandler.openUri("https://f-droid.org/en/packages/com.rtbishop.look4sat/") }, resId = R.drawable.ic_fdroid) - IconCard(action = { uriHandler.openUri("https://github.com/rt-bishop/Look4Sat/") }, resId = R.drawable.ic_github) + IconCard(action = { uriHandler.openUri(licenseUrl) }, resId = R.drawable.ic_license) + IconCard(action = { uriHandler.openUri(privacyUrl) }, resId = R.drawable.ic_policy) } } } @@ -183,27 +190,12 @@ private fun SettingsScreen(uiState: SettingsState) { modifier = Modifier.clip(MaterialTheme.shapes.medium) ) { item { - LocationCard( - positionSettings, - setGpsPos, - showPosDialog, - showLocDialog, - dismissPos, - uiState.sendSystemAction - ) + LocationCard(posSettings, setGpsPos, showPosDialog, showLocDialog, dismissPos, uiState.sendSystemAction) } item { DataCard(dataSettings, updateFromWeb, updateFromFile, clearAllData) } item { NetworkOutputCard(rcSettings, setRotatorState, setRotatorAddress, setRotatorPort) } item { BluetoothOutputCard(rcSettings, setBluetoothState, setBluetoothAddress, setBluetoothFormat) } - item { - OtherCard( - otherSettings, - toggleUtc, - toggleUpdate, - toggleSweep, - toggleSensor - ) - } + item { OtherCard(otherSettings, toggleUtc, toggleUpdate, toggleSweep, toggleSensor) } item { CardCredits() } } } @@ -241,22 +233,10 @@ private fun LocationCard( Spacer(modifier = Modifier.height(2.dp)) Text(text = setUpdateTime(updateTime = settings.stationPos.timestamp)) Spacer(modifier = Modifier.height(2.dp)) - Row(horizontalArrangement = Arrangement.SpaceBetween) { - Text( - text = "Lat: ${settings.stationPos.latitude}°", - modifier = Modifier.weight(1f), - textAlign = TextAlign.Start - ) - Text( - text = "Lon: ${settings.stationPos.longitude}°", - modifier = Modifier.weight(1f), - textAlign = TextAlign.Center - ) - Text( - text = "Qth: ${settings.stationPos.qthLocator}", - modifier = Modifier.weight(1f), - textAlign = TextAlign.End - ) + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = "Lat: ${settings.stationPos.latitude}") + Text(text = "Lon: ${settings.stationPos.longitude}") + Text(text = "Qth: ${settings.stationPos.qthLocator}") } Spacer(modifier = Modifier.height(1.dp)) Row(horizontalArrangement = Arrangement.SpaceEvenly) { @@ -268,7 +248,7 @@ private fun LocationCard( Spacer(modifier = Modifier.width(6.dp)) CardButton( onClick = showPosDialog, - text = stringResource(id = R.string.prefs_loc_manual_title), + text = stringResource(id = R.string.prefs_loc_input_title), modifier = Modifier.weight(1f) ) Spacer(modifier = Modifier.width(6.dp)) @@ -318,16 +298,15 @@ private fun DataCard( Spacer(modifier = Modifier.height(2.dp)) Text(text = setUpdateTime(updateTime = settings.timestamp)) Spacer(modifier = Modifier.height(2.dp)) - Row(horizontalArrangement = Arrangement.SpaceBetween) { - Text(text = "Satellites: ${settings.entriesTotal}") - Spacer(modifier = Modifier.weight(1f)) - Text(text = "Transceivers: ${settings.radiosTotal}") + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(R.string.prefs_data_entries, settings.entriesTotal)) + Text(text = stringResource(R.string.prefs_data_radios, settings.radiosTotal)) } Spacer(modifier = Modifier.height(1.dp)) Row(horizontalArrangement = Arrangement.SpaceEvenly) { CardButton( onClick = { updateFromWeb() }, - text = stringResource(id = R.string.prefs_data_online), + text = stringResource(id = R.string.prefs_data_update), modifier = Modifier.weight(1f) ) Spacer(modifier = Modifier.width(6.dp)) @@ -372,7 +351,7 @@ private fun NetworkOutputCard( ElevatedCard(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp)) { Text( - text = stringResource(id = R.string.prefs_remote_title), + text = stringResource(id = R.string.prefs_net_title), color = MaterialTheme.colorScheme.primary ) Row( @@ -380,7 +359,7 @@ private fun NetworkOutputCard( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { - Text(text = stringResource(R.string.prefs_remote_switch)) + Text(text = stringResource(R.string.prefs_net_switch)) Switch(checked = settings.rotatorState, onCheckedChange = { setRotatorState(it) }) } Row( @@ -391,7 +370,7 @@ private fun NetworkOutputCard( OutlinedTextField( value = settings.rotatorAddress, singleLine = true, - label = { Text(text = stringResource(R.string.prefs_remote_ip_hint)) }, + label = { Text(text = stringResource(R.string.prefs_net_ip_hint)) }, onValueChange = { setRotatorAddress(it) }, modifier = Modifier.weight(1.5f), enabled = settings.rotatorState @@ -399,7 +378,7 @@ private fun NetworkOutputCard( OutlinedTextField( value = settings.rotatorPort, onValueChange = { setRotatorPort(it) }, - label = { Text(text = stringResource(R.string.prefs_remote_port_hint)) }, + label = { Text(text = stringResource(R.string.prefs_net_port_hint)) }, singleLine = true, modifier = Modifier.weight(1f), enabled = settings.rotatorState @@ -435,7 +414,7 @@ private fun BluetoothOutputCard( ElevatedCard(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp)) { Text( - text = stringResource(id = R.string.prefs_BTremote_title), + text = stringResource(id = R.string.prefs_bt_title), color = MaterialTheme.colorScheme.primary ) Row( @@ -443,7 +422,7 @@ private fun BluetoothOutputCard( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { - Text(text = stringResource(R.string.prefs_BTremote_switch)) + Text(text = stringResource(R.string.prefs_bt_switch)) Switch(checked = settings.bluetoothState, onCheckedChange = { setBluetoothState(it) }) } Row( @@ -454,7 +433,7 @@ private fun BluetoothOutputCard( OutlinedTextField( value = settings.bluetoothAddress, singleLine = true, - label = { Text(text = stringResource(R.string.prefs_BTremote_device_hint)) }, + label = { Text(text = stringResource(R.string.prefs_bt_device_hint)) }, onValueChange = { setBluetoothAddress(it) }, modifier = Modifier.weight(1.5f), enabled = settings.bluetoothState @@ -462,7 +441,7 @@ private fun BluetoothOutputCard( OutlinedTextField( value = settings.bluetoothFormat, onValueChange = { setBluetoothFormat(it) }, - label = { Text(text = stringResource(R.string.prefs_BTremote_output_hint)) }, + label = { Text(text = stringResource(R.string.prefs_bt_output_hint)) }, singleLine = true, modifier = Modifier.weight(1f), enabled = settings.bluetoothState @@ -496,8 +475,12 @@ private fun OtherCard( toggleSweep: (Boolean) -> Unit, toggleSensor: (Boolean) -> Unit ) { - ElevatedCard(modifier = Modifier.fillMaxWidth()) { - Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 2.dp)) { + ElevatedCard(modifier = Modifier.fillMaxWidth().height(220.dp)) { + Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp)) { + Text( + text = stringResource(id = R.string.prefs_bt_title), + color = MaterialTheme.colorScheme.primary + ) Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, @@ -562,29 +545,21 @@ private fun CardCreditsPreview() = MainTheme { CardCredits() } @Composable private fun CardCredits(modifier: Modifier = Modifier) { - ElevatedCard(modifier = modifier.fillMaxWidth()) { + ElevatedCard(modifier = modifier.fillMaxWidth().height(220.dp)) { Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp) + verticalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp).fillMaxHeight() ) { Text( text = stringResource(id = R.string.prefs_outro_title), - fontSize = 18.sp, - fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.primary, - modifier = modifier.padding(6.dp) + color = MaterialTheme.colorScheme.primary ) Text( - text = stringResource( - id = R.string.prefs_outro_thanks - ), fontSize = 16.sp, textAlign = TextAlign.Center + text = stringResource(id = R.string.prefs_outro_thanks) ) Text( text = stringResource(id = R.string.prefs_outro_license), - fontSize = 18.sp, - fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.primary, - modifier = modifier.padding(6.dp) + color = MaterialTheme.colorScheme.primary ) } } @@ -606,7 +581,7 @@ private fun TopCard(onClick: () -> Unit, modifier: Modifier = Modifier, version: tint = MaterialTheme.colorScheme.primary ) Text( - text = "Look4Sat v$version", + text = stringResource(R.string.prefs_app_title, version), fontSize = 24.sp, fontWeight = FontWeight.Medium, modifier = Modifier diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt index 1bb89cf0..1e2fead8 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt @@ -174,7 +174,7 @@ class SettingsViewModel( ) _uiState.update { it.copy(positionSettings = newPosSettings) } } else { - val errorResId = R.string.prefs_loc_manual_error + val errorResId = R.string.prefs_loc_input_error val newPosSettings = _uiState.value.positionSettings.copy( isUpdating = false, messageResId = errorResId ) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5b51af22..d297d02a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -3,7 +3,7 @@ Aceptar Cancelar - No items to display + No hay datos para mostrar Satélites @@ -35,7 +35,6 @@ Tipo de modulación ELEV: %.1f° ALT: %.0f km - No hay datos para mostrar. Por favor, actualiza la base de datos a través del menú Ajustes. Make sure your filters are correct and you have selected satellites No hay pases de satélite próximos para mostrar @@ -54,11 +53,11 @@ Eclipsado Downlink Uplink + Este satélite no lleva transmisores Añadir Transmisores satélite: Invertido: %s Modo: %s - Este satélite no lleva transmisores No Si Visible @@ -80,11 +79,8 @@ Visible - Soporte - GPLv3 Licence - Privacy Policy - F-Droid - GitHub + Soporte + Privacy Policy Última actualización: %s d MMM yyyy - HH:mm:ss @@ -92,8 +88,8 @@ Ubicación estación GPS Revisa los permisos de ubicación - Manual - Ubicación no válida + Manual + Ubicación no válida QTH Ubicación QTH no válida Ubicación actualizada con éxito @@ -106,44 +102,30 @@ Actualizar datos de satélites Satélites: %s Transmisores: %s - Online + Online Importar Vaciar Datos eliminados con éxito Actualización completada con éxito - Preferencias Rotator - Habilitar control remoto - Dirección IP - Puerto + Preferencias Rotator + Habilitar control remoto + Dirección IP + Puerto - Salida por Bluetooth - Habilitar salida - Id dispositivo - Formato de datos - Revisa los permisos de Bluetooth + Salida por Bluetooth + Habilitar salida + Id dispositivo + Formato de datos + Revisa los permisos de Bluetooth + Other settings Mostrar tiempos de pase en UTC Habilitar auto actualización de datos Habilitar animaciones radar Usar sensores para rotar vista de radar Me gustaría dar las gracias a: - • ti por descargar y usar Look4Sat! \nQue tengas cielos despejados! - \n • David A. B. Johnson - y Dave Moten por crear predict4java lib - bajo GNU GPLv2. - \n • Alexandru Csete por crear el rastreador de satélites Gpredict - que ha inspirado la creación de Look4Sat. - \n • Dr T.S. Kelso por mantener - Celestrak que proporciona acceso a datos TLE. - \n • Libre Space Foundation por la API y base de datos - SatNOGS que proporciona gran cantidad de datos de satélites. - \n • DownloadAstro - por su interés en la app y la entrevista publicada. - - Política de privacidad. - La app viene sin garantías de ningún tipo. \nPara más información revisa la licencia GNU GPLv3. - + La app viene sin garantías de ningún tipo. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3056ce06..a24300a2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -3,7 +3,7 @@ Принять Отменить - No items to display + Нет данных для отображения Спутники @@ -35,7 +35,6 @@ Выберите тип модуляции Элевация: %.1f° Высота: %d км - Пожалуйста, обновите базу данных спутников через меню Настроек Make sure your filters are correct and you have selected satellites Нет предстоящих пролётов спутников @@ -54,11 +53,11 @@ В тени Даунлинк Аплинк + У этого спутника нет трансиверов Добавить Трансиверы спутника: Инверсия: %s Модуляция: %s - У этого спутника нет трансиверов Нет Да Видимый @@ -80,11 +79,8 @@ Видимый - Поддержать - Лицензия - Конфиденц. - F-Droid - GitHub + Поддержать + Конфиденциальность Обновлено: %s d MMM yyyy - HH:mm:ss @@ -92,8 +88,8 @@ Местоположение GPS Нет разрешения использовать геоданные - Ввести - Введены неверные данные + Ввести + Введены неверные данные QTH Неправильный локатор QTH Позиция успешно обновлена @@ -106,42 +102,30 @@ Обновление данных Спутников: %s Трансиверов: %s - Онлайн + Онлайн Импорт Очистить Очистка прошла успешно Обновление прошло успешно - Настройки ротатора - Удаленное управление - IP адрес - Порт + Настройки ротатора + Удаленное управление + IP адрес + Порт - Передача данных по Bluetooth - Включить передачу - Id устройства - Формат данных - Нет разрешения использовать bluetooth + Передача данных по Bluetooth + Включить передачу + Id устройства + Формат данных + Нет разрешения использовать bluetooth + Other settings Показывать время по UTC Обновлять данные автоматически Показывать анимацию радара Использовать сенсоры устройства Я хотел бы сказать спасибо: - Вам за использование этого приложения! \nЖелаю всегда чистого неба над головой! - \nDavid A. B. Johnson и - Dave Moten за работу над predict4java и доступ - к ней по GNU GPLv2 - \nAlexandru Csete за его программу - Gpredict, которая послужила для меня вдохновением. - \nДоктору T.S. Kelso за его сайт - Celestrak и доступ к файлам орбит Two-Line Element. - \nLibre Space Foundation за проект - SatNOGS, API и базу данных с информацией о спутниках. - \nDownloadAstro - за интерес к приложению и публикацию интервью на сайте. - Это ПО поставляется без гарантий. diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index e5462825..159d8913 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -3,7 +3,7 @@ පිළිගන්න අවලංගු ක° - No items to display + පෙන්වීමට දත්ත නැත චන්ද්‍රිකා @@ -35,7 +35,6 @@ මූර්ජන ආකාරය තෝරන්න උත්තෝලනය: %.1f° උන්නතාශය: %d km - පෙන්වීමට දත්ත නැත. කරුණාකර දත්ත සමුදාය යාවත්කාලීන කරන්න. Make sure your filters are correct and you have selected satellites ප්‍රදර්ශනය කිරීමට ඉදිරියට එන චන්ද්‍රිකා පසුකර යෑම් නැත. @@ -54,11 +53,11 @@ අදෘශ්‍ය Downlink Uplink + මෙම චන්ද්‍රිකාව සම්ප්‍රෙෂණය නොකරයි එකතු ක° චන්ද්‍රිකා සම්ප්‍රේෂණයන්: Inverted: %s ප්‍රාකාරය: %s - මෙම චන්ද්‍රිකාව සම්ප්‍රෙෂණය නොකරයි නෑ ඔව් දෘශ්‍යමාන @@ -80,11 +79,8 @@ දෘශ්‍ය - දායකත්ව - GPLv3 බලපත්‍රය - Privacy Policy - F-Droid - GitHub + දායකත්ව + Privacy Policy අවසන් යාවත්කාලීනය: %s d MMM yyyy - HH:mm:ss @@ -92,8 +88,8 @@ පොළෙහි පිහිටීම GPS ඔබගේ location අවසර පරීක්ෂා ක° - අතින් - ඇතුළත් කළ ස්ථානය වලංගු නොවේ + අතින් + ඇතුළත් කළ ස්ථානය වලංගු නොවේ QTH QTH locator වලංගු නොවේ පිහිටීම යාවත්කාලීනය සාර්ථකයි @@ -106,39 +102,30 @@ චන්ද්‍රිකා දත්ත යාවත්කාලීනයි චන්ද්‍රිකා: %s සම්ප්‍රෙේෂණය: %s - මාර්ගගතව + මාර්ගගතව Import පිරිසිදු ක° දත්ත ඉවත් කිරීම සාර්ථකයි යාවත්කාලීනය සම්පූර්ණ කිරීම සාර්ථකයි - භ්‍රමක මනාප - දුරස්ථ පාලනය සබල ක° - IP ලිපිනය - Port + භ්‍රමක මනාප + දුරස්ථ පාලනය සබල ක° + IP ලිපිනය + Port - Bluetooth දත්ත ප්‍රතිදානය - ප්‍රතිදානය සබල ක° - උපාංග id - දත්ත අකාරය - Bluetooth අවසර පරික්‍ෂා ක° + Bluetooth දත්ත ප්‍රතිදානය + ප්‍රතිදානය සබල ක° + උපාංග id + දත්ත අකාරය + Bluetooth අවසර පරික්‍ෂා ක° + Other settings පසුකර වේලාවන් UTC මගින් ස්වයං දත්ත යාවත්කාලීනය radar sweep සජීවිකරණය සබල කරන්න Radar දර්ශනය කරකැවීමට සංවේදක භාවිතා කරන්න මම ස්තුති කිරීමට කැමති: - බාගෙන භාවිතා කළ ඔබට! \nඅහස සදා ඔබ වෙනුවෙන් පැහැදිලියි! - \nDavid A. B. Johnson - සහ Dave Motenඔවුනට ප්‍රයෝජනවත් predict4java පුස්තකාලය නිර්මාණයට. - \nසහ Alexandru Csete සඳහා Gpredict නිර්මාණයට සහ - Look4Sat නිර්මාණය⁣ට පෙළඹවීමට. - \nDr T.S. Kelsoට TLE දත්ත සැපයීමට, ඔහුගේ නඩත්තුවෙන් ක්‍රියාත්මක WEB අඩවිට ප්‍රවේශය සැපයීම වෙනුවෙන් - (Celestrak). - \nLibre Space Foundationට ඔවුන්ගේ - SatNOGSWeb අඩවියට API හා DB විශාල දත්ත ප්‍රමාණයක් ලබාදීම සඳහා. - \nDownloadAstro කණ්ඩායමට යෙදුම පිළිබඳ ඔවුන්ගේ උනන්දුව සහ කැපවීම ලැබිම සම්බන්ධයෙන්. මෘදුකාංගය වගකීමක් සමග නොලැබේ diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 67d122c1..f8d05684 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -3,7 +3,7 @@ Прийняти Скасувати - No items to display + Немає даних для відображення Супутники @@ -35,7 +35,6 @@ Виберіть тип модуляції Піднес.: %.1f° Висота: %.0f км - Немає даних для відображення. Будь ласка, оновіть базу даних через меню Налаштування Make sure your filters are correct and you have selected satellites Немає майбутніх прольотів супутників @@ -54,11 +53,11 @@ В тіні Downlink Uplink + Цей супутник не має трансиверів Додати Супутникові трансивери: Інверсія: %s Модуляція: %s - Цей супутник не має трансиверів Ні Так Видимий @@ -80,11 +79,8 @@ Видимий - Підтримати - Ліцензія GPLv3 - Конфіденційність - F-Droid - GitHub + Підтримати + Конфіденційність Останнє оновлення: %s d MMM yyyy - HH:mm:ss @@ -92,8 +88,8 @@ Місцезнаходження GPS Перевірте дозволи на визначення місця - Вручну - Введені некоректні дані + Вручну + Введені некоректні дані QTH Некоректний локатор QTH Позицію успішно оновлено @@ -106,41 +102,30 @@ Оновлення даних Супутників: %s Трансиверів: %s - Онлайн + Онлайн Імпорт Очистити Дані успішно очищено Оновлення успішне - Налаштування ротатора - Віддалене керування - IP адреса - Порт + Налаштування ротатора + Віддалене керування + IP адреса + Порт - Передача даних через Bluetooth - Увімкнути передачу - Id пристрою - Формат даних - Перевірте дозвіл Bluetooth + Передача даних через Bluetooth + Увімкнути передачу + Id пристрою + Формат даних + Перевірте дозвіл Bluetooth + Other settings Показувати час в UTC Автоматичне оновлення даних Показувати анімацію радара Використовувати сенсори пристрою Я хотів би подякувати: - Вам за завантаження та використання Look4Sat! - \nБажаю завжди чистого неба над головою! - \nDavid A. B. Johnson - та Dave Moten за створення бібліотеки predict4java. - \nAlexandru Csete за створення трекера Gpredict, який надихнув мене на створення Look4Sat. - \nDr T.S. Kelso за його сайт - Celestrak який надає доступ до даних Two-Line Element. - \nLibre Space Foundation за проєкт - SatNOGS, API та базу даних про супутники. - \nКоманді DownloadAstro - за інтерес до застосунку та публікацію інтерв\'ю на сайті. - Це ПЗ поставляється без жодних гарантій. diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 96880c5f..f90b86d4 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -3,7 +3,7 @@ 确定 取消 - 没有可显示的内容 + 没有数据可显示 卫星 @@ -30,7 +30,6 @@ 选择调制类型 仰角:%.1f° 高度:%d km - 没有数据可显示,请通过设置菜单更新卫星数据。 请确保您的筛选设置正确并且已勾选卫星 没有即将过境的卫星 欢迎使用Look4Sat! @@ -46,11 +45,11 @@ 地影中 下行链路 上行链路 + 这颗卫星没有收发器 添加 卫星收发器: 倒置:%s 调制:%s - 这颗卫星没有收发器 否 是 日照中 @@ -72,11 +71,8 @@ 日照中 - 支持 - GNU GPLv3 - 隐私政策 - F-Droid - GitHub + 支持 + 隐私政策 最后更新时间:%s yyyy MMM d - HH:mm:ss @@ -84,8 +80,8 @@ 站位 GPS 定位 检查您的位置权限 - 手动输入 - 输入的位置无效 + 手动输入 + 输入的位置无效 QTH 网格 无效的 QTH 网格 位置更新成功 @@ -98,43 +94,30 @@ 卫星数据更新 卫星:%s 收发器:%s - 在线更新 + 在线更新 导入文件 清空 数据清空成功 更新成功 - 旋转器首选项 - 启用远程控制 - IP地址 - 端口 + 旋转器首选项 + 启用远程控制 + IP地址 + 端口 - 蓝牙数据输出 - 启用输出 - 蓝牙设备 ID - 数据格式 - 请检查蓝牙权限 + 蓝牙数据输出 + 启用输出 + 蓝牙设备 ID + 数据格式 + 请检查蓝牙权限 + Other settings 以 UTC 时间显示 启用卫星数据自动更新 启用雷达扫描动画 使用传感器旋转雷达视图 我要感谢: - 感谢下载和使用 Look4Sat!愿你的天空永远晴朗! - \n简体中文版翻译由 BA7LWN 于 2022.5.10 创建。 - \nDavid A. B. Johnson - and Dave Moten for creating predict4java lib - under the GNU GPLv2. - \nAlexandru Csete for creating Gpredict - satellite tracker that inspired the creation of Look4Sat. - \nDr T.S. Kelso for maintaining his - Celestrak website that provides access to the TLE data. - \nLibre Space Foundation for their - SatNOGS API and DB providing a huge amount of satellite data. - \nDownloadAstro - team for their interest to the app and the interview published. - 该应用程序不提供任何保修. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0cc29358..ed7c35f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,7 +4,7 @@ Look4Sat Accept Cancel - No items to display + No data to show Satellites @@ -14,7 +14,7 @@ Settings - Selected type: %s + Type: %s Select satellite type Id - Name Clear @@ -40,7 +40,6 @@ DeepSpace Altitude: %d km %03d° - %03d° - No data to show. Please update the database via Settings menu. Make sure your filters are correct and you have selected satellites There are no upcoming satellite passes to display @@ -66,11 +65,11 @@ %.4f %.4f - %.4f - - . - - + This satellite has no transceivers Add Satellite transceivers: Inverted: %s Mode: %s - This satellite has no transceivers No Yes Visible @@ -94,20 +93,27 @@ Visible - Donate - GPLv3 Licence - Privacy Policy - F-Droid - GitHub + Look4Sat v%s + https://play.google.com/store/apps/details?id=com.rtbishop.look4sat + Donate + https://ko-fi.com/rt_bishop + F-Droid + https://f-droid.org/en/packages/com.rtbishop.look4sat/ + GitHub + https://github.com/rt-bishop/Look4Sat/ + GPLv3 + https://www.gnu.org/licenses/gpl-3.0.html + Privacy Policy + https://sites.google.com/view/look4sat-privacy-policy/home - Last updated: %s + Updated: %s d MMM yyyy - HH:mm:ss Station position GPS Check your location permissions - Manual - Invalid location entered + Input + Invalid location entered QTH Invalid QTH locator Position updated successfully @@ -120,39 +126,37 @@ Satellite data Satellites: %s Transceivers: %s - Online + Update Import Clear Data was cleared successfully Update completed successfully - Rotator preferences - Enable remote control - IP address - Port + Network data output + Enable output + IP address + Port - Bluetooth data output - Enable output - Device id - Data format - Check your bluetooth permission + Bluetooth data output + Enable output + Device id + Data format + Check your bluetooth permission + Other settings Show pass time in UTC Enable automatic data update Enable radar sweep animation Use sensors to rotate radar view I would like to say thanks to: - You for downloading and using Look4Sat! \nMay your sky always be clear! - \nDavid A. B. Johnson - and Dave Moten for creating a super useful predict4java library. - \nAlexandru Csete for creating Gpredict - tracker that inspired the creation of Look4Sat. - \nDr T.S. Kelso for maintaining his - Celestrak website that provides access to the TLE data. - \nLibre Space Foundation for their - SatNOGS API and DB providing a huge amount of data. - + + • You, Look4Sat users and contributors! + \n• David A. B. Johnson (predict4java) + \n• Dave Moten (predict4java) + \n• Alexandru Csete (Gpredict) + \n• Dr T.S. Kelso (Celestrak) + \n• Libre Space Foundation (SatNOGS) The app comes with no warranty.