[Android] Clear callbacks on delegates/models death

Geoffrey Métais git at videolan.org
Sun Jun 28 16:51:44 CEST 2020


vlc-android | branch: master | Geoffrey Métais <geoffrey.metais at gmail.com> | Fri Jun 19 18:16:44 2020 +0200| [1a68b25fc7b5714279406bf6f459e0c6758b147d] | committer: Jean-Baptiste Kempf

Clear callbacks on delegates/models death

> https://code.videolan.org/videolan/vlc-android/commit/1a68b25fc7b5714279406bf6f459e0c6758b147d
---

 .../src/main/java/org/videolan/television/ui/NowPlayingDelegate.kt   | 5 ++++-
 .../vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt     | 5 ++++-
 .../vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt      | 5 ++++-
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/application/television/src/main/java/org/videolan/television/ui/NowPlayingDelegate.kt b/application/television/src/main/java/org/videolan/television/ui/NowPlayingDelegate.kt
index 1586a8b55..873fb8acc 100644
--- a/application/television/src/main/java/org/videolan/television/ui/NowPlayingDelegate.kt
+++ b/application/television/src/main/java/org/videolan/television/ui/NowPlayingDelegate.kt
@@ -27,6 +27,7 @@ import androidx.lifecycle.viewModelScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onCompletion
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
 import org.videolan.libvlc.MediaPlayer
@@ -44,7 +45,9 @@ class NowPlayingDelegate(private val model: MainTvModel): PlaybackService.Callba
 
     init {
         PlaylistManager.showAudioPlayer.observeForever(nowPlayingObserver)
-        PlaybackService.serviceFlow.onEach { onServiceChanged(it) }.launchIn(model.viewModelScope)
+        PlaybackService.serviceFlow.onEach { onServiceChanged(it) }
+                .onCompletion { service?.removeCallback(this at NowPlayingDelegate) }
+                .launchIn(model.viewModelScope)
     }
 
     fun onClear() {
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
index 993146d6d..b496fdfb3 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
@@ -27,6 +27,7 @@ import androidx.lifecycle.*
 import kotlinx.coroutines.*
 import kotlinx.coroutines.channels.actor
 import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onCompletion
 import kotlinx.coroutines.flow.onEach
 import org.videolan.medialibrary.Tools
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
@@ -61,7 +62,9 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
     }
 
     init {
-        PlaybackService.serviceFlow.onEach { onServiceChanged(it) }.launchIn(viewModelScope)
+        PlaybackService.serviceFlow.onEach { onServiceChanged(it) }
+                .onCompletion { onServiceChanged(null) }
+                .launchIn(viewModelScope)
     }
 
     private fun setup(service: PlaybackService) {
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
index 9eccf3bfc..e28c6bf0e 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/StreamsModel.kt
@@ -27,6 +27,7 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onCompletion
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
@@ -48,7 +49,9 @@ class StreamsModel(context: Context, private val showDummy: Boolean = false, cor
 
     init {
         if (medialibrary.isStarted) refresh()
-        PlaybackService.serviceFlow.onEach { onServiceChanged(it) }.launchIn(viewModelScope)
+        PlaybackService.serviceFlow.onEach { onServiceChanged(it) }
+                .onCompletion { onServiceChanged(null) }
+                .launchIn(viewModelScope)
     }
 
     override suspend fun updateList() {



More information about the Android mailing list