From 406c98f3df69af50a56422e64d81375c3ccd62b2 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:28:26 -0600 Subject: [PATCH] Cleanup, fix bugs, and improve functionality and style --- .../ui/download/DownloadButtonSetup.kt | 8 +- .../ui/download/DownloadFragment.kt | 93 +++++++++++++------ 2 files changed, 67 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadButtonSetup.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadButtonSetup.kt index c6f27667..d3329272 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadButtonSetup.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadButtonSetup.kt @@ -19,11 +19,8 @@ import com.lagradost.cloudstream3.utils.VideoDownloadHelper import com.lagradost.cloudstream3.utils.VideoDownloadManager object DownloadButtonSetup { - fun handleDownloadClick(click: DownloadClickEvent) { - handleDownloadClick(click) {} - } - fun handleDownloadClick(click: DownloadClickEvent, deleteCallback: (Boolean) -> Unit) { + fun handleDownloadClick(click: DownloadClickEvent, deleteCallback: () -> Unit = {}) { val id = click.data.id if (click.data !is VideoDownloadHelper.DownloadEpisodeCached) return when (click.action) { @@ -35,10 +32,9 @@ object DownloadButtonSetup { when (which) { DialogInterface.BUTTON_POSITIVE -> { VideoDownloadManager.deleteFileAndUpdateSettings(ctx, id) - deleteCallback.invoke(true) + deleteCallback.invoke() } DialogInterface.BUTTON_NEGATIVE -> { - deleteCallback.invoke(false) } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt index f6e7961b..e8f02472 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt @@ -6,6 +6,8 @@ import android.content.ClipboardManager import android.content.Context import android.graphics.Canvas import android.graphics.Color +import android.graphics.Path +import android.graphics.RectF import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.os.Build @@ -29,6 +31,7 @@ import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.FragmentDownloadsBinding import com.lagradost.cloudstream3.databinding.StreamInputBinding +import com.lagradost.cloudstream3.isEpisodeBased import com.lagradost.cloudstream3.isMovieType import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.observe @@ -297,20 +300,36 @@ class DownloadFragment : Fragment() { } } -class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : - ItemTouchHelper.SimpleCallback(ItemTouchHelper.LEFT, 0) { +class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTouchHelper.Callback() { - private var isActive = false + private var deleteInitiated = false + + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + val position = viewHolder.bindingAdapterPosition + val item = adapter.cardList[position] + if (item.data.type.isEpisodeBased()) return 0 + return makeMovementFlags(ItemTouchHelper.LEFT, 0) + } + + override fun isLongPressDragEnabled(): Boolean = true + + override fun isItemViewSwipeEnabled(): Boolean = false override fun onMove( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder - ): Boolean { - return false - } + ): Boolean = false - override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} + + private fun handleDelete(viewHolder: RecyclerView.ViewHolder) { + if (deleteInitiated) return + + deleteInitiated = true val position = viewHolder.bindingAdapterPosition val item = adapter.cardList[position] @@ -321,10 +340,7 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : DOWNLOAD_ACTION_DELETE_FILE, clickEvent ) - ) { - if (it) adapter.notifyItemRemoved(viewHolder.absoluteAdapterPosition) - isActive = false - } + ) { adapter.notifyItemRemoved(viewHolder.absoluteAdapterPosition) } } } } @@ -338,25 +354,46 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : actionState: Int, isCurrentlyActive: Boolean ) { - super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) + val deleteIcon: Drawable = ContextCompat.getDrawable( + recyclerView.context, + R.drawable.ic_baseline_delete_outline_24 + ) ?: return - val deleteIcon: Drawable? = ContextCompat.getDrawable(recyclerView.context, R.drawable.ic_baseline_delete_outline_24) - val background: ColorDrawable = ColorDrawable(Color.RED) + val background = ColorDrawable(Color.RED) val itemView = viewHolder.itemView - val backgroundCornerOffset = 20 - val iconMargin = (itemView.height - deleteIcon?.intrinsicHeight!!) / 2 - val iconTop = itemView.top + (itemView.height - deleteIcon.intrinsicHeight) / 2 - val iconBottom = iconTop + deleteIcon.intrinsicHeight + val scaleFactor = 1.5f + val iconWidth = (deleteIcon.intrinsicWidth * scaleFactor).toInt() + val iconHeight = (deleteIcon.intrinsicHeight * scaleFactor).toInt() - if (dX < 0) { // Swiping to the left - val iconLeft = itemView.right - iconMargin - deleteIcon.intrinsicWidth + val iconMargin = (itemView.height - iconHeight) / 2 + val iconTop = itemView.top + (itemView.height - iconHeight) / 2 + val iconBottom = iconTop + iconHeight + + val swipeDistance = itemView.width / 4 + val limitedDX = if (dX < -swipeDistance) -swipeDistance.toFloat() else dX + + if (limitedDX < 0) { // Swiping to the left + val iconLeft = itemView.right - iconMargin - iconWidth val iconRight = itemView.right - iconMargin deleteIcon.setBounds(iconLeft, iconTop, iconRight, iconBottom) + val path = Path() + val rectF = RectF( + itemView.right + limitedDX, + itemView.top.toFloat(), + itemView.right.toFloat(), + itemView.bottom.toFloat() + ) + + val radii = floatArrayOf(0f, 0f, 20f, 20f, 20f, 20f, 0f, 0f) + + path.addRoundRect(rectF, radii, Path.Direction.CW) + c.clipPath(path) + background.setBounds( - itemView.right + dX.toInt() - backgroundCornerOffset, + itemView.right + limitedDX.toInt(), itemView.top, itemView.right, itemView.bottom @@ -366,13 +403,13 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : background.draw(c) deleteIcon.draw(c) - val swipeDistance = itemView.width / 3 + if (dX <= -swipeDistance && !isCurrentlyActive) { + handleDelete(viewHolder) + } else super.onChildDraw(c, recyclerView, viewHolder, limitedDX, dY, actionState, isCurrentlyActive) + } - if (dX <= -swipeDistance && !isCurrentlyActive && !isActive) { - // If the item is dragged by at least one-third of its width to the left - // Trigger onSwiped action - onSwiped(viewHolder, ItemTouchHelper.LEFT) - isActive = true - } + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + deleteInitiated = false } } \ No newline at end of file