Skip to content

Commit 2e93774

Browse files
author
Anton
committed
fix(android): fix negative notification countdown on phase change and update GEMINI.md to v1.1.4
1 parent 3bd903a commit 2e93774

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

GEMINI.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
## 專案現況
44
- **專案名稱**: Clock
5-
- **目前版本**: v1.1.3 (Security & Privacy Hardening)
5+
- **目前版本**: v1.1.4 (Notification Fixes)
66
- **核心技術**: .NET 10, WPF, Android Native (Kotlin + Compose), SignalR, mDNS
7-
- **開發日期**: 2026-01-31
7+
- **開發日期**: 2026-02-01
88

99
## 專案結構
1010
- clock: WPF 視圖層、通訊服務器實作與程式入口。支援 WinExe 模式與動態控制台分配。
@@ -37,6 +37,8 @@
3737
- **防禦性程式碼**: 加入 Hex 顏色格式驗證,防止因設定錯誤導致的啟動閃退。
3838
- **隱私控制**: Android 通知可見性調為 `PRIVATE`,保護鎖屏資訊。
3939
- **資源回收**: Android 端連線後自動停止 mDNS 掃描,節省電力與 WiFi 資源。
40+
7. **穩定性修正 (v1.1.4)**:
41+
- **Android 通知倒數修正**: 解決切換階段時,因狀態更新順序問題導致通知欄 Chronometer 顯示負數 (倒數至 0 後繼續倒數) 的 Bug。現在 `PomodoroEngine` 會確保在發送狀態變更事件前,先更新剩餘時間。
4042

4143
## 重要技術決策
4244
- **核心抽象化**: 將計時器 (ITimer)、音效 (IAudioService) 與 UI 控制 (IUIService) 介面化,確保 clock.Lib 可跨平台重用。

clock-android/app/src/main/kotlin/com/anton/clock/core/PomodoroEngine.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,8 @@ class PomodoroEngine(
7777

7878
fun applyState(state: EngineState) {
7979
lastState = state
80-
_isWorkPhase.value = state.isWorkPhase
81-
_isPaused.value = state.isPaused
8280

81+
// 1. 先計算時間偏差與補償
8382
if (!state.isPaused && state.targetEndTimeUnix > 0) {
8483
val now = System.currentTimeMillis()
8584
// 將補償值提高到 150ms 以趕上電腦
@@ -93,7 +92,19 @@ class PomodoroEngine(
9392
clockOffsetRolling = (1 - smoothingFactor) * clockOffsetRolling!! + smoothingFactor * currentInstantOffset
9493
}
9594
}
95+
96+
// 2. 立即更新 remainingSeconds,確保 UI/Notification 讀取到最新值
97+
val adjustedNow = now.toDouble() + (clockOffsetRolling ?: 0.0)
98+
val diff = state.targetEndTimeUnix.toDouble() - adjustedNow
99+
_remainingSeconds.value = if (diff > 0) (diff / 1000.0) else 0.0
100+
} else {
101+
// 暫停狀態或無目標時間,直接使用 State 數值
102+
_remainingSeconds.value = state.remainingSeconds
96103
}
104+
105+
// 3. 最後更新狀態旗標 (觸發 TimerService 的監聽器)
106+
_isWorkPhase.value = state.isWorkPhase
107+
_isPaused.value = state.isPaused
97108
}
98109

99110
fun localTogglePause() { _isPaused.value = !_isPaused.value }

0 commit comments

Comments
 (0)