From 7cf3cec3dc6e228acb4767ffb4b14761cdf812b2 Mon Sep 17 00:00:00 2001 From: Nicolas Pomepuy Date: Mon, 9 Dec 2024 10:43:16 +0100 Subject: [PATCH] Allow deleting files in TV Fixes #2398 --- .../television/ui/MediaItemDetailsFragment.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt b/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt index e5f16c65e..fec35b7f9 100644 --- a/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt +++ b/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt @@ -41,6 +41,7 @@ import kotlinx.coroutines.channels.actor import org.videolan.libvlc.util.AndroidUtil import org.videolan.medialibrary.MLServiceLocator import org.videolan.medialibrary.interfaces.media.MediaWrapper +import org.videolan.medialibrary.media.MediaLibraryItem import org.videolan.moviepedia.database.models.MediaImage import org.videolan.moviepedia.database.models.MediaImageType import org.videolan.moviepedia.database.models.MediaMetadata @@ -61,6 +62,7 @@ import org.videolan.vlc.BuildConfig import org.videolan.vlc.R import org.videolan.vlc.gui.DialogActivity import org.videolan.vlc.gui.DialogActivity.Companion.EXTRA_MEDIA +import org.videolan.vlc.gui.dialogs.ConfirmDeleteDialog import org.videolan.vlc.gui.helpers.AudioUtil import org.videolan.vlc.gui.helpers.UiTools import org.videolan.vlc.gui.helpers.UiTools.addToPlaylist @@ -70,6 +72,7 @@ import org.videolan.vlc.repository.BrowserFavRepository import org.videolan.vlc.util.FileUtils import org.videolan.vlc.util.convertFavorites import org.videolan.vlc.util.getScreenWidth +import org.videolan.vlc.util.isSchemeFile import org.videolan.vlc.util.isSchemeNetwork private const val TAG = "MediaItemDetailsFragment" @@ -87,6 +90,7 @@ private const val ID_FAVORITE = 11 private const val ID_REMOVE_FROM_HISTORY = 12 private const val ID_NAVIGATE_PARENT = 13 private const val ID_FAVORITE_EDIT = 14 +private const val ID_DELETE = 15 const val EXTRA_FROM_HISTORY = "from_history" const val EXTRA_ITEM = "item" const val EXTRA_MEDIA = "media" @@ -181,6 +185,10 @@ class MediaItemDetailsFragment : DetailsSupportFragment(), CoroutineScope by Mai } } + private fun onDeleteFailed(item: MediaLibraryItem) { + if (isAdded) UiTools.snacker(requireActivity(), getString(R.string.msg_delete_failed, item.title)) + } + override fun onSaveInstanceState(outState: Bundle) { outState.putParcelable(EXTRA_ITEM, viewModel.mediaItemDetails) outState.putParcelable(org.videolan.television.ui.EXTRA_MEDIA, viewModel.media) @@ -342,6 +350,19 @@ class MediaItemDetailsFragment : DetailsSupportFragment(), CoroutineScope by Mai activity.startActivity(intent) } } + ID_DELETE -> { + val dialog = ConfirmDeleteDialog.newInstance(arrayListOf(viewModel.media)) + dialog.show(requireActivity().supportFragmentManager, ConfirmDeleteDialog::class.simpleName) + dialog.setListener { + dialog.dismiss() + var preventFinish = false + MediaUtils.deleteItem(requireActivity(), viewModel.media) { + onDeleteFailed(it) + preventFinish = true + } + if (!preventFinish) requireActivity().finish() + } + } ID_PLAYLIST -> requireActivity().addToPlaylist(arrayListOf(viewModel.media)) ID_FAVORITE_ADD -> { val uri = viewModel.mediaItemDetails.location!!.toUri() @@ -424,6 +445,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment(), CoroutineScope by Mai actionsAdapter.set(ID_PLAY, Action(ID_PLAY.toLong(), res.getString(R.string.play))) actionsAdapter.set(ID_LISTEN, Action(ID_LISTEN.toLong(), res.getString(R.string.listen))) actionsAdapter.set(ID_PLAYLIST, Action(ID_PLAYLIST.toLong(), res.getString(R.string.add_to_playlist))) + if (viewModel.media.uri.scheme.isSchemeFile()) actionsAdapter.set(ID_DELETE, Action(ID_DELETE.toLong(), res.getString(R.string.delete))) } else if (viewModel.media.type == MediaWrapper.TYPE_VIDEO) { // Add images and action buttons to the details view if (cover == null) { @@ -442,6 +464,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment(), CoroutineScope by Mai actionsAdapter.set(ID_PLAYLIST, Action(ID_PLAYLIST.toLong(), res.getString(R.string.add_to_playlist))) //todo reenable entry point when ready if (BuildConfig.DEBUG) actionsAdapter.set(ID_GET_INFO, Action(ID_GET_INFO.toLong(), res.getString(R.string.find_metadata))) + if (viewModel.media.uri.scheme.isSchemeFile()) actionsAdapter.set(ID_DELETE, Action(ID_DELETE.toLong(), res.getString(R.string.delete))) } else if (viewModel.media.type == MediaWrapper.TYPE_ALL) { if (cover == null) { detailsOverview.imageDrawable = ContextCompat.getDrawable(activity, R.drawable.ic_default_cone)