From 991808ce03822ea572eafb4537f0b68884c4019f Mon Sep 17 00:00:00 2001 From: Nishant Mishra Date: Fri, 17 Oct 2025 10:38:28 +0530 Subject: [PATCH] fix(timer): make resetTimer a suspend fun to avoid race condition This resolves a race condition which can cause the Service to quit before the resetTimer coroutine resets the app state. Closes: #78 --- .../nsh07/pomodoro/service/TimerService.kt | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/nsh07/pomodoro/service/TimerService.kt b/app/src/main/java/org/nsh07/pomodoro/service/TimerService.kt index 07de4c2..49012df 100644 --- a/app/src/main/java/org/nsh07/pomodoro/service/TimerService.kt +++ b/app/src/main/java/org/nsh07/pomodoro/service/TimerService.kt @@ -102,8 +102,10 @@ class TimerService : Service() { Actions.RESET.toString() -> { if (timerState.value.timerRunning) toggleTimer() - resetTimer() - stopForegroundService() + skipScope.launch { + resetTimer() + stopForegroundService() + } } Actions.SKIP.toString() -> skipTimer(true) @@ -278,27 +280,25 @@ class TimerService : Service() { } } - private fun resetTimer() { + private suspend fun resetTimer() { updateProgressSegments() - skipScope.launch { - saveTimeToDb() - time = timerRepository.focusTime - cycles = 0 - startTime = 0L - pauseTime = 0L - pauseDuration = 0L + saveTimeToDb() + time = timerRepository.focusTime + cycles = 0 + startTime = 0L + pauseTime = 0L + pauseDuration = 0L - _timerState.update { currentState -> - currentState.copy( - timerMode = TimerMode.FOCUS, - timeStr = millisecondsToStr(time), - totalTime = time, - nextTimerMode = if (timerRepository.sessionLength > 1) TimerMode.SHORT_BREAK else TimerMode.LONG_BREAK, - nextTimeStr = millisecondsToStr(if (timerRepository.sessionLength > 1) timerRepository.shortBreakTime else timerRepository.longBreakTime), - currentFocusCount = 1, - totalFocusCount = timerRepository.sessionLength - ) - } + _timerState.update { currentState -> + currentState.copy( + timerMode = TimerMode.FOCUS, + timeStr = millisecondsToStr(time), + totalTime = time, + nextTimerMode = if (timerRepository.sessionLength > 1) TimerMode.SHORT_BREAK else TimerMode.LONG_BREAK, + nextTimeStr = millisecondsToStr(if (timerRepository.sessionLength > 1) timerRepository.shortBreakTime else timerRepository.longBreakTime), + currentFocusCount = 1, + totalFocusCount = timerRepository.sessionLength + ) } }