diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java index fd6c8d1d1e5..280b05b728b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java @@ -98,6 +98,8 @@ public void updateFromItem(final LocalItem localItem, return true; }); + itemView.setOnTouchListener(getOnDragListener(item)); + itemHandleView.setOnTouchListener(getOnTouchListener(item)); } @@ -135,4 +137,14 @@ private View.OnTouchListener getOnTouchListener(final PlaylistStreamEntry item) return false; }; } + + private View.OnTouchListener getOnDragListener(final PlaylistStreamEntry item) { + return (view, motionEvent) -> { + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null) { + itemBuilder.getOnItemSelectedListener().swipe(item, + LocalPlaylistStreamItemHolder.this); + } + return false; + }; + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 66bd341429f..bb3a2a21d10 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -3,6 +3,9 @@ import android.app.Activity; import android.content.Context; import android.content.DialogInterface; +import android.graphics.Canvas; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; import android.text.TextUtils; @@ -19,6 +22,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; @@ -190,6 +194,14 @@ public void drag(final LocalItem selectedItem, itemTouchHelper.startDrag(viewHolder); } } + + @Override + public void swipe(final LocalItem selectedItem, + final RecyclerView.ViewHolder viewHolder) { + if (itemTouchHelper != null) { + itemTouchHelper.startSwipe(viewHolder); + } + } }); } @@ -679,8 +691,13 @@ private ItemTouchHelper.SimpleCallback getItemTouchCallback() { if (isGridLayout()) { directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; } + + final Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_delete); + final ColorDrawable background = + new ColorDrawable(getResources().getColor(R.color.light_settings_accent_color)); + return new ItemTouchHelper.SimpleCallback(directions, - ItemTouchHelper.ACTION_STATE_IDLE) { + ItemTouchHelper.LEFT) { @Override public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView, final int viewSize, @@ -719,12 +736,53 @@ public boolean isLongPressDragEnabled() { @Override public boolean isItemViewSwipeEnabled() { - return false; + return true; } @Override public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, final int swipeDir) { + final int position = viewHolder.getAdapterPosition() - 1; + final PlaylistStreamEntry item = + (PlaylistStreamEntry) itemListAdapter.getItemsList().get(position); + deleteItem(item); + } + + @Override + public void onChildDraw(final Canvas c, final RecyclerView recyclerView, + final RecyclerView.ViewHolder viewHolder, + final float dX, final float dY, final int actionState, + final boolean isCurrentlyActive) { + + final View itemView = viewHolder.itemView; + final int backgroundCornerOffset = 20; + + final int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; + final int iconTop = itemView.getTop() + (itemView.getHeight() + - icon.getIntrinsicHeight()) / 2; + final int iconBottom = iconTop + icon.getIntrinsicHeight(); + + + if (dX < 0) { + // Swiping to the left + final int iconLeft = Math.max(itemView.getRight() - iconMargin * 2, + itemView.getRight() + ((int) dX)); + final int iconRight = Math.max(itemView.getRight() - iconMargin * 2 + + icon.getIntrinsicWidth(), + itemView.getRight() + icon.getIntrinsicWidth() + ((int) dX)); + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + + background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset, + itemView.getTop(), itemView.getRight(), itemView.getBottom()); + } else { + // view is unSwiped + background.setBounds(0, 0, 0, 0); + } + + background.draw(c); + icon.draw(c); + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, + actionState, isCurrentlyActive); } }; } @@ -817,4 +875,3 @@ private PlayQueue getPlayQueue(final int index) { return new SinglePlayQueue(streamInfoItems, index); } } - diff --git a/app/src/main/java/org/schabi/newpipe/util/OnClickGesture.java b/app/src/main/java/org/schabi/newpipe/util/OnClickGesture.java index 5f44cab8b67..47f768e864e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/OnClickGesture.java +++ b/app/src/main/java/org/schabi/newpipe/util/OnClickGesture.java @@ -13,4 +13,8 @@ public void held(final T selectedItem) { public void drag(final T selectedItem, final RecyclerView.ViewHolder viewHolder) { // Optional gesture } + + public void swipe(final T selectedItem, final RecyclerView.ViewHolder viewHolder) { + // Optional gesture + } }