diff --git a/android/app/build.gradle b/android/app/build.gradle
index 069a1102..f3240f4d 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -13,8 +13,8 @@ android {
applicationId "com.audiobookshelf.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 30
- versionName "0.9.14-beta"
+ versionCode 31
+ versionName "0.9.15-beta"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
diff --git a/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt b/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt
index d51827f9..dce50c76 100644
--- a/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt
+++ b/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt
@@ -123,8 +123,8 @@ class MainActivity : BridgeActivity() {
storageHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
- override fun onUserInteraction() {
- super.onUserInteraction()
- Log.d(tag, "USER INTERACTION")
- }
+// override fun onUserInteraction() {
+// super.onUserInteraction()
+// Log.d(tag, "USER INTERACTION")
+// }
}
diff --git a/android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt b/android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt
index ac08489e..69b537de 100644
--- a/android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt
+++ b/android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt
@@ -37,8 +37,8 @@ class MyNativeAudio : Plugin() {
jsobj.put("playWhenReady", playWhenReady)
notifyListeners("onPrepareMedia", jsobj)
}
- override fun onSleepTimerEnded() {
- emit("onSleepTimerEnded", true)
+ override fun onSleepTimerEnded(currentPosition:Long) {
+ emit("onSleepTimerEnded", currentPosition)
}
})
}
@@ -209,10 +209,15 @@ class MyNativeAudio : Plugin() {
@PluginMethod
fun setSleepTimer(call: PluginCall) {
- var sleepTimeout:Long = call.getString("timeout", "360000")!!.toLong()
+ var time:Long = call.getString("time", "360000")!!.toLong()
+ var isChapterTime:Boolean = call.getBoolean("isChapterTime", false) == true
- playerNotificationService.setSleepTimer(sleepTimeout)
- call.resolve()
+ Handler(Looper.getMainLooper()).post() {
+ var success:Boolean = playerNotificationService.setSleepTimer(time, isChapterTime)
+ val ret = JSObject()
+ ret.put("success", success)
+ call.resolve(ret)
+ }
}
@PluginMethod
diff --git a/android/app/src/main/java/com/audiobookshelf/app/PlayerNotificationService.kt b/android/app/src/main/java/com/audiobookshelf/app/PlayerNotificationService.kt
index 1ea52118..81bf3f8c 100644
--- a/android/app/src/main/java/com/audiobookshelf/app/PlayerNotificationService.kt
+++ b/android/app/src/main/java/com/audiobookshelf/app/PlayerNotificationService.kt
@@ -51,7 +51,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
fun onPlayingUpdate(isPlaying: Boolean)
fun onMetadata(metadata: JSObject)
fun onPrepare(audiobookId:String, playWhenReady:Boolean)
- fun onSleepTimerEnded()
+ fun onSleepTimerEnded(currentPosition:Long)
}
private val tag = "PlayerService"
@@ -86,6 +86,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
private var onSeekBack: Boolean = false
private var sleepTimerTask:TimerTask? = null
+ private var sleepChapterTime:Long = 0L
fun setCustomObjectListener(mylistener: MyCustomObjectListener) {
listener = mylistener
@@ -722,20 +723,45 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
}
}
- fun setSleepTimer(timeout:Long) {
- Log.d(tag, "Setting Sleep Timer for $timeout")
-
+ fun setSleepTimer(time:Long, isChapterTime:Boolean) : Boolean {
+ Log.d(tag, "Setting Sleep Timer for $time is chapter time $isChapterTime")
sleepTimerTask?.cancel()
- sleepTimerTask = Timer("SleepTimer",false).schedule(timeout) {
- Log.d(tag, "Sleep Timer Done")
- Handler(Looper.getMainLooper()).post() {
- if (mPlayer.isPlaying) {
- Log.d(tag, "Sleep Timer Pausing Player")
- mPlayer.pause()
+ sleepChapterTime = 0L
+
+ if (isChapterTime) {
+ // Validate time
+ if (mPlayer.isPlaying) {
+ if (mPlayer.currentPosition >= time) {
+ Log.d(tag, "Invalid setSleepTimer chapter time is already passed")
+ return false
+ }
+ }
+
+ sleepChapterTime = time
+ sleepTimerTask = Timer("SleepTimer",false).schedule(0L, 1000L) {
+ Handler(Looper.getMainLooper()).post() {
+ if (mPlayer.isPlaying && mPlayer.currentPosition > sleepChapterTime) {
+ Log.d(tag, "Sleep Timer Pausing Player on Chapter")
+ mPlayer.pause()
+
+ if (listener != null) listener.onSleepTimerEnded(mPlayer.currentPosition)
+ sleepTimerTask?.cancel()
+ }
+ }
+ }
+ } else {
+ sleepTimerTask = Timer("SleepTimer",false).schedule(time) {
+ Log.d(tag, "Sleep Timer Done")
+ Handler(Looper.getMainLooper()).post() {
+ if (mPlayer.isPlaying) {
+ Log.d(tag, "Sleep Timer Pausing Player")
+ mPlayer.pause()
+ }
+ if (listener != null) listener.onSleepTimerEnded(mPlayer.currentPosition)
}
- if (listener != null) listener.onSleepTimerEnded()
}
}
+ return true
}
fun getSleepTimerTime():Long? {
@@ -748,6 +774,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
Log.d(tag, "Canceling Sleep Timer")
sleepTimerTask?.cancel()
sleepTimerTask = null
+ sleepChapterTime = 0L
}
}
diff --git a/components/AudioPlayerMini.vue b/components/AudioPlayerMini.vue
index 406cded2..34581fdf 100644
--- a/components/AudioPlayerMini.vue
+++ b/components/AudioPlayerMini.vue
@@ -33,7 +33,8 @@
{{ Math.ceil(sleepTimeoutCurrentTime / 1000 / 60) }}m
+EOC
+{{ Math.ceil(sleepTimeoutCurrentTime / 1000 / 60) }}m
{{ timeRemainingPretty }}
+EOC: {{ endOfChapterTimePretty }}
+{{ timeRemainingPretty }}