fix: Ollama detail page usage card, 5h label, real logo, widget data

- Add OllamaUsageCard to ServiceDetailScreen (5h + weekly windows)
- Unify Session → 5h across dashboard/detail/widget
- Download Ollama llama logo (icon-32x32.png) to drawable-nodpi
- ServiceIcon: use real PNG instead of emoji
- Widget: use ic_ollama_logo, fix row label to 5h
This commit is contained in:
WaterRain 2026-07-06 22:20:29 +00:00
parent e1c2774c86
commit 2926e8ebb2
No known key found for this signature in database
5 changed files with 65 additions and 13 deletions

View File

@ -102,18 +102,17 @@ fun ServiceIcon(
}
}
ServiceType.OLLAMA -> {
// Ollama 暂用 emoji 占位
Box(
modifier = modifier
.size(size.dp)
.clip(RoundedCornerShape(12.dp))
.background(Color(0xFF000000),
),
.clip(RoundedCornerShape(8.dp))
.background(if (isSystemInDarkTheme()) Color(0xFF1A1A1A) else Color.White),
contentAlignment = Alignment.Center
) {
androidx.compose.material3.Text(
text = "🦙",
fontSize = (size * 0.5).sp
Image(
painter = painterResource(id = R.drawable.ic_ollama_logo),
contentDescription = "Ollama Pro",
modifier = Modifier.size((size * 0.85).dp)
)
}
}

View File

@ -892,7 +892,7 @@ private fun OllamaMainBalance(balance: com.rainy.token.domain.model.ServiceBalan
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = "Session 已用",
text = "5h 已用",
style = MaterialTheme.typography.titleMedium,
color = inkMuted(),
modifier = Modifier.padding(bottom = 6.dp)
@ -918,12 +918,12 @@ private fun OllamaUsageWindows(balance: com.rainy.token.domain.model.ServiceBala
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
if (sessionPct != null) {
CompactUsageRow(
label = "Session",
label = "5h",
pct = sessionPct.toInt().coerceIn(0, 100),
resetInSec = sessionResetAt?.let { (it - System.currentTimeMillis()) / 1000 }?.takeIf { it > 0 }
)
} else {
CompactUsageRowEmpty(label = "Session", resetInSec = null)
CompactUsageRowEmpty(label = "5h", resetInSec = null)
}
if (weeklyPct != null) {
CompactUsageRow(

View File

@ -138,7 +138,7 @@ fun ServiceDetailScreen(
// Codex 详情:暂无专用详情卡片,用通用余额展示即可
}
ServiceType.OLLAMA -> {
// Ollama 详情:暂无专用详情卡片,用通用余额展示即可
item { OllamaUsageCard(uiState.state) }
}
}
@ -400,6 +400,59 @@ private fun formatResetInSec(sec: Long): String {
}
}
/**
* Ollama Pro 专属:5h + 每周用量窗口卡。
*/
@Composable
private fun OllamaUsageCard(state: State) {
val balance = when (state) {
is State.Fresh -> state.data
is State.Stale -> state.data
is State.Error -> state.cached
else -> null
}
val extras = balance?.extras ?: return
val plan = extras["plan"] ?: "—"
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(20.dp)) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = "用量窗口",
style = MaterialTheme.typography.labelLarge,
color = inkMuted()
)
Spacer(modifier = Modifier.weight(1f))
Text(
text = plan,
style = MaterialTheme.typography.labelLarge,
color = StrawberryPink,
fontWeight = FontWeight.Bold
)
}
Spacer(modifier = Modifier.height(12.dp))
UsageWindowRow(
label = "5 小时",
pct = extras["session.pct"]?.toIntOrNull(),
resetInSec = extras["session.resetAt"]?.toLongOrNull()?.let { (it - System.currentTimeMillis()) / 1000 }?.takeIf { it > 0 }
)
Spacer(modifier = Modifier.height(14.dp))
HorizontalDivider(color = MaterialTheme.colorScheme.outlineVariant)
Spacer(modifier = Modifier.height(14.dp))
UsageWindowRow(
label = "每周",
pct = extras["weekly.pct"]?.toIntOrNull(),
resetInSec = extras["weekly.resetAt"]?.toLongOrNull()?.let { (it - System.currentTimeMillis()) / 1000 }?.takeIf { it > 0 }
)
}
}
}
@Composable
private fun MainBalanceCard(state: State, service: ServiceType) {
Card(

View File

@ -182,7 +182,7 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() {
}
ServiceType.DEEPSEEK -> setEmptyState(views)
ServiceType.OLLAMA -> {
setRowLabel(views, "Session", "每周", "Plan")
setRowLabel(views, "5h", "每周", "Plan")
populateRow(views, R.id.row1_pct, R.id.row1_bar, R.id.row1_reset,
pct = extras["session.pct"]?.toIntOrNull(),
resetSec = extras["session.resetAt"]?.toLongOrNull()?.let { (it - System.currentTimeMillis()) / 1000 }?.takeIf { it > 0 })
@ -303,7 +303,7 @@ class OpenCodeGoWidgetProvider : AppWidgetProvider() {
ServiceType.OPENCODE_GO, ServiceType.COMMANDCODE_GO -> R.drawable.ic_opencode_go_logo
ServiceType.CODEX -> R.drawable.ic_codex_logo
ServiceType.DEEPSEEK -> R.drawable.ic_deepseek_logo
ServiceType.OLLAMA -> R.drawable.ic_opencode_go_logo // 复用,后续可换 Ollama logo
ServiceType.OLLAMA -> R.drawable.ic_ollama_logo
}
/**

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B