Skip to content

Commit e099313

Browse files
alperozturk96backportbot[bot]
authored andcommitted
fix(exo-player): illegal state exception creation of exoplayer
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 0812021 commit e099313

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
/**
@@ -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

Comments
 (0)