diff --git a/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt b/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt index a4739bb8..4bc3955f 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt @@ -1,14 +1,17 @@ package com.audiobookshelf.app.media +import android.app.Activity import android.content.Context import android.support.v4.media.MediaBrowserCompat import android.util.Log import com.audiobookshelf.app.data.* import com.audiobookshelf.app.device.DeviceManager import com.audiobookshelf.app.server.ApiHandler +import com.getcapacitor.JSObject import java.util.* import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.runBlocking +import org.json.JSONException import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -26,10 +29,35 @@ class MediaManager(var apiHandler: ApiHandler, var ctx: Context) { var serverLibraries = listOf() var serverConfigIdUsed:String? = null + var userSettingsPlaybackRate:Float? = null + fun getIsLibrary(id:String) : Boolean { return serverLibraries.find { it.id == id } != null } + fun getSavedPlaybackRate():Float { + if (userSettingsPlaybackRate != null) { + return userSettingsPlaybackRate ?: 1f + } + + val sharedPrefs = ctx.getSharedPreferences("CapacitorStorage", Activity.MODE_PRIVATE) + if (sharedPrefs != null) { + val userSettingsPref = sharedPrefs.getString("userSettings", null) + if (userSettingsPref != null) { + try { + val userSettings = JSObject(userSettingsPref) + if (userSettings.has("playbackRate")) { + userSettingsPlaybackRate = userSettings.getDouble("playbackRate").toFloat() + return userSettingsPlaybackRate ?: 1f + } + } catch(je:JSONException) { + Log.e(tag, "Failed to parse userSettings JSON ${je.localizedMessage}") + } + } + } + return 1f + } + fun checkResetServerItems() { // When opening android auto need to check if still connected to server // and reset any server data already set @@ -280,19 +308,18 @@ class MediaManager(var apiHandler: ApiHandler, var ctx: Context) { } fun play(libraryItemWrapper:LibraryItemWrapper, episode:PodcastEpisode?, playItemRequestPayload:PlayItemRequestPayload, cb: (PlaybackSession?) -> Unit) { - if (libraryItemWrapper is LocalLibraryItem) { - val localLibraryItem = libraryItemWrapper as LocalLibraryItem - cb(localLibraryItem.getPlaybackSession(episode)) - } else { - val libraryItem = libraryItemWrapper as LibraryItem - apiHandler.playLibraryItem(libraryItem.id,episode?.id ?: "",playItemRequestPayload) { - if (it == null) { - cb(null) - } else { - cb(it) - } - } - } + if (libraryItemWrapper is LocalLibraryItem) { + cb(libraryItemWrapper.getPlaybackSession(episode)) + } else { + val libraryItem = libraryItemWrapper as LibraryItem + apiHandler.playLibraryItem(libraryItem.id,episode?.id ?: "", playItemRequestPayload) { + if (it == null) { + cb(null) + } else { + cb(it) + } + } + } } private fun levenshtein(lhs : CharSequence, rhs : CharSequence) : Int { diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionCallback.kt b/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionCallback.kt index 7593e0f9..4dd5410a 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionCallback.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionCallback.kt @@ -28,8 +28,9 @@ class MediaSessionCallback(var playerNotificationService:PlayerNotificationServi if (it == null) { Log.e(tag, "Failed to play library item") } else { + val playbackRate = playerNotificationService.mediaManager.getSavedPlaybackRate() Handler(Looper.getMainLooper()).post() { - playerNotificationService.preparePlayer(it,true,null) + playerNotificationService.preparePlayer(it,true, playbackRate) } } } @@ -53,8 +54,9 @@ class MediaSessionCallback(var playerNotificationService:PlayerNotificationServi if (it == null) { Log.e(tag, "Failed to play library item") } else { + val playbackRate = playerNotificationService.mediaManager.getSavedPlaybackRate() Handler(Looper.getMainLooper()).post() { - playerNotificationService.preparePlayer(it, true, null) + playerNotificationService.preparePlayer(it, true, playbackRate) } } } @@ -114,8 +116,9 @@ class MediaSessionCallback(var playerNotificationService:PlayerNotificationServi if (it == null) { Log.e(tag, "Failed to play library item") } else { + val playbackRate = playerNotificationService.mediaManager.getSavedPlaybackRate() Handler(Looper.getMainLooper()).post() { - playerNotificationService.preparePlayer(it, true, null) + playerNotificationService.preparePlayer(it, true, playbackRate) } } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionPlaybackPreparer.kt b/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionPlaybackPreparer.kt index 33381e07..536f600a 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionPlaybackPreparer.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/MediaSessionPlaybackPreparer.kt @@ -34,8 +34,9 @@ class MediaSessionPlaybackPreparer(var playerNotificationService:PlayerNotificat if (it == null) { Log.e(tag, "Failed to play library item") } else { + val playbackRate = playerNotificationService.mediaManager.getSavedPlaybackRate() Handler(Looper.getMainLooper()).post() { - playerNotificationService.preparePlayer(it, playWhenReady, null) + playerNotificationService.preparePlayer(it, playWhenReady, playbackRate) } } } @@ -61,8 +62,9 @@ class MediaSessionPlaybackPreparer(var playerNotificationService:PlayerNotificat if (it == null) { Log.e(tag, "Failed to play library item") } else { + val playbackRate = playerNotificationService.mediaManager.getSavedPlaybackRate() Handler(Looper.getMainLooper()).post() { - playerNotificationService.preparePlayer(it, playWhenReady, null) + playerNotificationService.preparePlayer(it, playWhenReady, playbackRate) } } } @@ -76,8 +78,9 @@ class MediaSessionPlaybackPreparer(var playerNotificationService:PlayerNotificat if (it == null) { Log.e(tag, "Failed to play library item") } else { + val playbackRate = playerNotificationService.mediaManager.getSavedPlaybackRate() Handler(Looper.getMainLooper()).post() { - playerNotificationService.preparePlayer(it, playWhenReady, null) + playerNotificationService.preparePlayer(it, playWhenReady, playbackRate) } } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt b/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt index 722032b1..80846d85 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt @@ -1,7 +1,6 @@ package com.audiobookshelf.app.server import android.content.Context -import android.content.SharedPreferences import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.util.Log @@ -29,8 +28,6 @@ class ApiHandler(var ctx:Context) { private var pingClient = OkHttpClient.Builder().callTimeout(3, TimeUnit.SECONDS).build() var jacksonMapper = jacksonObjectMapper().enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature()) - var storageSharedPreferences: SharedPreferences? = null - data class LocalMediaProgressSyncPayload(val localMediaProgress:List) @JsonIgnoreProperties(ignoreUnknown = true) data class MediaProgressSyncResponsePayload(val numServerProgressUpdates:Int, val localProgressUpdates:List)