diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java b/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java index df0c8a2..e42ecef 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java @@ -110,4 +110,10 @@ public class MonsterListRecyclerViewAdapter extends RecyclerView.Adapter { + repository + .deleteMonster(monster) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> { + Logger.logDebug("deleted"); + }, Logger::logError); }, mTwoPane); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteMonsterCallback(adapter)); + itemTouchHelper.attachToRecyclerView(recyclerView); } protected void navigateToMonsterDetail(UUID monsterId) { @@ -82,5 +100,60 @@ public class LibraryFragment extends MCFragment { Navigation.findNavController(getView()).navigate(action); } + public static class SwipeToDeleteMonsterCallback extends ItemTouchHelper.SimpleCallback { + private final MonsterListRecyclerViewAdapter mAdapter; + private final Drawable icon; + private final ColorDrawable background; + private final Paint clearPaint; + + public SwipeToDeleteMonsterCallback(MonsterListRecyclerViewAdapter adapter) { + super(0, ItemTouchHelper.LEFT); + mAdapter = adapter; + icon = ContextCompat.getDrawable(mAdapter.getContext(), R.drawable.ic_delete_white_36); + background = new ColorDrawable(Color.RED); + clearPaint = new Paint(); + clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + return false; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + int position = viewHolder.getAdapterPosition(); + mAdapter.deleteItem(position); + } + + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + View itemView = viewHolder.itemView; + int itemHeight = itemView.getBottom() - itemView.getTop(); + boolean isCancelled = dX == 0 && !isCurrentlyActive; + + if (isCancelled) { + c.drawRect(itemView.getRight() + dX, itemView.getTop(), itemView.getRight(), itemView.getBottom(), clearPaint); + return; + } + // Draw the red delete background + background.setBounds(itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom()); + background.draw(c); + + // Calculate position of delete icon + int iconHeight = icon.getIntrinsicHeight(); + int iconWidth = icon.getIntrinsicWidth(); + int iconTop = itemView.getTop() + (itemHeight - iconHeight) / 2; + int iconMargin = (itemHeight - iconHeight) / 2; + int iconLeft = itemView.getRight() - iconMargin - iconWidth; + int iconRight = itemView.getRight() - iconMargin; + int iconBottom = iconTop + iconHeight; + + // Draw the icon + icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); + icon.draw(c); + + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); + } } } diff --git a/app/src/main/res/drawable/ic_delete_white_36.xml b/app/src/main/res/drawable/ic_delete_white_36.xml new file mode 100644 index 0000000..282594c --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_white_36.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/monster_list_content.xml b/app/src/main/res/layout/monster_list_content.xml new file mode 100644 index 0000000..395ec3e --- /dev/null +++ b/app/src/main/res/layout/monster_list_content.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7ea0da2..b91e898 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,5 +2,6 @@ #9B2818 #661A10 - #188B9B + + #995500 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e00c2dd..bcff9f6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,7 @@ 16dp 16dp + 16dp + 16dp + \ No newline at end of file