diff options
author | yueg <yueg@google.com> | 2018-06-19 16:54:38 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-19 16:55:54 -0700 |
commit | 406de13ab4326bbedae0262709a004da2211d04c (patch) | |
tree | 5e9f525d8dc782b1ba778b191184d0960617bcc9 /java/com/android/dialer/speeddial/draghelper | |
parent | acfab4ed674bb7b0154373c626ce494f37629509 (diff) |
Drag favorite to remove
Test: RemoveViewHolderTest, SpeedDialAdapterTest
PiperOrigin-RevId: 201266033
Change-Id: Ie7ed9bac8ad9c7bbc35c351409b629e3fbad3de8
Diffstat (limited to 'java/com/android/dialer/speeddial/draghelper')
-rw-r--r-- | java/com/android/dialer/speeddial/draghelper/SpeedDialItemTouchHelperCallback.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/java/com/android/dialer/speeddial/draghelper/SpeedDialItemTouchHelperCallback.java b/java/com/android/dialer/speeddial/draghelper/SpeedDialItemTouchHelperCallback.java index d1d9f478b..fc963a1a3 100644 --- a/java/com/android/dialer/speeddial/draghelper/SpeedDialItemTouchHelperCallback.java +++ b/java/com/android/dialer/speeddial/draghelper/SpeedDialItemTouchHelperCallback.java @@ -16,7 +16,9 @@ package com.android.dialer.speeddial.draghelper; +import android.graphics.Canvas; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.support.v7.widget.helper.ItemTouchHelper; @@ -26,6 +28,12 @@ public class SpeedDialItemTouchHelperCallback extends ItemTouchHelper.Callback { private final ItemTouchHelperAdapter adapter; + // When dragged item is in removeView, onMove() and onChildDraw() are called in turn. This + // behavior changes when dragged item entering/leaving removeView. The boolean field + // movedOverRemoveView is for onMove() and onChildDraw() to flip. + private boolean movedOverRemoveView; + private boolean inRemoveView; + public SpeedDialItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { this.adapter = adapter; } @@ -64,11 +72,57 @@ public class SpeedDialItemTouchHelperCallback extends ItemTouchHelper.Callback { @NonNull RecyclerView recyclerView, @NonNull ViewHolder viewHolder, @NonNull ViewHolder target) { + if (target.getItemViewType() == 0) { // 0 for RowType.REMOVE_VIEW + movedOverRemoveView = true; + if (!inRemoveView) { + // onMove() first called + adapter.enterRemoveView(); + inRemoveView = true; + } + return false; + } else if (inRemoveView) { + // Move out of removeView fast + inRemoveView = false; + movedOverRemoveView = false; + adapter.leaveRemoveView(); + } adapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override + public void onChildDraw( + @NonNull Canvas canvas, + @NonNull RecyclerView recyclerView, + @NonNull ViewHolder viewHolder, + float dx, + float dy, + int i, + boolean isCurrentlyActive) { + if (inRemoveView) { + if (!isCurrentlyActive) { + // View animating back to its original state, which means drop in this case + inRemoveView = false; + adapter.dropOnRemoveView(viewHolder); + } + if (!movedOverRemoveView) { + // when the view is over a droppable target, onMove() will be called before onChildDraw() + // thus if onMove() is not called, it is not over a droppable target. + inRemoveView = false; + adapter.leaveRemoveView(); + } + } + movedOverRemoveView = false; + super.onChildDraw(canvas, recyclerView, viewHolder, dx, dy, i, isCurrentlyActive); + } + + @Override + public void onSelectedChanged(@Nullable ViewHolder viewHolder, int actionState) { + super.onSelectedChanged(viewHolder, actionState); + adapter.onSelectedChanged(viewHolder, actionState); + } + + @Override public void onSwiped(@NonNull ViewHolder viewHolder, int direction) { // No-op since we don't support swiping } @@ -79,5 +133,13 @@ public class SpeedDialItemTouchHelperCallback extends ItemTouchHelper.Callback { void onItemMove(int fromPosition, int toPosition); boolean canDropOver(ViewHolder target); + + void onSelectedChanged(@Nullable ViewHolder viewHolder, int actionState); + + void enterRemoveView(); + + void leaveRemoveView(); + + void dropOnRemoveView(ViewHolder fromViewHolder); } } |