Skip to content

Commit

Permalink
Merge pull request #13350 from nextcloud/bugfix/not-attached-context-…
Browse files Browse the repository at this point in the history
…PreviewMediaFragment

Bugfix - Not attached to an activity on PreviewMediaFragment
  • Loading branch information
alperozturk96 committed Aug 2, 2024
2 parents ffe6d04 + 7b0a75b commit 773f1a9
Showing 1 changed file with 100 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ package com.owncloud.android.ui.preview

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.content.res.Resources
Expand Down Expand Up @@ -125,14 +126,8 @@ class PreviewMediaFragment : FileFragment(), OnTouchListener, Injectable {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

arguments?.let { bundle ->
file.logFileSize(TAG)
file = bundle.getParcelableArgument(FILE, OCFile::class.java)
user = bundle.getParcelableArgument(USER, User::class.java)

savedPlaybackPosition = bundle.getLong(PLAYBACK_POSITION)
autoplay = bundle.getBoolean(AUTOPLAY)
isLivePhoto = bundle.getBoolean(IS_LIVE_PHOTO)
arguments?.let {
initArguments(it)
}

mediaPlayerServiceConnection = PlayerServiceConnection(requireContext())
Expand All @@ -149,53 +144,58 @@ class PreviewMediaFragment : FileFragment(), OnTouchListener, Injectable {
return binding.root
}

private fun setLoadingView() {
binding.progress.visibility = View.VISIBLE
binding.emptyView.emptyListView.visibility = View.GONE
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log_OC.v(TAG, "onActivityCreated")

private fun setVideoErrorMessage(headline: String, @StringRes message: Int = R.string.stream_not_possible_message) {
binding.emptyView.run {
emptyListViewHeadline.text = headline
emptyListViewText.setText(message)
emptyListIcon.setImageResource(R.drawable.file_movie)
emptyListViewText.visibility = View.VISIBLE
emptyListIcon.visibility = View.VISIBLE
emptyListView.visibility = View.VISIBLE
checkArgumentsAfterViewCreation(savedInstanceState)

if (file != null) {
prepareExoPlayerView()
}

binding.progress.visibility = View.GONE
toggleDrawerLockMode(containerActivity, DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
addMenuHost()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log_OC.v(TAG, "onActivityCreated")

var file = file
private fun checkArgumentsAfterViewCreation(savedInstanceState: Bundle?) {
if (savedInstanceState == null) {
checkNotNull(file) { "Instanced with a NULL OCFile" }
checkNotNull(user) { "Instanced with a NULL ownCloud Account" }
} else {
file = savedInstanceState.getParcelableArgument(EXTRA_FILE, OCFile::class.java)
setFile(file)
user = savedInstanceState.getParcelableArgument(EXTRA_USER, User::class.java)
savedPlaybackPosition = savedInstanceState.getInt(EXTRA_PLAY_POSITION).toLong()
autoplay = savedInstanceState.getBoolean(EXTRA_PLAYING)
}
}

if (file != null) {
if (MimeTypeUtil.isVideo(file)) {
binding.exoplayerView.visibility = View.VISIBLE
binding.imagePreview.visibility = View.GONE
} else {
binding.exoplayerView.visibility = View.GONE
binding.imagePreview.visibility = View.VISIBLE
extractAndSetCoverArt(file)
}
private fun initArguments(bundle: Bundle) {
file.logFileSize(TAG)
file = bundle.getParcelableArgument(FILE, OCFile::class.java)
user = bundle.getParcelableArgument(USER, User::class.java)

savedPlaybackPosition = bundle.getLong(PLAYBACK_POSITION)
autoplay = bundle.getBoolean(AUTOPLAY)
isLivePhoto = bundle.getBoolean(IS_LIVE_PHOTO)
}

private fun setLoadingView() {
binding.progress.visibility = View.VISIBLE
binding.emptyView.emptyListView.visibility = View.GONE
}

private fun setVideoErrorMessage(headline: String, @StringRes message: Int = R.string.stream_not_possible_message) {
binding.emptyView.run {
emptyListViewHeadline.text = headline
emptyListViewText.setText(message)
emptyListIcon.setImageResource(R.drawable.file_movie)
emptyListViewText.visibility = View.VISIBLE
emptyListIcon.visibility = View.VISIBLE
emptyListView.visibility = View.VISIBLE
}

toggleDrawerLockMode(containerActivity, DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
addMenuHost()
binding.progress.visibility = View.GONE
}

/**
Expand Down Expand Up @@ -275,61 +275,68 @@ class PreviewMediaFragment : FileFragment(), OnTouchListener, Injectable {
}
}

@Suppress("TooGenericExceptionCaught")
override fun onStart() {
super.onStart()
Log_OC.v(TAG, "onStart")
val context = if (context != null) {
requireContext()
} else {
MainApp.getAppContext()
prepareMedia()
}

private fun prepareMedia() {
if (file == null || !isAdded) {
Log_OC.d(TAG, "File is null or fragment not attached to a context.")
return
}

val file = file
if (file != null) {
// bind to any existing player
mediaPlayerServiceConnection?.bind()

if (MimeTypeUtil.isAudio(file)) {
binding.mediaController.setMediaPlayer(mediaPlayerServiceConnection)
binding.mediaController.visibility = View.VISIBLE
mediaPlayerServiceConnection?.start(user!!, file, autoplay, savedPlaybackPosition)
binding.emptyView.emptyListView.visibility = View.GONE
binding.progress.visibility = View.GONE
} else if (MimeTypeUtil.isVideo(file)) {
if (mediaPlayerServiceConnection?.isConnected == true) {
// always stop player
stopAudio()
}
if (exoPlayer != null) {
playVideo()
} else {
val handler = Handler(Looper.getMainLooper())
Executors.newSingleThreadExecutor().execute {
try {
nextcloudClient = clientFactory.createNextcloudClient(accountManager.user)
handler.post {
exoPlayer = createNextcloudExoplayer(context, nextcloudClient!!)
exoPlayer?.addListener(
ExoplayerListener(
context,
binding.exoplayerView,
exoPlayer!!
) {
goBackToLivePhoto()
}
)
playVideo()
}
} catch (e: CreationException) {
handler.post { Log_OC.e(TAG, "error setting up ExoPlayer", e) }
mediaPlayerServiceConnection?.bind()

if (MimeTypeUtil.isAudio(file)) {
prepareForAudio()
} else if (MimeTypeUtil.isVideo(file)) {
prepareForVideo(context ?: MainApp.getAppContext())
}
}

@Suppress("DEPRECATION", "TooGenericExceptionCaught")
private fun prepareForVideo(context: Context) {
if (mediaPlayerServiceConnection?.isConnected == true) {
// always stop player
stopAudio()
}
if (exoPlayer != null) {
playVideo()
} else {
val handler = Handler(Looper.getMainLooper())
Executors.newSingleThreadExecutor().execute {
try {
nextcloudClient = clientFactory.createNextcloudClient(accountManager.user)
handler.post {
nextcloudClient?.let { client ->
createExoPlayer(context, client)
playVideo()
}
}
} catch (e: CreationException) {
handler.post { Log_OC.e(TAG, "error setting up ExoPlayer", e) }
}
}
}
}

private fun createExoPlayer(context: Context, client: NextcloudClient) {
exoPlayer = createNextcloudExoplayer(context, client)
exoPlayer?.let {
val listener = ExoplayerListener(context, binding.exoplayerView, it) { goBackToLivePhoto() }
it.addListener(listener)
}
}

private fun prepareForAudio() {
binding.mediaController.setMediaPlayer(mediaPlayerServiceConnection)
binding.mediaController.visibility = View.VISIBLE
mediaPlayerServiceConnection?.start(user!!, file, autoplay, savedPlaybackPosition)
binding.emptyView.emptyListView.visibility = View.GONE
binding.progress.visibility = View.GONE
}

private fun goBackToLivePhoto() {
if (!isLivePhoto) {
return
Expand All @@ -339,6 +346,17 @@ class PreviewMediaFragment : FileFragment(), OnTouchListener, Injectable {
requireActivity().supportFragmentManager.popBackStack()
}

private fun prepareExoPlayerView() {
if (MimeTypeUtil.isVideo(file)) {
binding.exoplayerView.visibility = View.VISIBLE
binding.imagePreview.visibility = View.GONE
} else {
binding.exoplayerView.visibility = View.GONE
binding.imagePreview.visibility = View.VISIBLE
extractAndSetCoverArt(file)
}
}

private fun showActionBar() {
val currentActivity: Activity = requireActivity()
if (currentActivity is PreviewImageActivity) {
Expand Down

0 comments on commit 773f1a9

Please sign in to comment.