Fix:Sleep timer independent from audio player time to be uneffected by playback speed changes #86

This commit is contained in:
advplyr 2022-02-03 09:19:27 -06:00
parent a30fe74da2
commit 6b59ad5bd3
5 changed files with 80 additions and 45 deletions

View file

@ -45,8 +45,8 @@ class MyNativeAudio : Plugin() {
emit("onSleepTimerEnded", currentPosition) emit("onSleepTimerEnded", currentPosition)
} }
override fun onSleepTimerSet(sleepTimerEndTime: Long) { override fun onSleepTimerSet(sleepTimeRemaining: Int) {
emit("onSleepTimerSet", sleepTimerEndTime) emit("onSleepTimerSet", sleepTimeRemaining)
} }
}) })
} }

View file

@ -55,7 +55,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
fun onMetadata(metadata: JSObject) fun onMetadata(metadata: JSObject)
fun onPrepare(audiobookId: String, playWhenReady: Boolean) fun onPrepare(audiobookId: String, playWhenReady: Boolean)
fun onSleepTimerEnded(currentPosition: Long) fun onSleepTimerEnded(currentPosition: Long)
fun onSleepTimerSet(sleepTimerEndTime: Long) fun onSleepTimerSet(sleepTimeRemaining: Int)
} }
private val tag = "PlayerService" private val tag = "PlayerService"

View file

