From 53428b51ff7a61c51cff0348072011f8b52abb97 Mon Sep 17 00:00:00 2001 From: Maxr1998 Date: Thu, 20 Aug 2020 14:05:18 +0200 Subject: [PATCH] Fix Activity leak --- .../jellyfin/mobile/bridge/NativePlayer.kt | 6 ++-- .../mobile/utils/LifecycleAwareHandler.kt | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/jellyfin/mobile/utils/LifecycleAwareHandler.kt diff --git a/app/src/main/java/org/jellyfin/mobile/bridge/NativePlayer.kt b/app/src/main/java/org/jellyfin/mobile/bridge/NativePlayer.kt index 24f379a8..0e9485db 100644 --- a/app/src/main/java/org/jellyfin/mobile/bridge/NativePlayer.kt +++ b/app/src/main/java/org/jellyfin/mobile/bridge/NativePlayer.kt @@ -2,21 +2,21 @@ package org.jellyfin.mobile.bridge import android.content.Intent import android.os.Handler -import android.os.Looper import android.os.Messenger import android.webkit.JavascriptInterface import org.jellyfin.mobile.WebappActivity import org.jellyfin.mobile.player.ExoPlayerFormats import org.jellyfin.mobile.player.PlayerActivity import org.jellyfin.mobile.utils.Constants +import org.jellyfin.mobile.utils.LifecycleAwareHandler class NativePlayer(private val activity: WebappActivity) { - private val playerMessageHandler = Handler(Looper.getMainLooper()) { message -> + private val playerMessageHandler = LifecycleAwareHandler(activity.lifecycle, Handler.Callback { message -> val function = message.obj as? String if (function != null) activity.loadUrl("javascript:$function") true - } + }) private val webappMessenger = Messenger(playerMessageHandler) @JavascriptInterface diff --git a/app/src/main/java/org/jellyfin/mobile/utils/LifecycleAwareHandler.kt b/app/src/main/java/org/jellyfin/mobile/utils/LifecycleAwareHandler.kt new file mode 100644 index 00000000..b1ce921a --- /dev/null +++ b/app/src/main/java/org/jellyfin/mobile/utils/LifecycleAwareHandler.kt @@ -0,0 +1,28 @@ +package org.jellyfin.mobile.utils + +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.OnLifecycleEvent + +class LifecycleAwareHandler(lifecycle: Lifecycle, callback: Callback) : Handler(Looper.getMainLooper()), LifecycleObserver { + + private var callback: Callback? = when { + lifecycle.currentState >= Lifecycle.State.INITIALIZED -> { + lifecycle.addObserver(this) + callback + } + else -> null + } + + override fun handleMessage(msg: Message) { + callback?.handleMessage(msg) + } + + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestroy() { + callback = null + } +}