mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-09-01 07:30:00 +02:00
Add:Vibrate when sleep timer is extended or reset by shaking #169
This commit is contained in:
parent
4fa6dd2616
commit
2f8ca51447
1 changed files with 41 additions and 14 deletions
|
@ -1,7 +1,7 @@
|
||||||
package com.audiobookshelf.app.player
|
package com.audiobookshelf.app.player
|
||||||
|
|
||||||
import android.os.Handler
|
import android.content.Context
|
||||||
import android.os.Looper
|
import android.os.*
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.concurrent.schedule
|
import kotlin.concurrent.schedule
|
||||||
|
@ -9,9 +9,8 @@ import kotlin.math.roundToInt
|
||||||
|
|
||||||
const val SLEEP_EXTENSION_TIME = 900000L // 15m
|
const val SLEEP_EXTENSION_TIME = 900000L // 15m
|
||||||
|
|
||||||
class SleepTimerManager constructor(playerNotificationService:PlayerNotificationService) {
|
class SleepTimerManager constructor(val playerNotificationService:PlayerNotificationService) {
|
||||||
private val tag = "SleepTimerManager"
|
private val tag = "SleepTimerManager"
|
||||||
private val playerNotificationService:PlayerNotificationService = playerNotificationService
|
|
||||||
|
|
||||||
private var sleepTimerTask:TimerTask? = null
|
private var sleepTimerTask:TimerTask? = null
|
||||||
private var sleepTimerRunning:Boolean = false
|
private var sleepTimerRunning:Boolean = false
|
||||||
|
@ -64,7 +63,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
// Register shake sensor
|
// Register shake sensor
|
||||||
playerNotificationService.registerSensor()
|
playerNotificationService.registerSensor()
|
||||||
|
|
||||||
var currentTime = getCurrentTime()
|
val currentTime = getCurrentTime()
|
||||||
if (isChapterTime) {
|
if (isChapterTime) {
|
||||||
if (currentTime > time) {
|
if (currentTime > time) {
|
||||||
Log.d(tag, "Invalid sleep timer - current time is already passed chapter time $time")
|
Log.d(tag, "Invalid sleep timer - current time is already passed chapter time $time")
|
||||||
|
@ -95,7 +94,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
if (getIsPlaying()) {
|
if (getIsPlaying()) {
|
||||||
sleepTimerElapsed += 1000L
|
sleepTimerElapsed += 1000L
|
||||||
|
|
||||||
var sleepTimeSecondsRemaining = getSleepTimerTimeRemainingSeconds()
|
val sleepTimeSecondsRemaining = getSleepTimerTimeRemainingSeconds()
|
||||||
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) {
|
||||||
|
@ -111,7 +110,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
sleepTimerFinishedAt = System.currentTimeMillis()
|
sleepTimerFinishedAt = System.currentTimeMillis()
|
||||||
} else if (sleepTimeSecondsRemaining <= 30) {
|
} else if (sleepTimeSecondsRemaining <= 30) {
|
||||||
// Start fading out audio
|
// Start fading out audio
|
||||||
var volume = sleepTimeSecondsRemaining / 30F
|
val volume = sleepTimeSecondsRemaining / 30F
|
||||||
Log.d(tag, "SLEEP VOLUME FADE $volume | ${sleepTimeSecondsRemaining}s remaining")
|
Log.d(tag, "SLEEP VOLUME FADE $volume | ${sleepTimeSecondsRemaining}s remaining")
|
||||||
setVolume(volume)
|
setVolume(volume)
|
||||||
}
|
}
|
||||||
|
@ -129,7 +128,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
playerNotificationService.unregisterSensor()
|
playerNotificationService.unregisterSensor()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSleepTimerTime():Long? {
|
fun getSleepTimerTime():Long {
|
||||||
return sleepTimerEndTime
|
return sleepTimerEndTime
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,6 +138,30 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
playerNotificationService.clientEventEmitter?.onSleepTimerSet(0)
|
playerNotificationService.clientEventEmitter?.onSleepTimerSet(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Vibrate when extending sleep timer by shaking
|
||||||
|
private fun vibrate() {
|
||||||
|
val context = playerNotificationService.getContext()
|
||||||
|
val vibrator:Vibrator
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
val vibratorManager =
|
||||||
|
context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
|
||||||
|
vibrator = vibratorManager.defaultVibrator
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
||||||
|
}
|
||||||
|
|
||||||
|
vibrator.let {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
val vibrationEffect = VibrationEffect.createWaveform(longArrayOf(0, 150, 150, 150),-1)
|
||||||
|
it.vibrate(vibrationEffect)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
it.vibrate(10)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun extendSleepTime() {
|
private fun extendSleepTime() {
|
||||||
if (!sleepTimerRunning) return
|
if (!sleepTimerRunning) return
|
||||||
setVolume(1F)
|
setVolume(1F)
|
||||||
|
@ -157,7 +180,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
if (!sleepTimerRunning) {
|
if (!sleepTimerRunning) {
|
||||||
if (sleepTimerFinishedAt <= 0L) return
|
if (sleepTimerFinishedAt <= 0L) return
|
||||||
|
|
||||||
var finishedAtDistance = System.currentTimeMillis() - sleepTimerFinishedAt
|
val finishedAtDistance = System.currentTimeMillis() - sleepTimerFinishedAt
|
||||||
if (finishedAtDistance > SLEEP_TIMER_WAKE_UP_EXPIRATION) // 2 minutes
|
if (finishedAtDistance > SLEEP_TIMER_WAKE_UP_EXPIRATION) // 2 minutes
|
||||||
{
|
{
|
||||||
Log.d(tag, "Sleep timer finished over 2 mins ago, clearing it")
|
Log.d(tag, "Sleep timer finished over 2 mins ago, clearing it")
|
||||||
|
@ -165,14 +188,18 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var newSleepTime = if (sleepTimerExtensionTime >= 0) sleepTimerExtensionTime else SLEEP_EXTENSION_TIME
|
val newSleepTime = if (sleepTimerExtensionTime >= 0) sleepTimerExtensionTime else SLEEP_EXTENSION_TIME
|
||||||
|
vibrate()
|
||||||
setSleepTimer(newSleepTime, false)
|
setSleepTimer(newSleepTime, false)
|
||||||
play()
|
play()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Only extend if within 30 seconds of finishing
|
// Only extend if within 30 seconds of finishing
|
||||||
var sleepTimeRemaining = getSleepTimerTimeRemainingSeconds()
|
val sleepTimeRemaining = getSleepTimerTimeRemainingSeconds()
|
||||||
if (sleepTimeRemaining <= 30) extendSleepTime()
|
if (sleepTimeRemaining <= 30) {
|
||||||
|
vibrate()
|
||||||
|
extendSleepTime()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun handleShake() {
|
fun handleShake() {
|
||||||
|
@ -188,7 +215,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
sleepTimerLength += time
|
sleepTimerLength += time
|
||||||
if (sleepTimerLength + getCurrentTime() > getDuration()) sleepTimerLength = getDuration() - getCurrentTime()
|
if (sleepTimerLength + getCurrentTime() > getDuration()) sleepTimerLength = getDuration() - getCurrentTime()
|
||||||
} else {
|
} else {
|
||||||
var newSleepEndTime = sleepTimerEndTime + time
|
val newSleepEndTime = sleepTimerEndTime + time
|
||||||
sleepTimerEndTime = if (newSleepEndTime >= getDuration()) {
|
sleepTimerEndTime = if (newSleepEndTime >= getDuration()) {
|
||||||
getDuration()
|
getDuration()
|
||||||
} else {
|
} else {
|
||||||
|
@ -209,7 +236,7 @@ class SleepTimerManager constructor(playerNotificationService:PlayerNotification
|
||||||
sleepTimerLength -= time
|
sleepTimerLength -= time
|
||||||
if (sleepTimerLength <= 0) sleepTimerLength = 1000L
|
if (sleepTimerLength <= 0) sleepTimerLength = 1000L
|
||||||
} else {
|
} else {
|
||||||
var newSleepEndTime = sleepTimerEndTime - time
|
val newSleepEndTime = sleepTimerEndTime - time
|
||||||
sleepTimerEndTime = if (newSleepEndTime <= 1000) {
|
sleepTimerEndTime = if (newSleepEndTime <= 1000) {
|
||||||
// End sleep timer in 1 second
|
// End sleep timer in 1 second
|
||||||
getCurrentTime() + 1000
|
getCurrentTime() + 1000
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue