diff --git a/app/src/main/java/com/xiaoqu/watch/service/manager/NotificationManager.kt b/app/src/main/java/com/xiaoqu/watch/service/manager/NotificationManager.kt index da47fcc..69058d4 100644 --- a/app/src/main/java/com/xiaoqu/watch/service/manager/NotificationManager.kt +++ b/app/src/main/java/com/xiaoqu/watch/service/manager/NotificationManager.kt @@ -41,8 +41,18 @@ class NotificationManager @Inject constructor( private val _pendingTaskIds = mutableListOf() val pendingTaskIds: List get() = _pendingTaskIds.toList() - /** 未读任务数量 */ - val pendingCount: Int get() = _pendingTaskIds.size + /** 未读任务数量(扣除已查看分类的增量) */ + val pendingCount: Int get() = (_pendingTaskIds.size - acknowledgedCount).coerceAtLeast(0) + + /** 已查看的卡片(status: 2=接单池, 3=待打卡, 4=待完成) */ + val acknowledgedCards = mutableSetOf() + + /** 每个分类的新增任务数(从 diffStats 记录) */ + private val _cardIncrements = mutableMapOf() + + /** 已查看分类的任务总数 */ + private val acknowledgedCount: Int + get() = acknowledgedCards.sumOf { _cardIncrements[it] ?: 0 } /** 上次消息处理时间(去抖用) */ private var lastMessageTime = 0L @@ -137,16 +147,41 @@ class NotificationManager @Inject constructor( } } - /** 消费所有未读消息(用户已查看列表) */ + /** 消费所有未读消息(用户点击提示条/横幅查看全部) */ fun consumeAll() { _pendingTaskIds.clear() + acknowledgedCards.clear() + _cardIncrements.clear() Timber.d("通知: 已清空全部未读") } /** 按 ID 消费(任务完成时) */ fun consumeByTaskId(taskId: String) { _pendingTaskIds.remove(taskId) - Timber.d("通知: 已消费任务 $taskId, 剩余 ${_pendingTaskIds.size}") + Timber.d("通知: 已消费任务 $taskId, 剩余 ${pendingCount}") + } + + /** + * 记录分类增量(从 diffStats 结果调用) + * @param status 卡片状态(2/3/4) + * @param increment 该分类新增任务数 + */ + fun recordCardIncrement(status: Int, increment: Int) { + _cardIncrements[status] = increment + } + + /** + * 标记某个分类已查看(用户点击红点卡片) + * 不从 pendingTaskIds 中删除,而是通过 acknowledgedCount 扣减 pendingCount + */ + fun acknowledgeCard(status: Int) { + acknowledgedCards.add(status) + Timber.d("通知: 已查看分类 $status, 剩余未读 $pendingCount") + } + + /** 是否还有未查看的分类 */ + fun hasUnacknowledgedCards(): Boolean { + return _cardIncrements.keys.any { it !in acknowledgedCards } } /** diff --git a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt index 71b74ca..4a3c480 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt @@ -130,14 +130,19 @@ class HomeFragment : BaseFragment() { override fun onResume() { super.onResume() - // 从其他页面返回时,恢复新任务提示 + // 从其他页面返回时,只恢复未查看分类的红点 if (notificationManager.pendingCount > 0) { - // 红点(不靠 diffStats,直接显示) - dotPool.visibility = View.VISIBLE - dotPunch.visibility = View.VISIBLE - dotComplete.visibility = View.VISIBLE - // 提示条 + val ack = notificationManager.acknowledgedCards + if (2 !in ack) dotPool.visibility = View.VISIBLE + if (3 !in ack) dotPunch.visibility = View.VISIBLE + if (4 !in ack) dotComplete.visibility = View.VISIBLE updateNewTaskHint() + } else { + // 全部已查看 → 清除所有提示 + dotPool.visibility = View.GONE + dotPunch.visibility = View.GONE + dotComplete.visibility = View.GONE + tvNewTaskHint.visibility = View.GONE } } @@ -290,17 +295,17 @@ class HomeFragment : BaseFragment() { navigateToNewTasks() } - // 快捷区卡片点击 → 跳转任务列表 + 清除红点 + // 快捷区卡片点击 → 标记已查看 + 清红点 + 更新提示条 + 跳转 page.findViewById(R.id.cardPool)?.setOnClickListener { - dotPool.visibility = View.GONE + acknowledgeCard(2, dotPool) navigateToTaskList(2) } page.findViewById(R.id.cardPunch)?.setOnClickListener { - dotPunch.visibility = View.GONE + acknowledgeCard(3, dotPunch) navigateToTaskList(3) } page.findViewById(R.id.cardComplete)?.setOnClickListener { - dotComplete.visibility = View.GONE + acknowledgeCard(4, dotComplete) navigateToTaskList(4) } } @@ -341,12 +346,22 @@ class HomeFragment : BaseFragment() { if (result is ApiResult.Success && result.data != null) { val data = result.data - // 对比红点 + // 对比红点 + 记录每个分类的增量 if (checkDots) { - val changedCards = notificationManager.diffStats(notificationManager.lastStats, data) - if (2 in changedCards) dotPool.visibility = View.VISIBLE - if (3 in changedCards) dotPunch.visibility = View.VISIBLE - if (4 in changedCards) dotComplete.visibility = View.VISIBLE + val oldStats = notificationManager.lastStats + val changedCards = notificationManager.diffStats(oldStats, data) + if (2 in changedCards) { + dotPool.visibility = View.VISIBLE + notificationManager.recordCardIncrement(2, data.waitForTask - (oldStats?.waitForTask ?: 0)) + } + if (3 in changedCards) { + dotPunch.visibility = View.VISIBLE + notificationManager.recordCardIncrement(3, data.treatTask - (oldStats?.treatTask ?: 0)) + } + if (4 in changedCards) { + dotComplete.visibility = View.VISIBLE + notificationManager.recordCardIncrement(4, data.incompleteTask - (oldStats?.incompleteTask ?: 0)) + } } // 更新数字 @@ -535,6 +550,13 @@ class HomeFragment : BaseFragment() { findNavController().navigate(R.id.action_home_to_taskList, bundle) } + /** 标记某个分类已查看:清红点 + 更新通知数 + 刷新提示条 */ + private fun acknowledgeCard(status: Int, dot: View) { + dot.visibility = View.GONE + notificationManager.acknowledgeCard(status) + updateNewTaskHint() + } + /** 更新新任务提示条 */ private fun updateNewTaskHint() { val count = notificationManager.pendingCount