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 1b8e80a8..f117ca71 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 @@ -20,6 +20,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe private var sleepTimerLength:Long = 0L private var sleepTimerElapsed:Long = 0L private var sleepTimerFinishedAt:Long = 0L + private var isAutoSleepTimer:Boolean = false // When timer was auto-set private fun getCurrentTime():Long { return playerNotificationService.getCurrentTime() @@ -54,7 +55,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe return (((sleepTimerEndTime - getCurrentTime()) / 1000).toDouble()).roundToInt() } - fun setSleepTimer(time: Long, isChapterTime: Boolean) : Boolean { + private fun setSleepTimer(time: Long, isChapterTime: Boolean) : Boolean { Log.d(tag, "Setting Sleep Timer for $time is chapter time $isChapterTime") sleepTimerTask?.cancel() sleepTimerRunning = true @@ -85,7 +86,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe } } - playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds()) + playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds(), isAutoSleepTimer) sleepTimerTask = Timer("SleepTimer", false).schedule(0L, 1000L) { Handler(Looper.getMainLooper()).post { @@ -96,7 +97,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe Log.d(tag, "Timer Elapsed $sleepTimerElapsed | Sleep TIMER time remaining $sleepTimeSecondsRemaining s") if (sleepTimeSecondsRemaining > 0) { - playerNotificationService.clientEventEmitter?.onSleepTimerSet(sleepTimeSecondsRemaining) + playerNotificationService.clientEventEmitter?.onSleepTimerSet(sleepTimeSecondsRemaining, isAutoSleepTimer) } if (sleepTimeSecondsRemaining <= 0) { @@ -118,11 +119,17 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe return true } + fun setManualSleepTimer(time: Long, isChapterTime:Boolean):Boolean { + isAutoSleepTimer = false + return setSleepTimer(time, isChapterTime) + } + private fun clearSleepTimer() { sleepTimerTask?.cancel() sleepTimerTask = null sleepTimerEndTime = 0 sleepTimerRunning = false + isAutoSleepTimer = false playerNotificationService.unregisterSensor() } @@ -132,8 +139,15 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe fun cancelSleepTimer() { Log.d(tag, "Canceling Sleep Timer") + + if (isAutoSleepTimer) { + Log.i(tag, "Disabling auto sleep timer") + DeviceManager.deviceData.deviceSettings?.autoSleepTimer = false + DeviceManager.dbManager.saveDeviceData(DeviceManager.deviceData) + } + clearSleepTimer() - playerNotificationService.clientEventEmitter?.onSleepTimerSet(0) + playerNotificationService.clientEventEmitter?.onSleepTimerSet(0, false) } // Vibrate when extending sleep timer by shaking @@ -264,7 +278,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe } setVolume(1F) - playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds()) + playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds(), isAutoSleepTimer) } fun decreaseSleepTime(time: Long) { @@ -286,7 +300,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe } setVolume(1F) - playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds()) + playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds(), isAutoSleepTimer) } fun checkAutoSleepTimer() { @@ -322,9 +336,11 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe if (chapterEndTimeMs == null) { Log.e(tag, "Setting auto sleep timer to end of chapter/track but there is no current session") } else { + isAutoSleepTimer = true setSleepTimer(chapterEndTimeMs, true) } } else { + isAutoSleepTimer = true setSleepTimer(deviceSettings.sleepTimerLength, false) } } else { diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt index db82c6f5..718b9247 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt @@ -70,7 +70,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { fun onPlayingUpdate(isPlaying: Boolean) fun onMetadata(metadata: PlaybackMetadata) fun onSleepTimerEnded(currentPosition: Long) - fun onSleepTimerSet(sleepTimeRemaining: Int) + fun onSleepTimerSet(sleepTimeRemaining: Int, isAutoSleepTimer:Boolean) fun onLocalMediaProgressUpdate(localMediaProgress: LocalMediaProgress) fun onPlaybackFailed(errorMessage:String) fun onMediaPlayerChanged(mediaPlayer:String) 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 6b55ed58..ededb470 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 @@ -63,8 +63,11 @@ class AbsAudioPlayer : Plugin() { emit("onSleepTimerEnded", currentPosition) } - override fun onSleepTimerSet(sleepTimeRemaining: Int) { - emit("onSleepTimerSet", sleepTimeRemaining) + override fun onSleepTimerSet(sleepTimeRemaining: Int, isAutoSleepTimer:Boolean) { + val ret = JSObject() + ret.put("value", sleepTimeRemaining) + ret.put("isAuto", isAutoSleepTimer) + notifyListeners("onSleepTimerSet", ret) } override fun onLocalMediaProgressUpdate(localMediaProgress: LocalMediaProgress) { @@ -330,7 +333,7 @@ class AbsAudioPlayer : Plugin() { val isChapterTime:Boolean = call.getBoolean("isChapterTime", false) == true Handler(Looper.getMainLooper()).post { - val success:Boolean = playerNotificationService.sleepTimerManager.setSleepTimer(time, isChapterTime) + val success:Boolean = playerNotificationService.sleepTimerManager.setManualSleepTimer(time, isChapterTime) val ret = JSObject() ret.put("success", success) call.resolve(ret) diff --git a/components/app/AudioPlayerContainer.vue b/components/app/AudioPlayerContainer.vue index 6fccdb9e..060a2878 100644 --- a/components/app/AudioPlayerContainer.vue +++ b/components/app/AudioPlayerContainer.vue @@ -3,7 +3,7 @@ - + @@ -28,6 +28,7 @@ export default { isSleepTimerRunning: false, sleepTimerEndTime: 0, sleepTimeRemaining: 0, + isAutoSleepTimer: false, onLocalMediaProgressUpdateListener: null, onSleepTimerEndedListener: null, onSleepTimerSetListener: null, @@ -62,8 +63,9 @@ export default { console.log('Sleep Timer Ended Current Position: ' + currentPosition) } }, - onSleepTimerSet({ value: sleepTimeRemaining }) { - console.log('SLEEP TIMER SET', sleepTimeRemaining) + onSleepTimerSet(payload) { + const { value: sleepTimeRemaining, isAuto } = payload + console.log('SLEEP TIMER SET', JSON.stringify(payload)) if (sleepTimeRemaining === 0) { console.log('Sleep timer canceled') this.isSleepTimerRunning = false @@ -71,6 +73,7 @@ export default { this.isSleepTimerRunning = true } + this.isAutoSleepTimer = !!isAuto this.sleepTimeRemaining = sleepTimeRemaining }, showSleepTimer() { diff --git a/components/modals/SleepTimerModal.vue b/components/modals/SleepTimerModal.vue index 99bd2b5e..edb45465 100644 --- a/components/modals/SleepTimerModal.vue +++ b/components/modals/SleepTimerModal.vue @@ -51,7 +51,7 @@ add - Cancel Timer + {{ isAuto ? 'Disable Auto Timer' : 'Cancel Timer' }} @@ -59,12 +59,15 @@