summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/speeddial/draghelper
diff options
context:
space:
mode:
authoryueg <yueg@google.com>2018-06-19 16:54:38 -0700
committerCopybara-Service <copybara-piper@google.com>2018-06-19 16:55:54 -0700
commit406de13ab4326bbedae0262709a004da2211d04c (patch)
tree5e9f525d8dc782b1ba778b191184d0960617bcc9 /java/com/android/dialer/speeddial/draghelper
parentacfab4ed674bb7b0154373c626ce494f37629509 (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.java62
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);
}
}