@@ -18,10 +18,7 @@ import android.content.Intent
1818import android.content.res.Configuration
1919import android.content.res.Resources
2020import android.net.Uri
21- import android.os.AsyncTask
2221import android.os.Bundle
23- import android.os.Handler
24- import android.os.Looper
2522import android.view.LayoutInflater
2623import android.view.Menu
2724import android.view.MenuInflater
@@ -37,6 +34,7 @@ import androidx.core.view.MenuHost
3734import androidx.core.view.MenuProvider
3835import androidx.drawerlayout.widget.DrawerLayout
3936import androidx.lifecycle.Lifecycle
37+ import androidx.lifecycle.lifecycleScope
4038import androidx.media3.common.MediaItem
4139import androidx.media3.common.Player
4240import androidx.media3.common.util.UnstableApi
@@ -58,7 +56,6 @@ import com.nextcloud.ui.fileactions.FileActionsBottomSheet.Companion.newInstance
5856import com.nextcloud.utils.extensions.getParcelableArgument
5957import com.nextcloud.utils.extensions.getTypedActivity
6058import com.nextcloud.utils.extensions.logFileSize
61- import com.owncloud.android.MainApp
6259import com.owncloud.android.R
6360import com.owncloud.android.databinding.FragmentPreviewMediaBinding
6461import com.owncloud.android.datamodel.OCFile
@@ -71,8 +68,9 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment
7168import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment
7269import com.owncloud.android.ui.fragment.FileFragment
7370import com.owncloud.android.utils.MimeTypeUtil
74- import java.lang.ref.WeakReference
75- import java.util.concurrent.Executors
71+ import kotlinx.coroutines.Dispatchers
72+ import kotlinx.coroutines.launch
73+ import kotlinx.coroutines.withContext
7674import javax.inject.Inject
7775
7876/* *
@@ -222,27 +220,30 @@ class PreviewMediaFragment :
222220 Log_OC .d(TAG , " File is null or fragment not attached to a context." )
223221 return
224222 }
225- prepareForVideo(context ? : MainApp .getAppContext() )
223+ prepareForVideo()
226224 }
227225
228226 @Suppress(" DEPRECATION" , " TooGenericExceptionCaught" )
229- private fun prepareForVideo (context : Context ) {
227+ private fun prepareForVideo () {
230228 if (exoPlayer != null ) {
231229 playVideo()
232- } else {
233- val handler = Handler (Looper .getMainLooper())
234- Executors .newSingleThreadExecutor().execute {
235- try {
236- nextcloudClient = clientFactory.createNextcloudClient(accountManager.user)
237- handler.post {
238- nextcloudClient?.let { client ->
239- createExoPlayer(context, client)
240- playVideo()
241- }
242- }
243- } catch (e: CreationException ) {
244- handler.post { Log_OC .e(TAG , " error setting up ExoPlayer" , e) }
230+ return
231+ }
232+
233+ lifecycleScope.launch {
234+ try {
235+ val client = withContext(Dispatchers .IO ) {
236+ clientFactory.createNextcloudClient(accountManager.user)
245237 }
238+ nextcloudClient = client
239+ val ctx = this @PreviewMediaFragment.context ? : return @launch
240+
241+ withContext(Dispatchers .Main ) {
242+ createExoPlayer(ctx, client)
243+ playVideo()
244+ }
245+ } catch (e: CreationException ) {
246+ Log_OC .e(TAG , " error setting up ExoPlayer" , e)
246247 }
247248 }
248249 }
@@ -253,9 +254,8 @@ class PreviewMediaFragment :
253254 val listener = ExoplayerListener (context, binding.exoplayerView, it) { goBackToLivePhoto() }
254255 it.addListener(listener)
255256 }
256- // session id needs to be unique since this fragment is used in viewpager multiple fragments can exist at a time
257257 mediaSession = MediaSession .Builder (
258- requireContext() ,
258+ context ,
259259 exoPlayer as Player
260260 ).setId(System .currentTimeMillis().toString()).build()
261261 }
@@ -408,21 +408,48 @@ class PreviewMediaFragment :
408408 @Suppress(" TooGenericExceptionCaught" )
409409 private fun playVideo () {
410410 setupVideoView()
411- // load the video file in the video player
412- // when done, VideoHelper#onPrepared() will be called
413411 if (file.isDown) {
414412 playVideoUri(file.storageUri)
415- } else {
413+ return
414+ }
415+
416+ lifecycleScope.launch {
416417 try {
417- LoadStreamUrl (this , user, clientFactory).execute(
418- file.localId
419- )
418+ val uri = withContext(Dispatchers .IO ) {
419+ loadStreamUrl(user, clientFactory, file.localId)
420+ }
421+ if (uri != null ) {
422+ videoUri = uri
423+ playVideoUri(uri)
424+ } else {
425+ emptyListView?.visibility = View .VISIBLE
426+ setVideoErrorMessage(getString(R .string.stream_not_possible_headline))
427+ }
420428 } catch (e: Exception ) {
421429 Log_OC .e(TAG , " Loading stream url not possible: $e " )
422430 }
423431 }
424432 }
425433
434+
435+ private fun loadStreamUrl (user : User ? , clientFactory : ClientFactory ? , fileId : Long ): Uri ? {
436+ val client: OwnCloudClient ? = try {
437+ clientFactory?.create(user)
438+ } catch (e: CreationException ) {
439+ Log_OC .e(TAG , " Loading stream url not possible: $e " )
440+ return null
441+ }
442+
443+ val sfo = StreamMediaFileOperation (fileId)
444+ val result = sfo.execute(client)
445+
446+ if (result?.isSuccess == false ) {
447+ return null
448+ }
449+
450+ return (result?.data?.get(0 ) as String ).toUri()
451+ }
452+
426453 private fun playVideoUri (uri : Uri ) {
427454 binding.progress.visibility = View .GONE
428455
@@ -438,56 +465,6 @@ class PreviewMediaFragment :
438465 autoplay = false
439466 }
440467
441- @Suppress(" DEPRECATION" , " ReturnCount" )
442- private class LoadStreamUrl (
443- previewMediaFragment : PreviewMediaFragment ,
444- private val user : User ? ,
445- private val clientFactory : ClientFactory ?
446- ) : AsyncTask<Long?, Void?, Uri?>() {
447- private val previewMediaFragmentWeakReference = WeakReference (previewMediaFragment)
448-
449- @Deprecated(" Deprecated in Java" )
450- override fun doInBackground (vararg fileId : Long? ): Uri ? {
451- val client: OwnCloudClient ?
452- try {
453- client = clientFactory?.create(user)
454- } catch (e: CreationException ) {
455- Log_OC .e(TAG , " Loading stream url not possible: $e " )
456- return null
457- }
458-
459- val sfo = fileId[0 ]?.let { StreamMediaFileOperation (it) }
460- val result = sfo?.execute(client)
461-
462- if (result?.isSuccess == false ) {
463- return null
464- }
465-
466- return (result?.data?.get(0 ) as String ).toUri()
467- }
468-
469- @Deprecated(" Deprecated in Java" )
470- override fun onPostExecute (uri : Uri ? ) {
471- val previewMediaFragment = previewMediaFragmentWeakReference.get()
472- val context = previewMediaFragment?.context
473-
474- if (previewMediaFragment?.binding == null || context == null ) {
475- Log_OC .e(TAG , " Error streaming file: no previewMediaFragment!" )
476- return
477- }
478-
479- previewMediaFragment.run {
480- if (uri != null ) {
481- videoUri = uri
482- playVideoUri(uri)
483- } else {
484- emptyListView?.visibility = View .VISIBLE
485- setVideoErrorMessage(getString(R .string.stream_not_possible_headline))
486- }
487- }
488- }
489- }
490-
491468 override fun onStop () {
492469 releaseVideoPlayer()
493470 super .onStop()
0 commit comments