@@ -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/* *
@@ -229,27 +227,30 @@ class PreviewMediaFragment :
229227 Log_OC .d(TAG , " File is null or fragment not attached to a context." )
230228 return
231229 }
232- prepareForVideo(context ? : MainApp .getAppContext() )
230+ prepareForVideo()
233231 }
234232
235233 @Suppress(" DEPRECATION" , " TooGenericExceptionCaught" )
236- private fun prepareForVideo (context : Context ) {
234+ private fun prepareForVideo () {
237235 if (exoPlayer != null ) {
238236 playVideo()
239- } else {
240- val handler = Handler (Looper .getMainLooper())
241- Executors .newSingleThreadExecutor().execute {
242- try {
243- nextcloudClient = clientFactory.createNextcloudClient(accountManager.user)
244- handler.post {
245- nextcloudClient?.let { client ->
246- createExoPlayer(context, client)
247- playVideo()
248- }
249- }
250- } catch (e: CreationException ) {
251- handler.post { Log_OC .e(TAG , " error setting up ExoPlayer" , e) }
237+ return
238+ }
239+
240+ lifecycleScope.launch {
241+ try {
242+ val client = withContext(Dispatchers .IO ) {
243+ clientFactory.createNextcloudClient(accountManager.user)
252244 }
245+ nextcloudClient = client
246+ val ctx = this @PreviewMediaFragment.context ? : return @launch
247+
248+ withContext(Dispatchers .Main ) {
249+ createExoPlayer(ctx, client)
250+ playVideo()
251+ }
252+ } catch (e: CreationException ) {
253+ Log_OC .e(TAG , " error setting up ExoPlayer" , e)
253254 }
254255 }
255256 }
@@ -260,9 +261,8 @@ class PreviewMediaFragment :
260261 val listener = ExoplayerListener (context, binding.exoplayerView, it) { goBackToLivePhoto() }
261262 it.addListener(listener)
262263 }
263- // session id needs to be unique since this fragment is used in viewpager multiple fragments can exist at a time
264264 mediaSession = MediaSession .Builder (
265- requireContext() ,
265+ context ,
266266 exoPlayer as Player
267267 ).setId(System .currentTimeMillis().toString()).build()
268268 }
@@ -415,21 +415,48 @@ class PreviewMediaFragment :
415415 @Suppress(" TooGenericExceptionCaught" )
416416 private fun playVideo () {
417417 setupVideoView()
418- // load the video file in the video player
419- // when done, VideoHelper#onPrepared() will be called
420418 if (file.isDown) {
421419 playVideoUri(file.storageUri)
422- } else {
420+ return
421+ }
422+
423+ lifecycleScope.launch {
423424 try {
424- LoadStreamUrl (this , user, clientFactory).execute(
425- file.localId
426- )
425+ val uri = withContext(Dispatchers .IO ) {
426+ loadStreamUrl(user, clientFactory, file.localId)
427+ }
428+ if (uri != null ) {
429+ videoUri = uri
430+ playVideoUri(uri)
431+ } else {
432+ emptyListView?.visibility = View .VISIBLE
433+ setVideoErrorMessage(getString(R .string.stream_not_possible_headline))
434+ }
427435 } catch (e: Exception ) {
428436 Log_OC .e(TAG , " Loading stream url not possible: $e " )
429437 }
430438 }
431439 }
432440
441+
442+ private fun loadStreamUrl (user : User ? , clientFactory : ClientFactory ? , fileId : Long ): Uri ? {
443+ val client: OwnCloudClient ? = try {
444+ clientFactory?.create(user)
445+ } catch (e: CreationException ) {
446+ Log_OC .e(TAG , " Loading stream url not possible: $e " )
447+ return null
448+ }
449+
450+ val sfo = StreamMediaFileOperation (fileId)
451+ val result = sfo.execute(client)
452+
453+ if (result?.isSuccess == false ) {
454+ return null
455+ }
456+
457+ return (result?.data?.get(0 ) as String ).toUri()
458+ }
459+
433460 private fun playVideoUri (uri : Uri ) {
434461 binding.progress.visibility = View .GONE
435462
@@ -445,56 +472,6 @@ class PreviewMediaFragment :
445472 autoplay = false
446473 }
447474
448- @Suppress(" DEPRECATION" , " ReturnCount" )
449- private class LoadStreamUrl (
450- previewMediaFragment : PreviewMediaFragment ,
451- private val user : User ? ,
452- private val clientFactory : ClientFactory ?
453- ) : AsyncTask<Long?, Void?, Uri?>() {
454- private val previewMediaFragmentWeakReference = WeakReference (previewMediaFragment)
455-
456- @Deprecated(" Deprecated in Java" )
457- override fun doInBackground (vararg fileId : Long? ): Uri ? {
458- val client: OwnCloudClient ?
459- try {
460- client = clientFactory?.create(user)
461- } catch (e: CreationException ) {
462- Log_OC .e(TAG , " Loading stream url not possible: $e " )
463- return null
464- }
465-
466- val sfo = fileId[0 ]?.let { StreamMediaFileOperation (it) }
467- val result = sfo?.execute(client)
468-
469- if (result?.isSuccess == false ) {
470- return null
471- }
472-
473- return (result?.data?.get(0 ) as String ).toUri()
474- }
475-
476- @Deprecated(" Deprecated in Java" )
477- override fun onPostExecute (uri : Uri ? ) {
478- val previewMediaFragment = previewMediaFragmentWeakReference.get()
479- val context = previewMediaFragment?.context
480-
481- if (previewMediaFragment?.binding == null || context == null ) {
482- Log_OC .e(TAG , " Error streaming file: no previewMediaFragment!" )
483- return
484- }
485-
486- previewMediaFragment.run {
487- if (uri != null ) {
488- videoUri = uri
489- playVideoUri(uri)
490- } else {
491- emptyListView?.visibility = View .VISIBLE
492- setVideoErrorMessage(getString(R .string.stream_not_possible_headline))
493- }
494- }
495- }
496- }
497-
498475 override fun onStop () {
499476 releaseVideoPlayer()
500477 super .onStop()
0 commit comments