diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt index 53d5e6a2..7457da41 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt @@ -887,16 +887,18 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { fun closePlayback(calledOnError:Boolean? = false) { Log.d(tag, "closePlayback") + val config = DeviceManager.serverConnectionConfig + val isLocal = mediaProgressSyncer.currentIsLocal val currentSessionId = mediaProgressSyncer.currentSessionId if (mediaProgressSyncer.listeningTimerRunning) { Log.i(tag, "About to close playback so stopping media progress syncer first") + mediaProgressSyncer.stop(calledOnError == false) { // If closing on error then do not sync progress (causes exception) Log.d(tag, "Media Progress syncer stopped") - // If not local session then close on server if (!isLocal && currentSessionId != "") { - apiHandler.closePlaybackSession(currentSessionId) { + apiHandler.closePlaybackSession(currentSessionId, config) { Log.d(tag, "Closed playback session $currentSessionId") } } @@ -904,7 +906,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { } else { // If not local session then close on server if (!isLocal && currentSessionId != "") { - apiHandler.closePlaybackSession(currentSessionId) { + apiHandler.closePlaybackSession(currentSessionId, config) { Log.d(tag, "Closed playback session $currentSessionId") } } 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 ff8ed6b5..5b4d1620 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 @@ -44,10 +44,17 @@ class ApiHandler(var ctx:Context) { val address = config?.address ?: DeviceManager.serverAddress val token = config?.token ?: DeviceManager.token - val request = Request.Builder() - .url("${address}$endpoint").addHeader("Authorization", "Bearer $token") - .build() - makeRequest(request, httpClient, cb) + try { + val request = Request.Builder() + .url("${address}$endpoint").addHeader("Authorization", "Bearer $token") + .build() + makeRequest(request, httpClient, cb) + } catch(e: Exception) { + e.printStackTrace() + val jsobj = JSObject() + jsobj.put("error", "Request failed: ${e.message}") + cb(jsobj) + } } private fun postRequest(endpoint:String, payload: JSObject?, config:ServerConnectionConfig?, cb: (JSObject) -> Unit) { @@ -57,23 +64,38 @@ class ApiHandler(var ctx:Context) { val requestBody = payload?.toString()?.toRequestBody(mediaType) ?: EMPTY_REQUEST val requestUrl = "${address}$endpoint" Log.d(tag, "postRequest to $requestUrl") - val request = Request.Builder().post(requestBody) - .url(requestUrl).addHeader("Authorization", "Bearer ${token}") - .build() - makeRequest(request, null, cb) + try { + val request = Request.Builder().post(requestBody) + .url(requestUrl).addHeader("Authorization", "Bearer ${token}") + .build() + makeRequest(request, null, cb) + } catch(e: Exception) { + e.printStackTrace() + val jsobj = JSObject() + jsobj.put("error", "Request failed: ${e.message}") + cb(jsobj) + } } private fun patchRequest(endpoint:String, payload: JSObject, cb: (JSObject) -> Unit) { val mediaType = "application/json; charset=utf-8".toMediaType() val requestBody = payload.toString().toRequestBody(mediaType) - val request = Request.Builder().patch(requestBody) - .url("${DeviceManager.serverAddress}$endpoint").addHeader("Authorization", "Bearer ${DeviceManager.token}") - .build() - makeRequest(request, null, cb) + try { + val request = Request.Builder().patch(requestBody) + .url("${DeviceManager.serverAddress}$endpoint").addHeader("Authorization", "Bearer ${DeviceManager.token}") + .build() + makeRequest(request, null, cb) + } catch(e: Exception) { + e.printStackTrace() + val jsobj = JSObject() + jsobj.put("error", "Request failed: ${e.message}") + cb(jsobj) + } } private fun makeRequest(request:Request, httpClient:OkHttpClient?, cb: (JSObject) -> Unit) { val client = httpClient ?: defaultClient + client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { Log.d(tag, "FAILURE TO CONNECT") @@ -297,9 +319,9 @@ class ApiHandler(var ctx:Context) { } } - fun closePlaybackSession(playbackSessionId:String, cb: (Boolean) -> Unit) { + fun closePlaybackSession(playbackSessionId:String, config:ServerConnectionConfig?, cb: (Boolean) -> Unit) { Log.d(tag, "closePlaybackSession: playbackSessionId=$playbackSessionId") - postRequest("/api/session/$playbackSessionId/close", null, null) { + postRequest("/api/session/$playbackSessionId/close", null, config) { cb(true) } } diff --git a/components/app/SideDrawer.vue b/components/app/SideDrawer.vue index b4a308dd..a2724997 100644 --- a/components/app/SideDrawer.vue +++ b/components/app/SideDrawer.vue @@ -171,6 +171,10 @@ export default { }, async logout() { if (this.user) { + if (this.$store.getters['getIsPlayerOpen']) { + this.$eventBus.$emit('close-stream') + } + await this.$nativeHttp.post('/logout').catch((error) => { console.error('Failed to logout', error) }) diff --git a/components/readers/Reader.vue b/components/readers/Reader.vue index 63e53beb..80acd083 100644 --- a/components/readers/Reader.vue +++ b/components/readers/Reader.vue @@ -143,8 +143,6 @@ export default { this.comicHasMetadata = false this.registerListeners() this.hideToolbar() - - console.log('showReader for ebookFile', JSON.stringify(this.ebookFile)) } else { this.unregisterListeners() this.$showHideStatusBar(true) @@ -435,7 +433,9 @@ export default { await VolumeButtons.watchVolume(options, this.volumePressed) } } else if (isWatching.value) { - await VolumeButtons.clearWatch() + await VolumeButtons.clearWatch().catch((error) => { + console.error('Failed to clear volume watch', error) + }) } this.isInittingWatchVolume = false @@ -450,7 +450,9 @@ export default { this.$eventBus.$on('close-ebook', this.closeEvt) document.body.removeEventListener('touchstart', this.touchstart) document.body.removeEventListener('touchend', this.touchend) - VolumeButtons.clearWatch() + VolumeButtons.clearWatch().catch((error) => { + console.error('Failed to clear volume watch', error) + }) }, volumePressed(e) { if (this.ereaderSettings.navigateWithVolume == 'enabled') { diff --git a/layouts/default.vue b/layouts/default.vue index 45107c81..135df4ce 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -177,10 +177,6 @@ export default { } } }, - userLoggedOut() { - // Only cancels stream if streamining not playing downloaded - this.$eventBus.$emit('close-stream') - }, socketConnectionFailed(err) { this.$toast.error('Socket connection error: ' + err.message) },