summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/speeddial/SpeedDialAdapter.java
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/SpeedDialAdapter.java
parentacfab4ed674bb7b0154373c626ce494f37629509 (diff)
Drag favorite to remove
Test: RemoveViewHolderTest, SpeedDialAdapterTest PiperOrigin-RevId: 201266033 Change-Id: Ie7ed9bac8ad9c7bbc35c351409b629e3fbad3de8
Diffstat (limited to 'java/com/android/dialer/speeddial/SpeedDialAdapter.java')
-rw-r--r--java/com/android/dialer/speeddial/SpeedDialAdapter.java128
1 files changed, 116 insertions, 12 deletions
diff --git a/java/com/android/dialer/speeddial/SpeedDialAdapter.java b/java/com/android/dialer/speeddial/SpeedDialAdapter.java
index a382b1a6b..ff52a0745 100644
--- a/java/com/android/dialer/speeddial/SpeedDialAdapter.java
+++ b/java/com/android/dialer/speeddial/SpeedDialAdapter.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.os.Build.VERSION_CODES;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
@@ -28,6 +29,8 @@ import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.ArrayMap;
import android.view.LayoutInflater;
import android.view.ViewGroup;
+import android.view.animation.AnticipateInterpolator;
+import android.widget.FrameLayout;
import com.android.dialer.common.Assert;
import com.android.dialer.speeddial.FavoritesViewHolder.FavoriteContactsListener;
import com.android.dialer.speeddial.HeaderViewHolder.SpeedDialHeaderListener;
@@ -58,13 +61,20 @@ import java.util.Map;
public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements ItemTouchHelperAdapter {
+ private static final int NON_CONTACT_ITEM_NUMBER_BEFORE_FAVORITES = 2;
+ private static final int NON_CONTACT_ITEM_NUMBER_BEFORE_SUGGESTION = 3;
+
+ private static final float IN_REMOVE_VIEW_SCALE = 0.5f;
+ private static final float IN_REMOVE_VIEW_ALPHA = 0.5f;
+
@Retention(RetentionPolicy.SOURCE)
@IntDef({RowType.STARRED_HEADER, RowType.SUGGESTION_HEADER, RowType.STARRED, RowType.SUGGESTION})
@interface RowType {
- int STARRED_HEADER = 0;
- int SUGGESTION_HEADER = 1;
- int STARRED = 2;
- int SUGGESTION = 3;
+ int REMOVE_VIEW = 0;
+ int STARRED_HEADER = 1;
+ int SUGGESTION_HEADER = 2;
+ int STARRED = 3;
+ int SUGGESTION = 4;
}
private final Context context;
@@ -78,6 +88,9 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi
// Needed for FavoriteViewHolder
private ItemTouchHelper itemTouchHelper;
+ private RemoveViewHolder removeViewHolder;
+ private FavoritesViewHolder draggingFavoritesViewHolder;
+
public SpeedDialAdapter(
Context context,
FavoriteContactsListener favoritesListener,
@@ -111,6 +124,11 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi
case RowType.SUGGESTION_HEADER:
return new HeaderViewHolder(
inflater.inflate(R.layout.speed_dial_header_layout, parent, false), headerListener);
+ case RowType.REMOVE_VIEW:
+ removeViewHolder =
+ new RemoveViewHolder(
+ inflater.inflate(R.layout.favorite_remove_view_layout, parent, false));
+ return removeViewHolder;
default:
throw Assert.createIllegalStateFailException("Invalid viewType: " + viewType);
}
@@ -128,10 +146,17 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi
((HeaderViewHolder) holder).showAddButton(false);
return;
case RowType.STARRED:
- ((FavoritesViewHolder) holder).bind(context, speedDialUiItems.get(position - 1));
+ ((FavoritesViewHolder) holder).bind(context, speedDialUiItems.get(position - 2));
+ // Removed item might come back
+ FrameLayout avatarContainer = ((FavoritesViewHolder) holder).getAvatarContainer();
+ avatarContainer.setScaleX(1);
+ avatarContainer.setScaleY(1);
+ avatarContainer.setAlpha(1);
break;
case RowType.SUGGESTION:
- ((SuggestionViewHolder) holder).bind(context, speedDialUiItems.get(position - 2));
+ ((SuggestionViewHolder) holder).bind(context, speedDialUiItems.get(position - 3));
+ break;
+ case RowType.REMOVE_VIEW:
break;
default:
throw Assert.createIllegalStateFailException("Invalid view holder: " + holder);
@@ -153,20 +178,25 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi
}
return Boolean.compare(o2.isStarred(), o1.isStarred());
});
+ updatePositionToRowTypeMap();
+ }
+
+ private void updatePositionToRowTypeMap() {
positionToRowTypeMap.clear();
if (speedDialUiItems.isEmpty()) {
return;
}
+ positionToRowTypeMap.put(0, RowType.REMOVE_VIEW);
// Show the add favorites even if there are no favorite contacts
- positionToRowTypeMap.put(0, RowType.STARRED_HEADER);
- int positionOfSuggestionHeader = 1;
+ positionToRowTypeMap.put(1, RowType.STARRED_HEADER);
+ int positionOfSuggestionHeader = NON_CONTACT_ITEM_NUMBER_BEFORE_FAVORITES;
for (int i = 0; i < speedDialUiItems.size(); i++) {
if (speedDialUiItems.get(i).isStarred()) {
- positionToRowTypeMap.put(i + 1, RowType.STARRED); // +1 for the header
+ positionToRowTypeMap.put(i + NON_CONTACT_ITEM_NUMBER_BEFORE_FAVORITES, RowType.STARRED);
positionOfSuggestionHeader++;
} else {
- positionToRowTypeMap.put(i + 2, RowType.SUGGESTION); // +2 for both headers
+ positionToRowTypeMap.put(i + NON_CONTACT_ITEM_NUMBER_BEFORE_SUGGESTION, RowType.SUGGESTION);
}
}
if (!speedDialUiItems.get(speedDialUiItems.size() - 1).isStarred()) {
@@ -189,6 +219,7 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi
case RowType.SUGGESTION:
case RowType.STARRED_HEADER:
case RowType.SUGGESTION_HEADER:
+ case RowType.REMOVE_VIEW:
return 3; // span the whole screen
case RowType.STARRED:
return 1; // span 1/3 of the screen
@@ -202,15 +233,88 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi
@Override
public void onItemMove(int fromPosition, int toPosition) {
+ if (toPosition == 0) {
+ // drop to removeView
+ return;
+ }
// fromPosition/toPosition correspond to adapter position, which is off by 1 from the list
// position b/c of the favorites header. So subtract 1 here.
- speedDialUiItems.add(toPosition - 1, speedDialUiItems.remove(fromPosition - 1));
+ speedDialUiItems.add(toPosition - 2, speedDialUiItems.remove(fromPosition - 2));
notifyItemMoved(fromPosition, toPosition);
}
@Override
public boolean canDropOver(ViewHolder target) {
- return target instanceof FavoritesViewHolder;
+ return target instanceof FavoritesViewHolder || target instanceof RemoveViewHolder;
+ }
+
+ @Override
+ public void onSelectedChanged(@Nullable ViewHolder viewHolder, int actionState) {
+ switch (actionState) {
+ case ItemTouchHelper.ACTION_STATE_DRAG:
+ if (viewHolder != null) {
+ draggingFavoritesViewHolder = (FavoritesViewHolder) viewHolder;
+ draggingFavoritesViewHolder.onSelectedChanged(true);
+ removeViewHolder.show();
+ }
+ break;
+ case ItemTouchHelper.ACTION_STATE_IDLE:
+ // viewHolder is null in this case
+ if (draggingFavoritesViewHolder != null) {
+ draggingFavoritesViewHolder.onSelectedChanged(false);
+ draggingFavoritesViewHolder = null;
+ removeViewHolder.hide();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void enterRemoveView() {
+ if (draggingFavoritesViewHolder != null) {
+ draggingFavoritesViewHolder
+ .getAvatarContainer()
+ .animate()
+ .scaleX(IN_REMOVE_VIEW_SCALE)
+ .scaleY(IN_REMOVE_VIEW_SCALE)
+ .alpha(IN_REMOVE_VIEW_ALPHA)
+ .start();
+ }
+ }
+
+ @Override
+ public void leaveRemoveView() {
+ if (draggingFavoritesViewHolder != null) {
+ draggingFavoritesViewHolder
+ .getAvatarContainer()
+ .animate()
+ .scaleX(1)
+ .scaleY(1)
+ .alpha(1)
+ .start();
+ }
+ }
+
+ @Override
+ public void dropOnRemoveView(ViewHolder fromViewHolder) {
+ if (!(fromViewHolder instanceof FavoritesViewHolder)) {
+ return;
+ }
+ int fromPosition = fromViewHolder.getAdapterPosition();
+
+ SpeedDialUiItem removedItem = speedDialUiItems.remove(fromPosition - 2);
+ favoritesListener.onRequestRemove(removedItem);
+ ((FavoritesViewHolder) fromViewHolder)
+ .getAvatarContainer()
+ .animate()
+ .scaleX(0)
+ .scaleY(0)
+ .alpha(0)
+ .setInterpolator(new AnticipateInterpolator())
+ .start();
+ updatePositionToRowTypeMap();
}
public void setItemTouchHelper(ItemTouchHelper itemTouchHelper) {