From e17c492baf24cb5469f483b1218c52d22c3cf727 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sat, 1 May 2021 00:48:17 -0700 Subject: [PATCH] Adds swipe to delete monsters on the library screen. --- .../ui/MonsterListRecyclerViewAdapter.java | 6 ++ .../ui/library/LibraryFragment.java | 73 +++++++++++++++++++ .../main/res/layout/monster_list_content.xml | 16 ++-- Android/app/src/main/res/values/colors.xml | 5 +- Android/app/src/main/res/values/dimens.xml | 5 +- 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java index df0c8a2..e42ecef 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/MonsterListRecyclerViewAdapter.java +++ b/Android/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/Android/app/src/main/res/layout/monster_list_content.xml b/Android/app/src/main/res/layout/monster_list_content.xml index b45ad3b..395ec3e 100644 --- a/Android/app/src/main/res/layout/monster_list_content.xml +++ b/Android/app/src/main/res/layout/monster_list_content.xml @@ -1,14 +1,20 @@ - - + + + \ No newline at end of file diff --git a/Android/app/src/main/res/values/colors.xml b/Android/app/src/main/res/values/colors.xml index a1ae9ed..b91e898 100644 --- a/Android/app/src/main/res/values/colors.xml +++ b/Android/app/src/main/res/values/colors.xml @@ -2,5 +2,6 @@ #9B2818 #661A10 - #188B9B - + + #995500 + \ No newline at end of file diff --git a/Android/app/src/main/res/values/dimens.xml b/Android/app/src/main/res/values/dimens.xml index 47c8224..bcff9f6 100644 --- a/Android/app/src/main/res/values/dimens.xml +++ b/Android/app/src/main/res/values/dimens.xml @@ -2,4 +2,7 @@ 16dp 16dp - + 16dp + 16dp + + \ No newline at end of file