diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fdba975..f1d1e65 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 = 39 - versionName = "1.7.19" + versionCode = 40 + versionName = "1.7.20" 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 a3d2f74..c97ddf2 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 @@ -174,9 +174,11 @@ class TraeRepository constructor( q.getNumber("advanced_model_request_limit")?.let { extras["intl.advanced_limit"] = trimNum(it) } q.getNumber("auto_completion_limit")?.let { extras["intl.auto_completion_limit"] = trimNum(it) } q.getNumber("basic_usage_limit")?.let { extras["intl.basic_usage_limit"] = trimNum(it) } + q.getNumber("basic_usage_limit")?.let { extras["intl.dollar_limit"] = it.toString() } q.getNumber("bonus_usage_limit")?.let { extras["intl.bonus_usage_limit"] = trimNum(it) } } pack.getNumber("usage", "basic_usage_amount")?.let { extras["intl.basic_used"] = trimNum(it) } + pack.getNumber("usage", "basic_usage_amount")?.let { extras["intl.dollar_used"] = it.toString() } pack.getNumber("usage", "bonus_usage_amount")?.let { extras["intl.bonus_used"] = trimNum(it) } pack.getNumber("usage", "credits_amount")?.let { extras["intl.credits_used"] = trimNum(it) } return@forEachIndexed diff --git a/app/src/main/java/com/rainy/token/ui/dashboard/ServiceBalanceCards.kt b/app/src/main/java/com/rainy/token/ui/dashboard/ServiceBalanceCards.kt index 4ab00e1..a1b9e1e 100644 --- a/app/src/main/java/com/rainy/token/ui/dashboard/ServiceBalanceCards.kt +++ b/app/src/main/java/com/rainy/token/ui/dashboard/ServiceBalanceCards.kt @@ -218,6 +218,27 @@ private fun TraeDollarPlanSummary(extras: Map) { color = inkMuted() ) Spacer(modifier = Modifier.height(8.dp)) + val dollarUsed = extras["intl.dollar_used"]?.toDoubleOrNull() + val dollarLimit = extras["intl.dollar_limit"]?.toDoubleOrNull() + if (dollarLimit != null) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = stringResource(R.string.trae_intl_dollar_usage_title), + style = MaterialTheme.typography.titleMedium, + color = inkMuted() + ) + Text( + text = String.format(Locale.US, "\$%.2f / \$%.2f", dollarUsed ?: 0.0, dollarLimit), + style = MaterialTheme.typography.headlineSmall, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onSurface + ) + } + } TraeSplitLine(stringResource(R.string.trae_intl_premium_fast_title), extras["intl.premium_fast_limit"]?.toDoubleOrNull(), stringResource(R.string.trae_intl_quota_unit)) TraeSplitLine(stringResource(R.string.trae_intl_premium_slow_title), extras["intl.premium_slow_limit"]?.toDoubleOrNull(), stringResource(R.string.trae_intl_quota_unit)) TraeSplitLine(stringResource(R.string.trae_intl_advanced_title), extras["intl.advanced_limit"]?.toDoubleOrNull(), stringResource(R.string.trae_intl_quota_unit)) 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 77dc0a6..881c93c 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 @@ -1111,6 +1111,14 @@ private fun TraeIntlBigNumber(extras: Map) { modifier = Modifier.padding(bottom = 8.dp) ) Spacer(modifier = Modifier.height(6.dp)) + val dollarUsed = extras["intl.dollar_used"]?.toDoubleOrNull() + val dollarLimit = extras["intl.dollar_limit"]?.toDoubleOrNull() + if (dollarLimit != null) { + InfoRow( + label = stringResource(R.string.trae_intl_dollar_usage_title), + value = String.format(Locale.US, "\$%.2f / \$%.2f", dollarUsed ?: 0.0, dollarLimit) + ) + } val quotaUnit = stringResource(R.string.trae_intl_quota_unit) InfoRow( label = stringResource(R.string.trae_intl_premium_fast_title), @@ -1548,6 +1556,17 @@ internal fun TraeAccountInfoCard(state: State) { add(stringResource(R.string.extra_label_pack_count) to it.toString()) } if (extras["billing_mode"] == "dollar") { + extras["intl.dollar_limit"]?.toDoubleOrNull()?.let { limit -> + add( + stringResource(R.string.trae_intl_dollar_usage_title) to + String.format( + Locale.US, + "$%.2f / $%.2f", + extras["intl.dollar_used"]?.toDoubleOrNull() ?: 0.0, + limit + ) + ) + } extras["intl.plan_name"]?.let { add(stringResource(R.string.trae_intl_plan_title) to it) } 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 d02a85e..6295489 100644 --- a/app/src/main/res/values-b+zh+Hans/strings.xml +++ b/app/src/main/res/values-b+zh+Hans/strings.xml @@ -803,4 +803,5 @@ 国际版没有每日签到 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 21327ef..b553c5b 100644 --- a/app/src/main/res/values-b+zh+Hant/strings.xml +++ b/app/src/main/res/values-b+zh+Hant/strings.xml @@ -803,4 +803,5 @@ 國際版沒有每日簽到 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 e1e3938..ba80a64 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -808,4 +808,5 @@ International edition has no daily check-in TRAE International uses USD billing with monthly request quotas instead of credit check-ins. Monthly quota + Dollar allowance \ No newline at end of file