From b19c78441c107421bb2d4bc2b532a1682e56da1f Mon Sep 17 00:00:00 2001 From: QIU Date: Tue, 25 Aug 2026 13:18:51 +0000 Subject: [PATCH] feat(aprs): link out to request a passcode instead of computing one The settings card had a "Compute passcode" button that derived the value from the callsign and filled the field in. It was added by request, so it stayed while the previous commit removed the same derivation from the connection path - which left the app contradicting itself: the background no longer invented a passcode, but the UI still offered to. APRS-IS treats the passcode as a licence check and states that supplying it to a user is the software author's responsibility. APRSdroid carries the identical algorithm in the same source file and deliberately does not use it for this, opting to validate what the operator typed and link out to request one. Filling the field in claims a check that nobody performed. The button now opens the passcode request page. AprsPacket.passcode stays in core:domain because validating an entry means recomputing the expected value, and its import is dropped from the card, which no longer needs it. --- .../src/main/res/values-id/strings.xml | 2 +- .../src/main/res/values-in/strings.xml | 2 +- .../src/main/res/values-tr/strings.xml | 2 +- .../src/main/res/values-zh/strings.xml | 2 +- .../src/main/res/values/strings.xml | 2 +- .../look4sat/feature/settings/AprsCard.kt | 28 +++++++++++++------ 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/core/presentation/src/main/res/values-id/strings.xml b/core/presentation/src/main/res/values-id/strings.xml index a0754bdb..ebaf0a91 100644 --- a/core/presentation/src/main/res/values-id/strings.xml +++ b/core/presentation/src/main/res/values-id/strings.xml @@ -35,7 +35,7 @@ Terhubung ke APRS-IS Kesalahan koneksi Berhenti - Hitung kode sandi + Minta kode sandi APRS: laporan terkirim APRS: laporan gagal - %1$s APRS-IS tidak memverifikasi passcode Anda. Laporan Anda tidak diteruskan - periksa tanda panggil dan passcode di Pengaturan. diff --git a/core/presentation/src/main/res/values-in/strings.xml b/core/presentation/src/main/res/values-in/strings.xml index 59135a42..add9bf6b 100644 --- a/core/presentation/src/main/res/values-in/strings.xml +++ b/core/presentation/src/main/res/values-in/strings.xml @@ -35,7 +35,7 @@ Terhubung ke APRS-IS Kesalahan koneksi Berhenti - Hitung kode sandi + Minta kode sandi APRS: laporan terkirim APRS: laporan gagal - %1$s APRS-IS tidak memverifikasi passcode Anda. Laporan Anda tidak diteruskan - periksa tanda panggil dan passcode di Pengaturan. diff --git a/core/presentation/src/main/res/values-tr/strings.xml b/core/presentation/src/main/res/values-tr/strings.xml index 8fcb7c10..b294c23d 100644 --- a/core/presentation/src/main/res/values-tr/strings.xml +++ b/core/presentation/src/main/res/values-tr/strings.xml @@ -36,7 +36,7 @@ APRS-IS bağlı Bağlantı hatası Durdur - Parolayı hesapla + Passcode isteyin APRS: rapor gönderildi APRS: rapor başarısız - %1$s APRS-IS passcode bilginizi doğrulamadı. Raporlarınız iletilmiyor - Ayarlar bölümünde çağrı işareti ve passcode bilgisini kontrol edin. diff --git a/core/presentation/src/main/res/values-zh/strings.xml b/core/presentation/src/main/res/values-zh/strings.xml index 40603af6..856c9870 100644 --- a/core/presentation/src/main/res/values-zh/strings.xml +++ b/core/presentation/src/main/res/values-zh/strings.xml @@ -37,7 +37,7 @@ 已连接 APRS-IS 连接错误 停止 - 计算验证码 + 申请验证码 APRS: 上报成功 APRS: 上报失败 - %1$s APRS-IS 未验证你的 passcode, 上报不会被转发 - 请在设置里检查呼号与 passcode。 diff --git a/core/presentation/src/main/res/values/strings.xml b/core/presentation/src/main/res/values/strings.xml index bbe29515..4d20b877 100644 --- a/core/presentation/src/main/res/values/strings.xml +++ b/core/presentation/src/main/res/values/strings.xml @@ -38,7 +38,7 @@ Connected to APRS-IS Connection error Stop - Compute passcode + Request a passcode APRS: report sent OK APRS: report failed - %1$s APRS-IS did not verify your passcode. Your reports are not being passed on - check the callsign and passcode in Settings. diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/AprsCard.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/AprsCard.kt index 97865408..841c666d 100644 --- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/AprsCard.kt +++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/AprsCard.kt @@ -2,6 +2,7 @@ package com.rtbishop.look4sat.feature.settings import android.content.Intent import android.content.pm.PackageManager +import android.net.Uri import android.os.Build import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -33,12 +34,19 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.rtbishop.look4sat.core.data.aprs.AprsConfig -import com.rtbishop.look4sat.core.domain.aprs.AprsPacket import com.rtbishop.look4sat.core.data.aprs.AprsStore import com.rtbishop.look4sat.core.presentation.CardButton import com.rtbishop.look4sat.core.presentation.R /** APRS card: sits between the satellite-data and data-output containers; settings live in a gear dialog to save space */ +/** + * Where an operator obtains an APRS-IS passcode. + * + * The app links here rather than deriving one: the passcode is a licence check, and APRS-IS + * states that supplying it is the software author's responsibility. + */ +private const val PASSCODE_REQUEST_URL = "https://apps.magicbug.co.uk/passcode/" + @Composable fun AprsCard() { val context = LocalContext.current @@ -187,6 +195,7 @@ private fun AprsSettingsDialog( var symbolTable by remember { mutableStateOf(config.symbolTable) } var symbolCode by remember { mutableStateOf(config.symbolCode) } val textStyle = LocalTextStyle.current.copy(fontSize = 14.sp) + val context = LocalContext.current AlertDialog( onDismissRequest = onDismiss, @@ -215,16 +224,19 @@ private fun AprsSettingsDialog( singleLine = true, textStyle = textStyle ) - // Passcode compute button (user request: let the user see the computed result) + // Links out instead of computing it. APRS-IS treats the passcode as a licence + // check and says supplying it to a user is the software author's job; APRSdroid + // carries the same algorithm and deliberately does not use it here for that + // reason. Filling the field in claims a check that nobody performed. TextButton( onClick = { - val call = callsign.trim().uppercase() - if (call.isNotBlank()) { - passcode = AprsPacket.passcode(call).toString() + runCatching { + context.startActivity( + Intent(Intent.ACTION_VIEW, Uri.parse(PASSCODE_REQUEST_URL)) + ) } - }, - enabled = callsign.trim().isNotBlank() - ) { Text(stringResource(id = R.string.prefs_aprs_calc_passcode)) } + } + ) { Text(stringResource(id = R.string.prefs_aprs_request_passcode)) } Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { OutlinedTextField( value = ssid,