Skip to content

Commit 1e805ed

Browse files
committed
fix(exo-player): illegal state exception creation of exoplayer
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent e2a45bb commit 1e805ed

1 file changed

Lines changed: 56 additions & 79 deletions

File tree

app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.kt

Lines changed: 56 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ import android.content.Intent
1818
import android.content.res.Configuration
1919
import android.content.res.Resources
2020
import android.net.Uri
21-
import android.os.AsyncTask
2221
import android.os.Bundle
23-
import android.os.Handler
24-
import android.os.Looper
2522
import android.view.LayoutInflater
2623
import android.view.Menu
2724
import android.view.MenuInflater
@@ -37,6 +34,7 @@ import androidx.core.view.MenuHost
3734
import androidx.core.view.MenuProvider
3835
import androidx.drawerlayout.widget.DrawerLayout
3936
import androidx.lifecycle.Lifecycle
37+
import androidx.lifecycle.lifecycleScope
4038
import androidx.media3.common.MediaItem
4139
import androidx.media3.common.Player
4240
import androidx.media3.common.util.UnstableApi
@@ -58,7 +56,6 @@ import com.nextcloud.ui.fileactions.FileActionsBottomSheet.Companion.newInstance
5856
import com.nextcloud.utils.extensions.getParcelableArgument
5957
import com.nextcloud.utils.extensions.getTypedActivity
6058
import com.nextcloud.utils.extensions.logFileSize
61-
import com.owncloud.android.MainApp
6259
import com.owncloud.android.R
6360
import com.owncloud.android.databinding.FragmentPreviewMediaBinding
6461
import com.owncloud.android.datamodel.OCFile
@@ -71,8 +68,9 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment
7168
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment
7269
import com.owncloud.android.ui.fragment.FileFragment
7370
import 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
7674
import 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

Comments
 (0)