From 8061ac0cedb3b5e54c213c833ca5adac28ac14aa Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 20 May 2023 11:41:39 -0500 Subject: [PATCH] Fix auto rewind when check resetting sleep timer --- .../app/managers/SleepTimerManager.kt | 41 ++++++++++++++----- .../app/player/PlayerListener.kt | 13 +++--- .../app/plugins/AbsAudioPlayer.kt | 3 +- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/managers/SleepTimerManager.kt b/android/app/src/main/java/com/audiobookshelf/app/managers/SleepTimerManager.kt index 14985242..4d2e0751 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/managers/SleepTimerManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/managers/SleepTimerManager.kt @@ -23,6 +23,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe private var sleepTimerFinishedAt:Long = 0L private var isAutoSleepTimer:Boolean = false // When timer was auto-set private var isFirstAutoSleepTimer: Boolean = true + private var sleepTimerSessionId:String = "" private fun getCurrentTime():Long { return playerNotificationService.getCurrentTime() @@ -125,7 +126,8 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe return true } - fun setManualSleepTimer(time: Long, isChapterTime:Boolean):Boolean { + fun setManualSleepTimer(playbackSessionId:String, time: Long, isChapterTime:Boolean):Boolean { + sleepTimerSessionId = playbackSessionId isAutoSleepTimer = false return setSleepTimer(time, isChapterTime) } @@ -135,7 +137,6 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe sleepTimerTask = null sleepTimerEndTime = 0 sleepTimerRunning = false - isAutoSleepTimer = false playerNotificationService.unregisterSensor() setVolume(1f) @@ -229,6 +230,17 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe return } + // Automatically Rewind in the book if settings is enabled + if (isAutoSleepTimer) { + DeviceManager.deviceData.deviceSettings?.let { deviceSettings -> + if (deviceSettings.autoSleepTimerAutoRewind && !isFirstAutoSleepTimer) { + Log.i(tag, "Auto sleep timer auto rewind seeking back ${deviceSettings.autoSleepTimerAutoRewindTime}ms") + playerNotificationService.seekBackward(deviceSettings.autoSleepTimerAutoRewindTime) + } + isFirstAutoSleepTimer = false + } + } + // Set sleep timer // When sleepTimerLength is 0 then use end of chapter/track time if (sleepTimerLength == 0L) { @@ -346,11 +358,12 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe Log.i(tag, "Current hour $currentHour is between ${deviceSettings.autoSleepTimerStartTime} and ${deviceSettings.autoSleepTimerEndTime} - starting sleep timer") // Automatically Rewind in the book if settings is enabled - if (deviceSettings.autoSleepTimerAutoRewind and !isFirstAutoSleepTimer) { + if (deviceSettings.autoSleepTimerAutoRewind && !isFirstAutoSleepTimer) { + Log.i(tag, "Auto sleep timer auto rewind seeking back ${deviceSettings.autoSleepTimerAutoRewindTime}ms") playerNotificationService.seekBackward(deviceSettings.autoSleepTimerAutoRewindTime) - } else { - isFirstAutoSleepTimer = false } + isFirstAutoSleepTimer = false + // Set sleep timer // When sleepTimerLength is 0 then use end of chapter/track time if (deviceSettings.sleepTimerLength == 0L) { @@ -366,16 +379,24 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe setSleepTimer(deviceSettings.sleepTimerLength, false) } } else { - if (!isFirstAutoSleepTimer) { - isFirstAutoSleepTimer = true - } + Log.d(tag, "[TEST] sleep timer window not in $isFirstAutoSleepTimer") + isFirstAutoSleepTimer = true Log.d(tag, "Current hour $currentHour is NOT between ${deviceSettings.autoSleepTimerStartTime} and ${deviceSettings.autoSleepTimerEndTime}") } } } - fun handleMediaPlayEvent() { - checkShouldResetSleepTimer() + fun handleMediaPlayEvent(playbackSessionId:String) { + // Check if the playback session has changed + // If it hasn't changed OR the sleep timer is running then check reset the timer + // e.g. You set a manual sleep timer for 10 mins, then decide to change books, the sleep timer will stay on and reset to 10 mins + if (sleepTimerSessionId == playbackSessionId || sleepTimerRunning) { + checkShouldResetSleepTimer() + } else { + isFirstAutoSleepTimer = true + sleepTimerSessionId = playbackSessionId + } + checkAutoSleepTimer() } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt index d7d42f7a..e4ae9c47 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt @@ -92,12 +92,15 @@ class PlayerListener(var playerNotificationService:PlayerNotificationService) : // Start/stop progress sync interval if (isPlaying) { - // Handles auto-starting sleep timer and resetting sleep timer - playerNotificationService.sleepTimerManager.handleMediaPlayEvent() - - player.volume = 1F // Volume on sleep timer might have decreased this val playbackSession: PlaybackSession? = playerNotificationService.mediaProgressSyncer.currentPlaybackSession ?: playerNotificationService.currentPlaybackSession - playbackSession?.let { playerNotificationService.mediaProgressSyncer.play(it) } + playbackSession?.let { + // Handles auto-starting sleep timer and resetting sleep timer + playerNotificationService.sleepTimerManager.handleMediaPlayEvent(it.id) + + player.volume = 1F // Volume on sleep timer might have decreased this + + playerNotificationService.mediaProgressSyncer.play(it) + } } else { playerNotificationService.mediaProgressSyncer.pause { Log.d(tag, "Media Progress Syncer paused and synced") diff --git a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt index a19d2227..a3b6a6e1 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt @@ -341,7 +341,8 @@ class AbsAudioPlayer : Plugin() { val isChapterTime:Boolean = call.getBoolean("isChapterTime", false) == true Handler(Looper.getMainLooper()).post { - val success:Boolean = playerNotificationService.sleepTimerManager.setManualSleepTimer(time, isChapterTime) + val playbackSession: PlaybackSession? = playerNotificationService.mediaProgressSyncer.currentPlaybackSession ?: playerNotificationService.currentPlaybackSession + val success:Boolean = playerNotificationService.sleepTimerManager.setManualSleepTimer(playbackSession?.id ?: "", time, isChapterTime) val ret = JSObject() ret.put("success", success) call.resolve(ret)