[Android] Allow deleting files in TV

Nicolas Pomepuy git at videolan.org
Tue Dec 10 10:57:49 UTC 2024


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Mon Dec  9 10:43:16 2024 +0100| [7cf3cec3dc6e228acb4767ffb4b14761cdf812b2] | committer: Nicolas Pomepuy

Allow deleting files in TV

Fixes #2398

> https://code.videolan.org/videolan/vlc-android/commit/7cf3cec3dc6e228acb4767ffb4b14761cdf812b2
---

 .../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 e5f16c65e1..fec35b7f90 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)



More information about the Android mailing list