mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-07-22 19:54:45 +02:00
Fix:Sleep timer independent from audio player time to be uneffected by playback speed changes #86
This commit is contained in:
parent
a30fe74da2
commit
6b59ad5bd3
5 changed files with 80 additions and 45 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue