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) <noreply@anthropic.com>
This commit is contained in:
@@ -260,72 +260,74 @@ fun SettingsScreen(onOpenLog: () -> Unit) {
|
|||||||
checked = smsFallback,
|
checked = smsFallback,
|
||||||
) { v -> app.appScope.launch { app.settings.setSmsFallback(v) } }
|
) { v -> app.appScope.launch { app.settings.setSmsFallback(v) } }
|
||||||
|
|
||||||
Spacer(Modifier.size(8.dp))
|
if (smsFallback) {
|
||||||
OutlinedTextField(
|
Spacer(Modifier.size(8.dp))
|
||||||
value = smsTargetInput,
|
OutlinedTextField(
|
||||||
onValueChange = { smsTargetInput = it },
|
value = smsTargetInput,
|
||||||
label = { Text("iPhone 手机号") },
|
onValueChange = { smsTargetInput = it },
|
||||||
supportingText = { Text("短信转发的目标号码") },
|
label = { Text("iPhone 手机号") },
|
||||||
modifier = Modifier.fillMaxWidth(),
|
supportingText = { Text("短信转发的目标号码") },
|
||||||
singleLine = true,
|
modifier = Modifier.fillMaxWidth(),
|
||||||
)
|
singleLine = true,
|
||||||
Spacer(Modifier.size(4.dp))
|
)
|
||||||
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
Spacer(Modifier.size(4.dp))
|
||||||
OutlinedButton(onClick = {
|
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||||
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 = {
|
OutlinedButton(onClick = {
|
||||||
smsPermLauncher.launch(android.Manifest.permission.SEND_SMS)
|
app.appScope.launch { app.settings.setSmsTargetNumber(smsTargetInput.trim()) }
|
||||||
}, modifier = Modifier.weight(1f)) { Text("授予短信权限") }
|
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))
|
Spacer(Modifier.size(8.dp))
|
||||||
Text(
|
Text(
|
||||||
"检测到运营商:${detectedCarrier.displayName}" +
|
"检测到运营商:${detectedCarrier.displayName}" +
|
||||||
if (detectedCarrier.serviceNumber == null) "(无自动查询,将用手动额度)" else "(${detectedCarrier.serviceNumber})",
|
if (detectedCarrier.serviceNumber == null) "(无自动查询,将用手动额度)" else "(${detectedCarrier.serviceNumber})",
|
||||||
style = MaterialTheme.typography.bodySmall,
|
style = MaterialTheme.typography.bodySmall,
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
)
|
)
|
||||||
Spacer(Modifier.size(8.dp))
|
Spacer(Modifier.size(8.dp))
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
value = smsQuotaInput,
|
value = smsQuotaInput,
|
||||||
onValueChange = { smsQuotaInput = it.filter { c -> c.isDigit() } },
|
onValueChange = { smsQuotaInput = it.filter { c -> c.isDigit() } },
|
||||||
label = { Text("手动短信额度") },
|
label = { Text("手动短信额度") },
|
||||||
supportingText = { Text("自动查询失败时按此递减;余额≤5自动停用") },
|
supportingText = { Text("自动查询失败时按此递减;余额≤5自动停用") },
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
singleLine = true,
|
singleLine = true,
|
||||||
)
|
)
|
||||||
Spacer(Modifier.size(4.dp))
|
Spacer(Modifier.size(4.dp))
|
||||||
OutlinedButton(onClick = {
|
OutlinedButton(onClick = {
|
||||||
val q = smsQuotaInput.trim().toIntOrNull() ?: 0
|
val q = smsQuotaInput.trim().toIntOrNull() ?: 0
|
||||||
app.appScope.launch {
|
app.appScope.launch {
|
||||||
app.settings.setSmsManualQuota(q)
|
app.settings.setSmsManualQuota(q)
|
||||||
app.settings.setSmsBalance(q)
|
app.settings.setSmsBalance(q)
|
||||||
if (q > 5) app.settings.setSmsSuspended(false)
|
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))
|
Spacer(Modifier.size(8.dp))
|
||||||
val balanceText = when {
|
val balanceText = when {
|
||||||
smsSuspended -> "已挂起(余额不足)"
|
smsSuspended -> "已挂起(余额不足)"
|
||||||
smsBalance < 0 -> "余额未知"
|
smsBalance < 0 -> "余额未知"
|
||||||
else -> "剩余约 ${smsBalance} 条"
|
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,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user