From 26589f0197fb8403f0181d18343a34a91ead5c85 Mon Sep 17 00:00:00 2001 From: dongliang Date: Fri, 8 May 2026 13:29:07 +0930 Subject: [PATCH] =?UTF-8?q?fix:=20TTS=E6=97=B6=E9=97=B4=E6=9C=97=E8=AF=BB?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20+=20=E8=A1=A5=E5=85=85=E8=A6=81=E6=B1=82?= =?UTF-8?q?=E5=AE=8C=E6=88=90/=E6=88=AA=E6=AD=A2=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 时间格式转中文朗读:"04.28 09:10" → "4月28日9点10分" 2. 补充要求完成时间(preFinishTime)和截止时间(expireTime) 3. 积分读"X分"而非"+X" Co-Authored-By: Claude Opus 4.6 (1M context) --- .../watch/ui/task/TaskDetailFragment.kt | 29 ++++++++++++++-- .../xiaoqu/watch/ui/task/TaskListFragment.kt | 33 +++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/ui/task/TaskDetailFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/task/TaskDetailFragment.kt index 5faf544..890a0ae 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/task/TaskDetailFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/task/TaskDetailFragment.kt @@ -309,8 +309,12 @@ class TaskDetailFragment : BaseFragment() { val parts = mutableListOf() if (detail.name.isNotBlank()) parts.add("任务:${detail.displayName}") if (detail.positionText.isNotBlank()) parts.add("地点:${detail.positionText}") - if (detail.sendTime.isNotBlank()) parts.add("时间:${detail.sendTime}") - if (detail.point > 0) parts.add("积分:${detail.pointText}") + if (detail.sendTime.isNotBlank()) parts.add("派单时间:${formatTimeForTts(detail.sendTime)}") + when { + !detail.preFinishTime.isNullOrEmpty() -> parts.add("要求完成:${formatTimeForTts(detail.preFinishTime!!)}") + !detail.expireTime.isNullOrEmpty() -> parts.add("截止时间:${formatTimeForTts(detail.expireTime!!)}") + } + if (detail.point > 0) parts.add("积分:${detail.point.toInt()}分") if (detail.content.isNotBlank()) parts.add("备注:${detail.content}") if (parts.isEmpty()) return @@ -338,6 +342,27 @@ class TaskDetailFragment : BaseFragment() { updateTtsButton(playing = false) } + /** + * 将时间字符串转为适合朗读的中文格式 + * "04.28 09:10" → "4月28日9点10分" + * "2026-04-28 09:10:00" → "4月28日9点10分" + */ + private fun formatTimeForTts(time: String): String { + try { + val shortPattern = Regex("""(\d{1,2})\.(\d{1,2})\s+(\d{1,2}):(\d{2})""") + shortPattern.find(time)?.let { match -> + val (month, day, hour, minute) = match.destructured + return "${month.toInt()}月${day.toInt()}日${hour.toInt()}点${minute}分" + } + val longPattern = Regex("""(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{2})""") + longPattern.find(time)?.let { match -> + val (_, month, day, hour, minute) = match.destructured + return "${month.toInt()}月${day.toInt()}日${hour.toInt()}点${minute}分" + } + } catch (_: Exception) { } + return time + } + /** 更新 TTS 按钮的 UI 状态 */ private fun updateTtsButton(playing: Boolean) { binding.btnTts.setImageResource( diff --git a/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt index ae28d89..472748a 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt @@ -1035,8 +1035,13 @@ class TaskListFragment : BaseFragment() { val parts = mutableListOf() if (detail.name.isNotBlank()) parts.add("任务:${detail.displayName}") if (detail.positionText.isNotBlank()) parts.add("地点:${detail.positionText}") - if (detail.sendTime.isNotBlank()) parts.add("时间:${detail.sendTime}") - if (detail.point > 0) parts.add("积分:${detail.pointText}") + if (detail.sendTime.isNotBlank()) parts.add("派单时间:${formatTimeForTts(detail.sendTime)}") + // 要求完成时间 / 截止时间(优先要求,和页面显示逻辑一致) + when { + !detail.preFinishTime.isNullOrEmpty() -> parts.add("要求完成:${formatTimeForTts(detail.preFinishTime!!)}") + !detail.expireTime.isNullOrEmpty() -> parts.add("截止时间:${formatTimeForTts(detail.expireTime!!)}") + } + if (detail.point > 0) parts.add("积分:${detail.point.toInt()}分") if (detail.content.isNotBlank()) parts.add("备注:${detail.content}") if (parts.isEmpty()) return @@ -1064,6 +1069,30 @@ class TaskListFragment : BaseFragment() { updateTtsButton(playing = false) } + /** + * 将时间字符串转为适合朗读的中文格式 + * "04.28 09:10" → "4月28日9点10分" + * "2026-04-28 09:10:00" → "4月28日9点10分" + * 无法解析时返回原文 + */ + private fun formatTimeForTts(time: String): String { + try { + // 匹配 "MM.dd HH:mm" 格式 + val shortPattern = Regex("""(\d{1,2})\.(\d{1,2})\s+(\d{1,2}):(\d{2})""") + shortPattern.find(time)?.let { match -> + val (month, day, hour, minute) = match.destructured + return "${month.toInt()}月${day.toInt()}日${hour.toInt()}点${minute}分" + } + // 匹配 "yyyy-MM-dd HH:mm:ss" 或 "yyyy-MM-dd HH:mm" 格式 + val longPattern = Regex("""(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{2})""") + longPattern.find(time)?.let { match -> + val (_, month, day, hour, minute) = match.destructured + return "${month.toInt()}月${day.toInt()}日${hour.toInt()}点${minute}分" + } + } catch (_: Exception) { } + return time + } + /** 更新 TTS 按钮的 UI 状态 */ private fun updateTtsButton(playing: Boolean) { binding.btnTts.setImageResource(