From 7eb2d717954765464b04bb665f64e5467acdb92b Mon Sep 17 00:00:00 2001 From: Song <168455@qq.com> Date: Thu, 9 Jul 2026 17:02:58 +0800 Subject: [PATCH] ui: collapse SMS fallback fields when disabled (matching email) SMS fields (number / quota / carrier / balance) are now hidden when the toggle is off. Previously entered values are preserved, just hidden. Email forwarding already had this pattern. Settings page stays compact. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../forwarder/ui/screens/SettingsScreen.kt | 122 +++++++++--------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt b/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt index 232c22a..b6462cc 100644 --- a/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt @@ -260,72 +260,74 @@ fun SettingsScreen(onOpenLog: () -> Unit) { checked = smsFallback, ) { v -> app.appScope.launch { app.settings.setSmsFallback(v) } } - Spacer(Modifier.size(8.dp)) - OutlinedTextField( - value = smsTargetInput, - onValueChange = { smsTargetInput = it }, - label = { Text("iPhone 手机号") }, - supportingText = { Text("短信转发的目标号码") }, - modifier = Modifier.fillMaxWidth(), - singleLine = true, - ) - Spacer(Modifier.size(4.dp)) - Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { - OutlinedButton(onClick = { - app.appScope.launch { app.settings.setSmsTargetNumber(smsTargetInput.trim()) } - smsNumSaved = true - }, modifier = Modifier.weight(1f)) { Text(if (smsNumSaved) "✓ 已保存" else "保存号码") } - if (smsNumSaved) { - LaunchedEffect(Unit) { kotlinx.coroutines.delay(2000); smsNumSaved = false } - } - if (!hasSmsPerm) { + if (smsFallback) { + Spacer(Modifier.size(8.dp)) + OutlinedTextField( + value = smsTargetInput, + onValueChange = { smsTargetInput = it }, + label = { Text("iPhone 手机号") }, + supportingText = { Text("短信转发的目标号码") }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + ) + Spacer(Modifier.size(4.dp)) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { OutlinedButton(onClick = { - smsPermLauncher.launch(android.Manifest.permission.SEND_SMS) - }, modifier = Modifier.weight(1f)) { Text("授予短信权限") } + app.appScope.launch { app.settings.setSmsTargetNumber(smsTargetInput.trim()) } + smsNumSaved = true + }, modifier = Modifier.weight(1f)) { Text(if (smsNumSaved) "✓ 已保存" else "保存号码") } + if (smsNumSaved) { + LaunchedEffect(Unit) { kotlinx.coroutines.delay(2000); smsNumSaved = false } + } + if (!hasSmsPerm) { + OutlinedButton(onClick = { + smsPermLauncher.launch(android.Manifest.permission.SEND_SMS) + }, modifier = Modifier.weight(1f)) { Text("授予短信权限") } + } } - } - Spacer(Modifier.size(8.dp)) - Text( - "检测到运营商:${detectedCarrier.displayName}" + - if (detectedCarrier.serviceNumber == null) "(无自动查询,将用手动额度)" else "(${detectedCarrier.serviceNumber})", - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) - Spacer(Modifier.size(8.dp)) - OutlinedTextField( - value = smsQuotaInput, - onValueChange = { smsQuotaInput = it.filter { c -> c.isDigit() } }, - label = { Text("手动短信额度") }, - supportingText = { Text("自动查询失败时按此递减;余额≤5自动停用") }, - modifier = Modifier.fillMaxWidth(), - singleLine = true, - ) - Spacer(Modifier.size(4.dp)) - OutlinedButton(onClick = { - val q = smsQuotaInput.trim().toIntOrNull() ?: 0 - app.appScope.launch { - app.settings.setSmsManualQuota(q) - app.settings.setSmsBalance(q) - if (q > 5) app.settings.setSmsSuspended(false) + Spacer(Modifier.size(8.dp)) + Text( + "检测到运营商:${detectedCarrier.displayName}" + + if (detectedCarrier.serviceNumber == null) "(无自动查询,将用手动额度)" else "(${detectedCarrier.serviceNumber})", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Spacer(Modifier.size(8.dp)) + OutlinedTextField( + value = smsQuotaInput, + onValueChange = { smsQuotaInput = it.filter { c -> c.isDigit() } }, + label = { Text("手动短信额度") }, + supportingText = { Text("自动查询失败时按此递减;余额≤5自动停用") }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + ) + Spacer(Modifier.size(4.dp)) + OutlinedButton(onClick = { + val q = smsQuotaInput.trim().toIntOrNull() ?: 0 + app.appScope.launch { + app.settings.setSmsManualQuota(q) + app.settings.setSmsBalance(q) + if (q > 5) app.settings.setSmsSuspended(false) + } + smsQuotaSaved = true + }) { Text(if (smsQuotaSaved) "✓ 已保存" else "保存额度并解除挂起") } + if (smsQuotaSaved) { + LaunchedEffect(Unit) { kotlinx.coroutines.delay(2000); smsQuotaSaved = false } } - smsQuotaSaved = true - }) { Text(if (smsQuotaSaved) "✓ 已保存" else "保存额度并解除挂起") } - if (smsQuotaSaved) { - LaunchedEffect(Unit) { kotlinx.coroutines.delay(2000); smsQuotaSaved = false } - } - Spacer(Modifier.size(8.dp)) - val balanceText = when { - smsSuspended -> "已挂起(余额不足)" - smsBalance < 0 -> "余额未知" - else -> "剩余约 ${smsBalance} 条" + Spacer(Modifier.size(8.dp)) + val balanceText = when { + smsSuspended -> "已挂起(余额不足)" + smsBalance < 0 -> "余额未知" + else -> "剩余约 ${smsBalance} 条" + } + Text( + "当前状态:$balanceText", + style = MaterialTheme.typography.bodySmall, + color = if (smsSuspended) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.onSurfaceVariant, + ) } - Text( - "当前状态:$balanceText", - style = MaterialTheme.typography.bodySmall, - color = if (smsSuspended) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.onSurfaceVariant, - ) } }