fix: 点击红点卡片后扣减通知数+不恢复已查看红点

1. NotificationManager新增:
   - acknowledgedCards: 记录已查看的分类
   - cardIncrements: 记录每个分类的新增任务数
   - acknowledgeCard(): 标记分类已查看
   - pendingCount扣除已查看分类的增量

2. HomeFragment:
   - 点击卡片→acknowledgeCard→红点消失+提示条数量减少
   - onResume只恢复未查看分类的红点
   - pendingCount=0时清除所有提示
   - fetchStatistics记录每个分类的增量用于扣减

3. consumeAll重置所有状态(acknowledgedCards+cardIncrements)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-04-29 16:50:47 +09:30
parent 6418c2f36f
commit a00d5abd51
2 changed files with 76 additions and 19 deletions

View File

@@ -41,8 +41,18 @@ class NotificationManager @Inject constructor(
private val _pendingTaskIds = mutableListOf<String>()
val pendingTaskIds: List<String> 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<Int>()
/** 每个分类的新增任务数(从 diffStats 记录) */
private val _cardIncrements = mutableMapOf<Int, Int>()
/** 已查看分类的任务总数 */
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 }
}
/**