[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