ソースを参照

release background session if exists

Signed-off-by: parneet-guraya <gurayaparneet@gmail.com>
parneet-guraya 10 ヶ月 前
コミット
fb6f80aa7c

+ 27 - 8
app/src/main/java/com/nextcloud/client/media/BackgroundPlayerService.kt

@@ -7,7 +7,10 @@
 
 package com.nextcloud.client.media
 
+import android.content.BroadcastReceiver
+import android.content.Context
 import android.content.Intent
+import android.content.IntentFilter
 import androidx.media3.exoplayer.ExoPlayer
 import androidx.media3.session.MediaSession
 import androidx.media3.session.MediaSessionService
@@ -16,7 +19,9 @@ import com.nextcloud.client.di.Injectable
 import com.nextcloud.client.media.NextcloudExoPlayer.createNextcloudExoplayer
 import com.nextcloud.client.network.ClientFactory
 import com.nextcloud.common.NextcloudClient
+import com.nextcloud.utils.extensions.registerBroadcastReceiver
 import com.owncloud.android.MainApp
+import com.owncloud.android.datamodel.ReceiverFlag
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
@@ -32,8 +37,21 @@ class BackgroundPlayerService : MediaSessionService(), Injectable {
     lateinit var exoPlayer: ExoPlayer
     private var mediaSession: MediaSession? = null
 
+    private val stopReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent?) {
+            release()
+        }
+    }
+
     override fun onCreate() {
         super.onCreate()
+
+        registerBroadcastReceiver(
+            stopReceiver,
+            IntentFilter(STOP_MEDIA_SESSION_BROADCAST_ACTION),
+            ReceiverFlag.NotExported
+        )
+
         MainApp.getAppComponent().inject(this)
         initNextcloudExoPlayer()
     }
@@ -47,34 +65,35 @@ class BackgroundPlayerService : MediaSessionService(), Injectable {
             nextcloudClient?.let {
                 exoPlayer = createNextcloudExoplayer(this@BackgroundPlayerService, nextcloudClient)
                 mediaSession =
-                    MediaSession.Builder(applicationContext, exoPlayer).setCallback(object : MediaSession.Callback {
-                        override fun onDisconnected(session: MediaSession, controller: MediaSession.ControllerInfo) {
-                            stopSelf()
-                        }
-                    }).build()
+                    MediaSession.Builder(applicationContext, exoPlayer).build()
             }
         }
     }
 
     override fun onTaskRemoved(rootIntent: Intent?) {
+        unregisterReceiver(stopReceiver)
         val player = mediaSession?.player
         if (player!!.playWhenReady) {
             // Make sure the service is not in foreground.
             player.pause()
         }
-        stopSelf()
+        release()
     }
 
-    override fun onDestroy() {
+    private fun release() {
         mediaSession?.run {
             player.release()
             release()
             mediaSession = null
         }
-        super.onDestroy()
+        stopSelf()
     }
 
     override fun onGetSession(p0: MediaSession.ControllerInfo): MediaSession? {
         return mediaSession
     }
+
+    companion object {
+        const val STOP_MEDIA_SESSION_BROADCAST_ACTION = "com.nextcloud.client.media.STOP_MEDIA_SESSION"
+    }
 }

+ 13 - 5
app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt

@@ -24,6 +24,7 @@ import android.os.Build
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
+import android.util.Log
 import android.view.Menu
 import android.view.MenuItem
 import android.view.View
@@ -149,6 +150,15 @@ class PreviewMediaActivity :
         WindowCompat.setDecorFitsSystemWindows(window, false)
         applyWindowInsets()
         initArguments(savedInstanceState)
+
+        if(MimeTypeUtil.isVideo(file)){
+            // release any background media session if exists
+            val intent = Intent(BackgroundPlayerService.STOP_MEDIA_SESSION_BROADCAST_ACTION).apply {
+                setPackage(packageName)
+            }
+            sendBroadcast(intent)
+        }
+
         showMediaTypeViews()
         configureSystemBars()
         emptyListView = binding.emptyView.emptyListView
@@ -242,7 +252,7 @@ class PreviewMediaActivity :
     private fun hideProgressLayout() {
         binding.progress.visibility = View.GONE
         binding.audioControllerView.visibility = View.VISIBLE
-        binding.emptyView.emptyListView.visibility = View.VISIBLE
+        // binding.emptyView.emptyListView.visibility = View.VISIBLE
     }
 
     private fun setVideoErrorMessage(headline: String, @StringRes message: Int) {
@@ -361,7 +371,7 @@ class PreviewMediaActivity :
                     playAudio()
                     binding.audioControllerView.setMediaPlayer(audioMediaController)
                 } catch (e: Exception) {
-                    println("exception raised while getting the media controller ${e.message}")
+                    Log_OC.e(TAG,"exception raised while getting the media controller ${e.message}")
                 }
             },
             MoreExecutors.directExecutor()
@@ -385,7 +395,7 @@ class PreviewMediaActivity :
             audioPlayer.addListener(object : Player.Listener {
 
                 override fun onPlaybackStateChanged(playbackState: Int) {
-                    if(playbackState == Player.STATE_READY){
+                    if (playbackState == Player.STATE_READY) {
                         hideProgressLayout()
                     }
                 }
@@ -408,7 +418,6 @@ class PreviewMediaActivity :
 
     private fun releaseAudioPlayer() {
         audioMediaController?.let { audioPlayer ->
-            audioPlayer.stop()
             audioPlayer.release()
         }
         audioMediaController = null
@@ -474,7 +483,6 @@ class PreviewMediaActivity :
         }
     }
 
-
     override fun onCreateOptionsMenu(menu: Menu?): Boolean {
         menuInflater.inflate(R.menu.custom_menu_placeholder, menu)
         return true

+ 9 - 1
app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.kt

@@ -46,6 +46,7 @@ import com.nextcloud.client.account.UserAccountManager
 import com.nextcloud.client.di.Injectable
 import com.nextcloud.client.jobs.BackgroundJobManager
 import com.nextcloud.client.jobs.download.FileDownloadHelper.Companion.instance
+import com.nextcloud.client.media.BackgroundPlayerService
 import com.nextcloud.client.media.ExoplayerListener
 import com.nextcloud.client.media.NextcloudExoPlayer.createNextcloudExoplayer
 import com.nextcloud.client.network.ClientFactory
@@ -122,6 +123,12 @@ class PreviewMediaFragment : FileFragment(), OnTouchListener, Injectable {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        // release any background media session if exists
+        val intent = Intent(BackgroundPlayerService.STOP_MEDIA_SESSION_BROADCAST_ACTION).apply {
+            setPackage(requireActivity().packageName)
+        }
+        requireActivity().sendBroadcast(intent)
+
         arguments?.let {
             initArguments(it)
         }
@@ -246,7 +253,8 @@ class PreviewMediaFragment : FileFragment(), OnTouchListener, Injectable {
             val listener = ExoplayerListener(context, binding.exoplayerView, it) { goBackToLivePhoto() }
             it.addListener(listener)
         }
-        mediaSession = MediaSession.Builder(requireContext(),exoPlayer as Player).build()
+        // session id needs to be unique since this fragment is used in viewpager multiple fragments can exist at a time
+        mediaSession = MediaSession.Builder(requireContext(),exoPlayer as Player).setId(System.currentTimeMillis().toString()).build()
     }
 
     private fun releaseVideoPlayer() {