diff --git a/app/src/main/java/com/rainy/token/data/repository/CredentialRepository.kt b/app/src/main/java/com/rainy/token/data/repository/CredentialRepository.kt index 3fd4923..9d616e9 100644 --- a/app/src/main/java/com/rainy/token/data/repository/CredentialRepository.kt +++ b/app/src/main/java/com/rainy/token/data/repository/CredentialRepository.kt @@ -40,7 +40,9 @@ class CredentialRepository @Inject constructor( val revision: Long, val fingerprint: String, /** 快照所属账号;单账号服务为 null。 */ - val accountId: String? = null + val accountId: String? = null, + /** 创建快照时调用方请求的账号 ID(多账号服务可能是 null=默认账号),用于会话内精确匹配。 */ + val requestedAccountId: String? = accountId ) { val service: ServiceType get() = credential.service } @@ -237,9 +239,9 @@ class CredentialRepository @Inject constructor( if (session.snapshot.service == service) { val matches = if (ServiceType.isMultiAccount(service)) { val requested = accountId?.takeIf { it.isNotBlank() } - requested == null || - session.snapshot.accountId == null || - session.snapshot.accountId == requested + // 只允许读取与快照同一账号的暂存凭据;null=默认账号也要看快照当初请求的是不是默认账号, + // 避免 A 账号刷新期间把 A 的暂存凭据误交给默认账号(B)的读请求。 + requested == session.snapshot.requestedAccountId } else { true } @@ -368,7 +370,8 @@ class CredentialRepository @Inject constructor( credential = credential, revision = revisionFor(service, resolvedId), fingerprint = credentialFingerprint(credential)!!, - accountId = resolvedId + accountId = resolvedId, + requestedAccountId = accountId?.takeIf { it.isNotBlank() } ) } diff --git a/app/src/main/java/com/rainy/token/ui/dashboard/DashboardScreen.kt b/app/src/main/java/com/rainy/token/ui/dashboard/DashboardScreen.kt index 8112dfa..63e1ccd 100644 --- a/app/src/main/java/com/rainy/token/ui/dashboard/DashboardScreen.kt +++ b/app/src/main/java/com/rainy/token/ui/dashboard/DashboardScreen.kt @@ -102,6 +102,8 @@ import com.rainy.token.ui.components.AppTips import com.rainy.token.ui.components.asString import com.rainy.token.ui.dashboard.autocheckin.AutoCheckinManager import com.rainy.token.ui.theme.inkMuted +import com.rainy.token.ui.theme.PureWhite +import com.rainy.token.ui.theme.inkWarm import com.rainy.token.ui.theme.StrawberryPink import android.app.AppOpsManager import android.appwidget.AppWidgetManager @@ -347,28 +349,45 @@ fun DashboardScreen( // 随机小技巧提示(每次启动随机一条)+ 最右侧自动签到开关 val tipTextRes = remember { AppTips.randomHintRes() } val autoCheckinEnabled by viewModel.autoCheckinEnabled.collectAsStateWithLifecycle() - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(horizontal = 4.dp) + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(16.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface + ), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp) ) { - Text( - text = "💡 " + stringResource(tipTextRes), - style = MaterialTheme.typography.bodySmall, - color = inkMuted(), - modifier = Modifier.weight(1f) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(R.string.auto_checkin_switch_label), - style = MaterialTheme.typography.labelSmall, - color = inkMuted() - ) - Spacer(modifier = Modifier.width(2.dp)) - Switch( - checked = autoCheckinEnabled, - onCheckedChange = viewModel::setAutoCheckinEnabled, - colors = SwitchDefaults.colors(checkedThumbColor = StrawberryPink) - ) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(horizontal = 14.dp, vertical = 10.dp) + ) { + Text( + text = "💡 " + stringResource(tipTextRes), + style = MaterialTheme.typography.bodySmall, + color = inkMuted(), + modifier = Modifier.weight(1f) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = stringResource(R.string.auto_checkin_switch_label), + style = MaterialTheme.typography.labelMedium, + color = inkWarm(), + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.width(2.dp)) + Switch( + checked = autoCheckinEnabled, + onCheckedChange = viewModel::setAutoCheckinEnabled, + colors = SwitchDefaults.colors( + checkedThumbColor = PureWhite, + checkedTrackColor = StrawberryPink, + checkedBorderColor = StrawberryPink, + uncheckedThumbColor = MaterialTheme.colorScheme.onSurfaceVariant, + uncheckedTrackColor = MaterialTheme.colorScheme.surfaceVariant, + uncheckedBorderColor = MaterialTheme.colorScheme.onSurfaceVariant + ) + ) + } } val items = rememberDashboardItems( cards = uiState.cards, @@ -922,6 +941,8 @@ private fun DashboardCard( text = stringResource(R.string.account_default_badge), style = MaterialTheme.typography.labelSmall, color = StrawberryPink, + maxLines = 1, + softWrap = false, modifier = Modifier .clip(RoundedCornerShape(8.dp)) .background(StrawberryPink.copy(alpha = 0.12f)) diff --git a/app/src/main/java/com/rainy/token/ui/settings/AccountManagementScreen.kt b/app/src/main/java/com/rainy/token/ui/settings/AccountManagementScreen.kt index 5f483b1..76674ec 100644 --- a/app/src/main/java/com/rainy/token/ui/settings/AccountManagementScreen.kt +++ b/app/src/main/java/com/rainy/token/ui/settings/AccountManagementScreen.kt @@ -296,6 +296,8 @@ private fun AccountRow( text = stringResource(R.string.account_default_badge), style = MaterialTheme.typography.labelSmall, color = StrawberryPink, + maxLines = 1, + softWrap = false, modifier = Modifier .padding(horizontal = 6.dp, vertical = 2.dp) .background(