@ -1,6 +1,5 @@
package com.audiobookshelf.app package com.audiobookshelf.app
import android.hardware.SensorManager
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
@ -17,6 +16,8 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
private var sleepTimerTask:TimerTask? = null private var sleepTimerTask:TimerTask? = null
private var sleepTimerRunning:Boolean = false private var sleepTimerRunning:Boolean = false
private var sleepTimerEndTime:Long = 0L private var sleepTimerEndTime:Long = 0L
private var sleepTimerLength:Long = 0L
private var sleepTimerElapsed:Long = 0L
private var sleepTimerExtensionTime:Long = 0L private var sleepTimerExtensionTime:Long = 0L
private var sleepTimerFinishedAt:Long = 0L private var sleepTimerFinishedAt:Long = 0L
@ -45,13 +46,12 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
} }
private fun getSleepTimerTimeRemainingSeconds():Int { private fun getSleepTimerTimeRemainingSeconds():Int {
if (sleepTimerEndTime == 0L && sleepTimerLength > 0) { // For regular timer
return ((sleepTimerLength - sleepTimerElapsed) / 1000).toDouble().roundToInt()
}
// For chapter end timer
if (sleepTimerEndTime <= 0) return 0 if (sleepTimerEndTime <= 0) return 0
var sleepTimeRemaining = sleepTimerEndTime - getCurrentTime() return (((sleepTimerEndTime - getCurrentTime()) / 1000).toDouble()).roundToInt()
return ((sleepTimeRemaining / 1000).toDouble()).roundToInt()
}
fun getIsSleepTimerRunning():Boolean {
return sleepTimerRunning
} }
fun setSleepTimer(time: Long, isChapterTime: Boolean) : Boolean { fun setSleepTimer(time: Long, isChapterTime: Boolean) : Boolean {
@ -59,6 +59,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
sleepTimerTask?.cancel() sleepTimerTask?.cancel()
sleepTimerRunning = false sleepTimerRunning = false
sleepTimerFinishedAt = 0L sleepTimerFinishedAt = 0L
sleepTimerElapsed = 0L
// Register shake sensor // Register shake sensor
playerNotificationService.registerSensor() playerNotificationService.registerSensor()
@ -70,24 +71,36 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
return false return false
} }
sleepTimerEndTime = time sleepTimerEndTime = time
sleepTimerLength = 0
sleepTimerExtensionTime = SLEEP_EXTENSION_TIME sleepTimerExtensionTime = SLEEP_EXTENSION_TIME
if (sleepTimerEndTime > getDuration()) {
sleepTimerEndTime = getDuration()
}
} else { } else {
sleepTimerEndTime = currentTime + time sleepTimerLength = time
sleepTimerEndTime = 0L
sleepTimerExtensionTime = time sleepTimerExtensionTime = time
if (sleepTimerLength + getCurrentTime() > getDuration()) {
sleepTimerLength = getDuration() - getCurrentTime()
}
} }
if (sleepTimerEndTime > getDuration()) { playerNotificationService.listener?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds())
sleepTimerEndTime = getDuration()
}
playerNotificationService.listener?.onSleepTimerSet(sleepTimerEndTime)
sleepTimerRunning = true sleepTimerRunning = true
sleepTimerTask = Timer("SleepTimer", false).schedule(0L, 1000L) { sleepTimerTask = Timer("SleepTimer", false).schedule(0L, 1000L) {
Handler(Looper.getMainLooper()).post() { Handler(Looper.getMainLooper()).post() {
if (getIsPlaying()) { if (getIsPlaying()) {
sleepTimerElapsed += 1000L
var sleepTimeSecondsRemaining = getSleepTimerTimeRemainingSeconds() var sleepTimeSecondsRemaining = getSleepTimerTimeRemainingSeconds()
Log.d(tag, "Sleep TIMER time remaining $sleepTimeSecondsRemaining s") Log.d(tag, "Timer Elapsed $sleepTimerElapsed | Sleep TIMER time remaining $sleepTimeSecondsRemaining s")
if (sleepTimeSecondsRemaining > 0) {
playerNotificationService.listener?.onSleepTimerSet(sleepTimeSecondsRemaining)
}
if (sleepTimeSecondsRemaining <= 0) { if (sleepTimeSecondsRemaining <= 0) {
Log.d(tag, "Sleep Timer Pausing Player on Chapter") Log.d(tag, "Sleep Timer Pausing Player on Chapter")
@ -129,9 +142,15 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
private fun extendSleepTime() { private fun extendSleepTime() {
if (!sleepTimerRunning) return if (!sleepTimerRunning) return
setVolume(1F) setVolume(1F)
sleepTimerEndTime += sleepTimerExtensionTime if (sleepTimerEndTime == 0L) {
if (sleepTimerEndTime > getDuration()) sleepTimerEndTime = getDuration() sleepTimerLength += sleepTimerExtensionTime
playerNotificationService.listener?.onSleepTimerSet(sleepTimerEndTime) if (sleepTimerLength + getCurrentTime() > getDuration()) sleepTimerLength = getDuration() - getCurrentTime()
} else {
sleepTimerEndTime += sleepTimerExtensionTime
if (sleepTimerEndTime > getDuration()) sleepTimerEndTime = getDuration()
}
playerNotificationService.listener?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds())
} }
fun checkShouldExtendSleepTimer() { fun checkShouldExtendSleepTimer() {
@ -164,27 +183,42 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
fun increaseSleepTime(time: Long) { fun increaseSleepTime(time: Long) {
Log.d(tag, "Increase Sleep time $time") Log.d(tag, "Increase Sleep time $time")
if (!sleepTimerRunning) return if (!sleepTimerRunning) return
var newSleepEndTime = sleepTimerEndTime + time
sleepTimerEndTime = if (newSleepEndTime >= getDuration()) { if (sleepTimerEndTime == 0L) {
getDuration() sleepTimerLength += time
if (sleepTimerLength + getCurrentTime() > getDuration()) sleepTimerLength = getDuration() - getCurrentTime()
} else { } else {
newSleepEndTime var newSleepEndTime = sleepTimerEndTime + time
sleepTimerEndTime = if (newSleepEndTime >= getDuration()) {
getDuration()
} else {
newSleepEndTime
}
} }
setVolume(1F) setVolume(1F)
playerNotificationService.listener?.onSleepTimerSet(sleepTimerEndTime) playerNotificationService.listener?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds())
} }
fun decreaseSleepTime(time: Long) { fun decreaseSleepTime(time: Long) {
Log.d(tag, "Decrease Sleep time $time") Log.d(tag, "Decrease Sleep time $time")
if (!sleepTimerRunning) return if (!sleepTimerRunning) return
var newSleepEndTime = sleepTimerEndTime - time
sleepTimerEndTime = if (newSleepEndTime <= 1000) {
// End sleep timer in 1 second if (sleepTimerEndTime == 0L) {
getCurrentTime() + 1000 sleepTimerLength -= time
if (sleepTimerLength <= 0) sleepTimerLength = 1000L
} else { } else {
newSleepEndTime var newSleepEndTime = sleepTimerEndTime - time
sleepTimerEndTime = if (newSleepEndTime <= 1000) {
// End sleep timer in 1 second
getCurrentTime() + 1000
} else {
newSleepEndTime
}
} }
setVolume(1F) setVolume(1F)
playerNotificationService.listener?.onSleepTimerSet(sleepTimerEndTime) playerNotificationService.listener?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds())
} }
} }

View file

@ -107,7 +107,7 @@ export default {
}, },
loading: Boolean, loading: Boolean,
sleepTimerRunning: Boolean, sleepTimerRunning: Boolean,
sleepTimerEndTime: Number sleepTimeRemaining: Number
}, },
data() { data() {
return { return {
@ -241,10 +241,10 @@ export default {
if (!this.currentChapter) return 0 if (!this.currentChapter) return 0
return this.currentChapter.end - this.currentTime return this.currentChapter.end - this.currentTime
}, },
sleepTimeRemaining() { // sleepTimeRemaining() {
if (!this.sleepTimerEndTime) return 0 // if (!this.sleepTimerEndTime) return 0
return Math.max(0, this.sleepTimerEndTime / 1000 - this.currentTime) // return Math.max(0, this.sleepTimerEndTime / 1000 - this.currentTime)
}, // },
sleepTimeRemainingPretty() { sleepTimeRemainingPretty() {
if (!this.sleepTimeRemaining) return '0s' if (!this.sleepTimeRemaining) return '0s'
var secondsRemaining = Math.round(this.sleepTimeRemaining) var secondsRemaining = Math.round(this.sleepTimeRemaining)

View file

@ -9,7 +9,7 @@
:loading="isLoading" :loading="isLoading"
:bookmarks="bookmarks" :bookmarks="bookmarks"
:sleep-timer-running="isSleepTimerRunning" :sleep-timer-running="isSleepTimerRunning"
:sleep-timer-end-time="sleepTimerEndTime" :sleep-time-remaining="sleepTimeRemaining"
@close="cancelStream" @close="cancelStream"
@sync="sync" @sync="sync"
@setTotalDuration="setTotalDuration" @setTotalDuration="setTotalDuration"
@ -49,6 +49,7 @@ export default {
currentTime: 0, currentTime: 0,
isSleepTimerRunning: false, isSleepTimerRunning: false,
sleepTimerEndTime: 0, sleepTimerEndTime: 0,
sleepTimerRemaining: 0,
onSleepTimerEndedListener: null, onSleepTimerEndedListener: null,
onSleepTimerSetListener: null, onSleepTimerSetListener: null,
sleepInterval: null, sleepInterval: null,
@ -149,11 +150,11 @@ export default {
return `${this.$store.state.serverUrl}/s/book/${this.audiobook.id}/${trelpath}?token=${this.userToken}` return `${this.$store.state.serverUrl}/s/book/${this.audiobook.id}/${trelpath}?token=${this.userToken}`
}) })
return tracks return tracks
},
sleepTimeRemaining() {
if (!this.sleepTimerEndTime) return 0
return Math.max(0, this.sleepTimerEndTime / 1000 - this.currentTime)
} }
// sleepTimeRemaining() {
// if (!this.sleepTimerEndTime) return 0
// return Math.max(0, this.sleepTimerEndTime / 1000 - this.currentTime)
// }
}, },
methods: { methods: {
showBookmarks() { showBookmarks() {
@ -175,16 +176,16 @@ export default {
this.updateTime(currentTime) this.updateTime(currentTime)
} }
}, },
onSleepTimerSet({ value: sleepTimerEndTime }) { onSleepTimerSet({ value: sleepTimeRemaining }) {
console.log('SLEEP TIMER SET', sleepTimerEndTime) console.log('SLEEP TIMER SET', sleepTimeRemaining)
if (sleepTimerEndTime === 0) { if (sleepTimeRemaining === 0) {
console.log('Sleep timer canceled') console.log('Sleep timer canceled')
this.isSleepTimerRunning = false this.isSleepTimerRunning = false
} else { } else {
this.isSleepTimerRunning = true this.isSleepTimerRunning = true
} }
this.sleepTimerEndTime = sleepTimerEndTime this.sleepTimeRemaining = sleepTimeRemaining
}, },
showSleepTimer() { showSleepTimer() {
if (this.currentChapter) { if (this.currentChapter) {