diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 66751c3..5281277 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,8 @@ android { applicationId = "com.rainy.token" minSdk = 31 targetSdk = 35 - versionCode = 37 - versionName = "1.7.17" + versionCode = 38 + versionName = "1.7.18" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt b/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt index 2f43437..a3d2f74 100644 --- a/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt +++ b/app/src/main/java/com/rainy/token/data/repository/TraeRepository.kt @@ -211,7 +211,7 @@ class TraeRepository constructor( } } } - if (packCount > 0) { + if (packCount > 0 && !isDollarBilling) { extras["pack_count"] = packCount.toString() extras["general_credits"] = trimNum(generalSum) extras["work_credits"] = trimNum(workSum) diff --git a/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt b/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt index 473674a..72e490b 100644 --- a/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt +++ b/app/src/main/java/com/rainy/token/ui/servicedetail/ServiceDetailScreen.kt @@ -235,9 +235,12 @@ fun ServiceDetailScreen( item { OllamaUsageCard(uiState.state) } } ServiceType.TRAE -> { - // 每日签到卡;未配置凭据时展示引导卡,避免暴露必然失败的签到按钮 + // 每日签到卡;未配置凭据时展示引导卡,国际版无签到则展示说明卡 item { - if (uiState.hasCredential) { + val intl = uiState.region != null && uiState.region.equals("INTL", ignoreCase = true) + if (intl) { + TraeIntlNoCheckinCard() + } else if (uiState.hasCredential) { CheckinCard( state = checkinState, todayCheckedIn = checkinInfo?.todayCheckedIn == true, @@ -1504,6 +1507,26 @@ internal fun TraeAccountInfoCard(state: State) { extras["pack_count"]?.toIntOrNull()?.takeIf { it > 0 }?.let { add(stringResource(R.string.extra_label_pack_count) to it.toString()) } + if (extras["billing_mode"] == "dollar") { + extras["intl.plan_name"]?.let { + add(stringResource(R.string.trae_intl_plan_title) to it) + } + extras["intl.premium_fast_limit"]?.let { + add(stringResource(R.string.trae_intl_premium_fast_title) to "$it " + stringResource(R.string.trae_intl_quota_unit)) + } + extras["intl.premium_slow_limit"]?.let { + add(stringResource(R.string.trae_intl_premium_slow_title) to "$it " + stringResource(R.string.trae_intl_quota_unit)) + } + extras["intl.advanced_limit"]?.let { + add(stringResource(R.string.trae_intl_advanced_title) to "$it " + stringResource(R.string.trae_intl_quota_unit)) + } + extras["intl.auto_completion_limit"]?.let { + add(stringResource(R.string.trae_intl_auto_completion_title) to "$it " + stringResource(R.string.trae_intl_quota_unit)) + } + extras["intl.basic_used"]?.let { + add(stringResource(R.string.trae_intl_basic_used_title) to it) + } + } // 计费方式:两个英文布尔键合并为一行自然语言 val billingLabel = when { extras["is_credits_billing"] == "true" -> stringResource(R.string.extra_value_billing_credits) @@ -1531,6 +1554,29 @@ internal fun TraeAccountInfoCard(state: State) { * * 旧缓存无 wb_detail_raw 时回退为「资源 #007」简化行。无任何数据时整卡不渲染。 */ +@Composable +private fun TraeIntlNoCheckinCard() { + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(20.dp), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp) + ) { + Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text( + text = stringResource(R.string.trae_intl_no_checkin_title), + style = MaterialTheme.typography.titleSmall, + fontWeight = FontWeight.SemiBold + ) + Text( + text = stringResource(R.string.trae_intl_no_checkin_desc), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.outline + ) + } + } +} + @Composable internal fun WorkBuddyResourcesCard(state: State) { val balance = when (state) { diff --git a/app/src/main/res/values-b+zh+Hans/strings.xml b/app/src/main/res/values-b+zh+Hans/strings.xml index ef3fe77..abe73b2 100644 --- a/app/src/main/res/values-b+zh+Hans/strings.xml +++ b/app/src/main/res/values-b+zh+Hans/strings.xml @@ -798,4 +798,8 @@ 自动补全 次/月 充值 / 升级 + 套餐 + 基础用量已用 + 国际版没有每日签到 + Trae 国际版按美元计费,使用月度请求额度,没有签到积分体系。 \ No newline at end of file diff --git a/app/src/main/res/values-b+zh+Hant/strings.xml b/app/src/main/res/values-b+zh+Hant/strings.xml index 2fe0e33..af27a3d 100644 --- a/app/src/main/res/values-b+zh+Hant/strings.xml +++ b/app/src/main/res/values-b+zh+Hant/strings.xml @@ -798,4 +798,8 @@ 自動補全 次/月 儲值 / 升級 + 套餐 + 基礎用量已用 + 國際版沒有每日簽到 + Trae 國際版按美元計費,使用月度請求額度,沒有簽到積分體系。 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 749e51a..2ebfed2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -803,4 +803,8 @@ Auto completion /mo Upgrade / Top up + Plan + Basic usage used + International edition has no daily check-in + TRAE International uses USD billing with monthly request quotas instead of credit check-ins. \ No newline at end of file