diff --git a/core/presentation/src/main/res/values-es/strings.xml b/core/presentation/src/main/res/values-es/strings.xml
index 7a9c3d59..62a47c0a 100644
--- a/core/presentation/src/main/res/values-es/strings.xml
+++ b/core/presentation/src/main/res/values-es/strings.xml
@@ -161,10 +161,13 @@
Otros
Hora UTC
- Actualización automática
+ Auto-actualizar
Animación radar
Sensores
Filtro nocturno
+ Tema claro
+ Desfase de brújula (ácimut)
+ Desfase de brújula (elevación)
Resaltado de elevación
Baja < %1$d°
diff --git a/core/presentation/src/main/res/values-ru/strings.xml b/core/presentation/src/main/res/values-ru/strings.xml
index bbd6160c..0678fddc 100644
--- a/core/presentation/src/main/res/values-ru/strings.xml
+++ b/core/presentation/src/main/res/values-ru/strings.xml
@@ -161,10 +161,13 @@
Прочее
Время в UTC
- Автообновление данных
+ Автообновление
Анимация радара
Сенсоры
Ночной фильтр
+ Светлая тема
+ Смещение компаса (азимут)
+ Смещение компаса (элевация)
Подсветка высоты
Низко < %1$d°
diff --git a/core/presentation/src/main/res/values-si/strings.xml b/core/presentation/src/main/res/values-si/strings.xml
index 50dbd2e2..af31f0f2 100644
--- a/core/presentation/src/main/res/values-si/strings.xml
+++ b/core/presentation/src/main/res/values-si/strings.xml
@@ -161,10 +161,13 @@
වෙනත්
UTC වේලාව
- දත්ත ස්වයං යාවත්කාලීන
- Radar sweep
+ ස්වයං යාවත්කාලීන
+ රේඩාර් පරිලෝකනය
සංවේදක
රාත්රී පෙරහන
+ ආලෝක තේමාව
+ මාලිමා අපගමනය (දිගංශය)
+ මාලිමා අපගමනය (උත්තෝලනය)
උස් උද්දීපනය
අඩු < %1$d°
diff --git a/core/presentation/src/main/res/values-tr/strings.xml b/core/presentation/src/main/res/values-tr/strings.xml
index aa601777..db08f871 100644
--- a/core/presentation/src/main/res/values-tr/strings.xml
+++ b/core/presentation/src/main/res/values-tr/strings.xml
@@ -193,10 +193,13 @@
Diğer
UTC saati
- Veriyi otomatik güncelle
+ Otomatik güncelle
Radar taraması
Sensör
Gece filtresi
+ Açık tema
+ Pusula sapması (azimut)
+ Pusula sapması (yükseklik açısı)
Elevasyon vurgusu
Düşük < %1$d°
diff --git a/core/presentation/src/main/res/values-uk/strings.xml b/core/presentation/src/main/res/values-uk/strings.xml
index 93f1553f..14efa660 100644
--- a/core/presentation/src/main/res/values-uk/strings.xml
+++ b/core/presentation/src/main/res/values-uk/strings.xml
@@ -161,10 +161,13 @@
Інше
Час в UTC
- Автооновлення даних
+ Автооновлення
Анімація радара
Сенсори
Нічний фільтр
+ Світла тема
+ Зміщення компаса (азимут)
+ Зміщення компаса (піднесення)
Підсвічування висоти
Низько < %1$d°
diff --git a/core/presentation/src/main/res/values-zh/strings.xml b/core/presentation/src/main/res/values-zh/strings.xml
index 27551f3d..e39518ec 100644
--- a/core/presentation/src/main/res/values-zh/strings.xml
+++ b/core/presentation/src/main/res/values-zh/strings.xml
@@ -219,12 +219,13 @@
其他
UTC 时间
- 自动更新数据
- 雷达扫描动画
- 传感器控制雷达
+ 自动更新
+ 雷达扫描
+ 传感器
红色夜间模式
- 雷达罗盘水平偏移量
- 雷达罗盘俯仰偏移量
+ 浅色主题
+ 罗盘偏移量(方位角)
+ 罗盘偏移量(仰角)
仰角高亮
低 < %1$d°
diff --git a/core/presentation/src/main/res/values/strings.xml b/core/presentation/src/main/res/values/strings.xml
index c36c1738..4e1d8714 100644
--- a/core/presentation/src/main/res/values/strings.xml
+++ b/core/presentation/src/main/res/values/strings.xml
@@ -56,14 +56,12 @@
\n\nPlease update the database at least weekly to get accurate predictions.
What\'s new in Look4Sat
- * Tweaked sunrise/sunset calculations, added tests by atsunatsu (#241)
- \n\n* Overhauled sources import, added HTTP status by wty2019wty (#242)
- \nSources now have priority - the top ones define satellite names and transceiver data.
- \nYou can enable/disable sources and restore defaults via the Satellite data import dialog.
- \n\n* Localized AMSAT status screen for Chinese by atsunatsu (#245)
- \n\n* Extracted hardcoded UI strings to resources by TianhengZhuang (#247)
- \n\n* Added AMSAT satellite status reports submission by atsunatsu (#248)
- \n\n* Slightly optimized map performance to reduce ANRs and memory consumption. Zoom in to see satellite labels.
+ * Fixed AOS window filter to follow the UTC setting by wty2019wty (#252)
+ \n\n* Applied elevation color thresholds to the Radar by atsunatsu (#253)
+ \n\n* Added fuzzy satellite search ignoring separators by atsunatsu (#255)
+ \n\n* Added light theme suitable for e-ink devices by Ondrej Kolonicny (#256)
+ \n\n* Fixed IC-705 frequency read in dual-radio mode by Michael S (#260)
+ \n\n* Fixed day/night map overlay calculation and display issue by rt-bishop
@@ -262,13 +260,13 @@
Other
UTC time
- Auto-update data
+ Auto-update
Radar sweep
- Use sensors
+ Sensors
Night filter
Light theme
- Radar compass offset
- Radar compass offset (elev)
+ Compass offset (azimuth)
+ Compass offset (elevation)
Elevation highlight
Low < %1$d°
diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt
index 259eeef9..5c4b3428 100644
--- a/fastlane/metadata/android/en-US/changelogs/default.txt
+++ b/fastlane/metadata/android/en-US/changelogs/default.txt
@@ -1,5 +1,6 @@
-* Tweaked sun calculations, added tests by atsunatsu (#241)
-* Overhauled sources import, added HTTP status by wty2019wty (#242)
-* Localized AMSAT status screen for Chinese by atsunatsu (#245)
-* Extracted hardcoded UI strings to resources by TianhengZhuang (#247)
-* Added AMSAT satellite status reports submission by atsunatsu (#248)
+* Fixed AOS window filter to follow the UTC setting by wty2019wty (#252)
+* Applied elevation color thresholds to the Radar by atsunatsu (#253)
+* Added fuzzy satellite search ignoring separators by atsunatsu (#255)
+* Added light theme suitable for e-ink devices by Ondrej Kolonicny (#256)
+* Fixed IC-705 frequency read in dual-radio mode by Michael S (#260)
+* Fixed day/night map overlay calculation and display issue by rt-bishop
diff --git a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt
index 33e17381..49c86e9a 100644
--- a/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt
+++ b/feature/map/src/main/java/com/rtbishop/look4sat/feature/map/MapNightOverlay.kt
@@ -116,8 +116,9 @@ class MapNightOverlay : Overlay() {
else -> {
// Terminator crosses this column — find the crossing pixel by binary search
- val crossY = findCrossingY(proj, x, 0, h - 1, sinSunLat, cosSunLat, cosLonDiff)
- if (dotTop < 0) {
+ val isNightAtTop = dotTop < 0
+ val crossY = findCrossingY(proj, x, 0, h - 1, sinSunLat, cosSunLat, cosLonDiff, isNightAtTop)
+ if (isNightAtTop) {
// Night at top, day at bottom
rect.set(x.toFloat(), 0f, (x + stepPx).toFloat(), crossY.toFloat())
canvas.drawRect(rect, nightPaint)
@@ -134,7 +135,11 @@ class MapNightOverlay : Overlay() {
/**
* Binary-search for the pixel row where the day/night boundary crosses column [x].
- * [yTop] is in day, [yBot] is in night (or vice versa).
+ *
+ * [isNightAtTop] states which side [yTop] is on. Both polarities occur: the pole nearest
+ * the sub-solar point is lit, so the terminator runs day-over-night while the sub-solar
+ * latitude is positive and night-over-day once it turns negative after the September
+ * equinox. Anchoring lo to the top pixel's side keeps the search valid either way.
*/
private fun findCrossingY(
proj: org.osmdroid.views.Projection,
@@ -143,7 +148,8 @@ class MapNightOverlay : Overlay() {
yBot: Int,
sinSunLat: Double,
cosSunLat: Double,
- cosLonDiff: Double
+ cosLonDiff: Double,
+ isNightAtTop: Boolean
): Int {
var lo = yTop
var hi = yBot
@@ -152,7 +158,8 @@ class MapNightOverlay : Overlay() {
val geo = proj.fromPixels(x, mid, reusableGeoPoint) ?: return mid
val latRad = Math.toRadians(geo.latitude)
val dot = sin(latRad) * sinSunLat + cos(latRad) * cosSunLat * cosLonDiff
- if (dot < 0) hi = mid else lo = mid
+ // Keep lo on the top pixel's side of the terminator and hi on the opposite side
+ if ((dot < 0) == isNightAtTop) lo = mid else hi = mid
}
return (lo + hi) / 2
}
diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt
index 8192c3c8..c6574bf3 100644
--- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt
+++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt
@@ -495,19 +495,21 @@ private fun OtherCard(settings: OtherSettings, onAction: (SettingsAction) -> Uni
color = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.height(4.dp))
- // Appearance: light theme (paired with a spacer to align with the two-column rows)
+ // Data preferences: auto-update + UTC clock
+ Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
+ SwitchTile(R.string.prefs_other_switch_update, settings.stateOfAutoUpdate) {
+ onAction(SettingsAction.ToggleUpdate(it))
+ }
+ SwitchTile(R.string.prefs_other_switch_utc, settings.stateOfUtc) {
+ onAction(SettingsAction.ToggleUtc(it))
+ }
+ }
+ Spacer(modifier = Modifier.height(4.dp))
+ // Appearance: light theme + night filter
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
SwitchTile(R.string.prefs_other_switch_light_theme, settings.stateOfLightTheme) {
onAction(SettingsAction.ToggleLightTheme(it))
}
- Spacer(modifier = Modifier.weight(1f))
- }
- Spacer(modifier = Modifier.height(4.dp))
- // Display preferences: UTC clock + night filter
- Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
- SwitchTile(R.string.prefs_other_switch_utc, settings.stateOfUtc) {
- onAction(SettingsAction.ToggleUtc(it))
- }
SwitchTile(
R.string.prefs_other_switch_night_mode,
settings.stateOfNightMode,
@@ -517,7 +519,7 @@ private fun OtherCard(settings: OtherSettings, onAction: (SettingsAction) -> Uni
}
}
Spacer(modifier = Modifier.height(4.dp))
- // Radar behavior: sweep animation + sensor control
+ // Radar behavior: sweep animation + sensors, followed by the compass offset sliders
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
SwitchTile(R.string.prefs_other_switch_sweep, settings.stateOfSweep) {
onAction(SettingsAction.ToggleSweep(it))
@@ -527,14 +529,9 @@ private fun OtherCard(settings: OtherSettings, onAction: (SettingsAction) -> Uni
}
}
Spacer(modifier = Modifier.height(4.dp))
- // Data management (full width)
- SwitchRow(R.string.prefs_other_switch_update, settings.stateOfAutoUpdate) {
- onAction(SettingsAction.ToggleUpdate(it))
- }
- Spacer(modifier = Modifier.height(4.dp))
// Compass calibration sliders at the bottom
CompassOffsetRow(
- labelResId = R.string.prefs_other_compass_offset,
+ labelResId = R.string.prefs_other_compass_offset_az,
value = settings.radarCompassOffset,
range = -180f..180f
) { onAction(SettingsAction.SetRadarCompassOffset(it)) }
@@ -561,7 +558,14 @@ private fun CompassOffsetRow(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth()
) {
- Text(text = stringResource(id = labelResId))
+ Text(
+ text = stringResource(id = labelResId),
+ modifier = Modifier
+ .weight(1f)
+ .padding(end = 4.dp)
+ .infiniteMarquee(),
+ maxLines = 1
+ )
Text(text = "${value.toInt()}°")
}
Spacer(modifier = Modifier.height(4.dp))
@@ -572,18 +576,6 @@ private fun CompassOffsetRow(
)
}
-@Composable
-private fun SwitchRow(labelResId: Int, checked: Boolean, onCheckedChange: (Boolean) -> Unit) {
- Row(
- horizontalArrangement = Arrangement.SpaceBetween,
- verticalAlignment = Alignment.CenterVertically,
- modifier = Modifier.fillMaxWidth()
- ) {
- Text(text = stringResource(id = labelResId))
- Switch(checked = checked, onCheckedChange = onCheckedChange)
- }
-}
-
@Composable
private fun RowScope.SwitchTile(
labelResId: Int,
@@ -598,7 +590,11 @@ private fun RowScope.SwitchTile(
) {
Text(
text = stringResource(id = labelResId),
- modifier = Modifier.weight(1f)
+ modifier = Modifier
+ .weight(1f)
+ .padding(end = 4.dp)
+ .infiniteMarquee(),
+ maxLines = 1
)
Switch(checked = checked, enabled = enabled, onCheckedChange = onCheckedChange)
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 444f916c..44c037d6 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,8 +1,8 @@
[versions]
#noinspection UnusedVersionCatalogEntry
-appVersionCode = "447"
+appVersionCode = "448"
#noinspection UnusedVersionCatalogEntry
-appVersionName = "4.4.7"
+appVersionName = "4.4.8"
#noinspection UnusedVersionCatalogEntry
compileSdk = "37"
#noinspection UnusedVersionCatalogEntry
@@ -12,16 +12,16 @@ jdkVersion = "21"
#noinspection UnusedVersionCatalogEntry
packageName = "com.rtbishop.look4sat"
-android-gradle-plugin = "9.4.0"
+android-gradle-plugin = "9.4.1"
-androidx-core-ktx = "1.19.0"
+androidx-core-ktx = "1.19.1"
androidx-core-splashscreen = "1.2.0"
androidx-room = "2.8.5"
compose-bom = "2026.09.00"
compose-activity = "1.13.0"
compose-lifecycle = "2.11.0"
-compose-navigation3 = "1.1.7"
+compose-navigation3 = "1.2.0"
google-ksp = "2.3.11"
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1e1cc32a..f63d7b28 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +1,7 @@
-#Sat Sep 12 11:29:59 BST 2026
+#Sun Sep 27 11:54:01 BST 2026
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME