Update:Android cancelling sleep timer when it was auto-enabled will also disable the auto sleep timer setting with alert #545

This commit is contained in:
advplyr 2023-02-04 16:57:55 -06:00
parent 8710775872
commit 5e98a4ff2f
5 changed files with 48 additions and 15 deletions

View file

@ -20,6 +20,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
private var sleepTimerLength:Long = 0L private var sleepTimerLength:Long = 0L
private var sleepTimerElapsed:Long = 0L private var sleepTimerElapsed:Long = 0L
private var sleepTimerFinishedAt:Long = 0L private var sleepTimerFinishedAt:Long = 0L
private var isAutoSleepTimer:Boolean = false // When timer was auto-set
private fun getCurrentTime():Long { private fun getCurrentTime():Long {
return playerNotificationService.getCurrentTime() return playerNotificationService.getCurrentTime()
@ -54,7 +55,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
return (((sleepTimerEndTime - getCurrentTime()) / 1000).toDouble()).roundToInt() 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") Log.d(tag, "Setting Sleep Timer for $time is chapter time $isChapterTime")
sleepTimerTask?.cancel() sleepTimerTask?.cancel()
sleepTimerRunning = true 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) { sleepTimerTask = Timer("SleepTimer", false).schedule(0L, 1000L) {
Handler(Looper.getMainLooper()).post { 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") Log.d(tag, "Timer Elapsed $sleepTimerElapsed | Sleep TIMER time remaining $sleepTimeSecondsRemaining s")
if (sleepTimeSecondsRemaining > 0) { if (sleepTimeSecondsRemaining > 0) {
playerNotificationService.clientEventEmitter?.onSleepTimerSet(sleepTimeSecondsRemaining) playerNotificationService.clientEventEmitter?.onSleepTimerSet(sleepTimeSecondsRemaining, isAutoSleepTimer)
} }
if (sleepTimeSecondsRemaining <= 0) { if (sleepTimeSecondsRemaining <= 0) {
@ -118,11 +119,17 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
return true return true
} }
fun setManualSleepTimer(time: Long, isChapterTime:Boolean):Boolean {
isAutoSleepTimer = false
return setSleepTimer(time, isChapterTime)
}
private fun clearSleepTimer() { private fun clearSleepTimer() {
sleepTimerTask?.cancel() sleepTimerTask?.cancel()
sleepTimerTask = null sleepTimerTask = null
sleepTimerEndTime = 0 sleepTimerEndTime = 0
sleepTimerRunning = false sleepTimerRunning = false
isAutoSleepTimer = false
playerNotificationService.unregisterSensor() playerNotificationService.unregisterSensor()
} }
@ -132,8 +139,15 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
fun cancelSleepTimer() { fun cancelSleepTimer() {
Log.d(tag, "Canceling Sleep Timer") 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() clearSleepTimer()
playerNotificationService.clientEventEmitter?.onSleepTimerSet(0) playerNotificationService.clientEventEmitter?.onSleepTimerSet(0, false)
} }
// Vibrate when extending sleep timer by shaking // Vibrate when extending sleep timer by shaking
@ -264,7 +278,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
} }
setVolume(1F) setVolume(1F)
playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds()) playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds(), isAutoSleepTimer)
} }
fun decreaseSleepTime(time: Long) { fun decreaseSleepTime(time: Long) {
@ -286,7 +300,7 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
} }
setVolume(1F) setVolume(1F)
playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds()) playerNotificationService.clientEventEmitter?.onSleepTimerSet(getSleepTimerTimeRemainingSeconds(), isAutoSleepTimer)
} }
fun checkAutoSleepTimer() { fun checkAutoSleepTimer() {
@ -322,9 +336,11 @@ class SleepTimerManager constructor(private val playerNotificationService: Playe
if (chapterEndTimeMs == null) { if (chapterEndTimeMs == null) {
Log.e(tag, "Setting auto sleep timer to end of chapter/track but there is no current session") Log.e(tag, "Setting auto sleep timer to end of chapter/track but there is no current session")
} else { } else {
isAutoSleepTimer = true
setSleepTimer(chapterEndTimeMs, true) setSleepTimer(chapterEndTimeMs, true)
} }
} else { } else {
isAutoSleepTimer = true
setSleepTimer(deviceSettings.sleepTimerLength, false) setSleepTimer(deviceSettings.sleepTimerLength, false)
} }
} else { } else {

View file

@ -70,7 +70,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
fun onPlayingUpdate(isPlaying: Boolean) fun onPlayingUpdate(isPlaying: Boolean)
fun onMetadata(metadata: PlaybackMetadata) fun onMetadata(metadata: PlaybackMetadata)
fun onSleepTimerEnded(currentPosition: Long) fun onSleepTimerEnded(currentPosition: Long)
fun onSleepTimerSet(sleepTimeRemaining: Int) fun onSleepTimerSet(sleepTimeRemaining: Int, isAutoSleepTimer:Boolean)
fun onLocalMediaProgressUpdate(localMediaProgress: LocalMediaProgress) fun onLocalMediaProgressUpdate(localMediaProgress: LocalMediaProgress)
fun onPlaybackFailed(errorMessage:String) fun onPlaybackFailed(errorMessage:String)
fun onMediaPlayerChanged(mediaPlayer:String) fun onMediaPlayerChanged(mediaPlayer:String)

View file

@ -63,8 +63,11 @@ class AbsAudioPlayer : Plugin() {
emit("onSleepTimerEnded", currentPosition) emit("onSleepTimerEnded", currentPosition)
} }
override fun onSleepTimerSet(sleepTimeRemaining: Int) { override fun onSleepTimerSet(sleepTimeRemaining: Int, isAutoSleepTimer:Boolean) {
emit("onSleepTimerSet", sleepTimeRemaining) val ret = JSObject()
ret.put("value", sleepTimeRemaining)
ret.put("isAuto", isAutoSleepTimer)
notifyListeners("onSleepTimerSet", ret)
} }
override fun onLocalMediaProgressUpdate(localMediaProgress: LocalMediaProgress) { override fun onLocalMediaProgressUpdate(localMediaProgress: LocalMediaProgress) {
@ -330,7 +333,7 @@ class AbsAudioPlayer : Plugin() {
val isChapterTime:Boolean = call.getBoolean("isChapterTime", false) == true val isChapterTime:Boolean = call.getBoolean("isChapterTime", false) == true
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
val success:Boolean = playerNotificationService.sleepTimerManager.setSleepTimer(time, isChapterTime) val success:Boolean = playerNotificationService.sleepTimerManager.setManualSleepTimer(time, isChapterTime)
val ret = JSObject() val ret = JSObject()
ret.put("success", success) ret.put("success", success)
call.resolve(ret) call.resolve(ret)

View file

@ -3,7 +3,7 @@
<app-audio-player ref="audioPlayer" :bookmarks="bookmarks" :sleep-timer-running="isSleepTimerRunning" :sleep-time-remaining="sleepTimeRemaining" :is-server-item="!!serverLibraryItemId" @selectPlaybackSpeed="showPlaybackSpeedModal = true" @updateTime="(t) => (currentTime = t)" @showSleepTimer="showSleepTimer" @showBookmarks="showBookmarks" /> <app-audio-player ref="audioPlayer" :bookmarks="bookmarks" :sleep-timer-running="isSleepTimerRunning" :sleep-time-remaining="sleepTimeRemaining" :is-server-item="!!serverLibraryItemId" @selectPlaybackSpeed="showPlaybackSpeedModal = true" @updateTime="(t) => (currentTime = t)" @showSleepTimer="showSleepTimer" @showBookmarks="showBookmarks" />
<modals-playback-speed-modal v-model="showPlaybackSpeedModal" :playback-rate.sync="playbackSpeed" @update:playbackRate="updatePlaybackSpeed" @change="changePlaybackSpeed" /> <modals-playback-speed-modal v-model="showPlaybackSpeedModal" :playback-rate.sync="playbackSpeed" @update:playbackRate="updatePlaybackSpeed" @change="changePlaybackSpeed" />
<modals-sleep-timer-modal v-model="showSleepTimerModal" :current-time="sleepTimeRemaining" :sleep-timer-running="isSleepTimerRunning" :current-end-of-chapter-time="currentEndOfChapterTime" @change="selectSleepTimeout" @cancel="cancelSleepTimer" @increase="increaseSleepTimer" @decrease="decreaseSleepTimer" /> <modals-sleep-timer-modal v-model="showSleepTimerModal" :current-time="sleepTimeRemaining" :sleep-timer-running="isSleepTimerRunning" :current-end-of-chapter-time="currentEndOfChapterTime" :is-auto="isAutoSleepTimer" @change="selectSleepTimeout" @cancel="cancelSleepTimer" @increase="increaseSleepTimer" @decrease="decreaseSleepTimer" />
<modals-bookmarks-modal v-model="showBookmarksModal" :bookmarks="bookmarks" :current-time="currentTime" :library-item-id="serverLibraryItemId" @select="selectBookmark" /> <modals-bookmarks-modal v-model="showBookmarksModal" :bookmarks="bookmarks" :current-time="currentTime" :library-item-id="serverLibraryItemId" @select="selectBookmark" />
</div> </div>
</template> </template>
@ -28,6 +28,7 @@ export default {
isSleepTimerRunning: false, isSleepTimerRunning: false,
sleepTimerEndTime: 0, sleepTimerEndTime: 0,
sleepTimeRemaining: 0, sleepTimeRemaining: 0,
isAutoSleepTimer: false,
onLocalMediaProgressUpdateListener: null, onLocalMediaProgressUpdateListener: null,
onSleepTimerEndedListener: null, onSleepTimerEndedListener: null,
onSleepTimerSetListener: null, onSleepTimerSetListener: null,
@ -62,8 +63,9 @@ export default {
console.log('Sleep Timer Ended Current Position: ' + currentPosition) console.log('Sleep Timer Ended Current Position: ' + currentPosition)
} }
}, },
onSleepTimerSet({ value: sleepTimeRemaining }) { onSleepTimerSet(payload) {
console.log('SLEEP TIMER SET', sleepTimeRemaining) const { value: sleepTimeRemaining, isAuto } = payload
console.log('SLEEP TIMER SET', JSON.stringify(payload))
if (sleepTimeRemaining === 0) { if (sleepTimeRemaining === 0) {
console.log('Sleep timer canceled') console.log('Sleep timer canceled')
this.isSleepTimerRunning = false this.isSleepTimerRunning = false
@ -71,6 +73,7 @@ export default {
this.isSleepTimerRunning = true this.isSleepTimerRunning = true
} }
this.isAutoSleepTimer = !!isAuto
this.sleepTimeRemaining = sleepTimeRemaining this.sleepTimeRemaining = sleepTimeRemaining
}, },
showSleepTimer() { showSleepTimer() {

View file

@ -51,7 +51,7 @@
<ui-btn @click="increaseSleepTime" class="w-9 h-9" :padding-x="0" small style="max-width: 36px"><span class="material-icons">add</span></ui-btn> <ui-btn @click="increaseSleepTime" class="w-9 h-9" :padding-x="0" small style="max-width: 36px"><span class="material-icons">add</span></ui-btn>
</div> </div>
<ui-btn @click="cancelSleepTimer" class="w-full">Cancel Timer</ui-btn> <ui-btn @click="cancelSleepTimer" class="w-full">{{ isAuto ? 'Disable Auto Timer' : 'Cancel Timer' }}</ui-btn>
</div> </div>
</div> </div>
</div> </div>
@ -59,12 +59,15 @@
</template> </template>
<script> <script>
import { Dialog } from '@capacitor/dialog'
export default { export default {
props: { props: {
value: Boolean, value: Boolean,
currentTime: Number, currentTime: Number,
sleepTimerRunning: Boolean, sleepTimerRunning: Boolean,
currentEndOfChapterTime: Number currentEndOfChapterTime: Number,
isAuto: Boolean
}, },
data() { data() {
return { return {
@ -102,6 +105,14 @@ export default {
this.$nextTick(() => this.$emit('change', { time: timeout, isChapterTime: false })) this.$nextTick(() => this.$emit('change', { time: timeout, isChapterTime: false }))
}, },
async cancelSleepTimer() { async cancelSleepTimer() {
if (this.isAuto) {
const { value } = await Dialog.confirm({
title: 'Confirm',
message: 'Are you sure you want to disable the auto sleep timer? You will need to enable this again in settings.'
})
if (!value) return
}
await this.$hapticsImpact() await this.$hapticsImpact()
this.$emit('cancel') this.$emit('cancel')
this.show = false this.show = false