diff options
Diffstat (limited to 'java/com/android/dialer/speeddial/SpeedDialAdapter.java')
-rw-r--r-- | java/com/android/dialer/speeddial/SpeedDialAdapter.java | 76 |
1 files changed, 49 insertions, 27 deletions
diff --git a/java/com/android/dialer/speeddial/SpeedDialAdapter.java b/java/com/android/dialer/speeddial/SpeedDialAdapter.java index 3312397c7..6f6ac5498 100644 --- a/java/com/android/dialer/speeddial/SpeedDialAdapter.java +++ b/java/com/android/dialer/speeddial/SpeedDialAdapter.java @@ -21,12 +21,10 @@ import android.content.Context; import android.os.Build.VERSION_CODES; import android.support.annotation.IntDef; import android.support.annotation.NonNull; -import android.support.annotation.VisibleForTesting; -import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager.SpanSizeLookup; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.ViewHolder; +import android.support.v7.widget.helper.ItemTouchHelper; import android.util.ArrayMap; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -34,10 +32,12 @@ import com.android.dialer.common.Assert; import com.android.dialer.speeddial.FavoritesViewHolder.FavoriteContactsListener; import com.android.dialer.speeddial.HeaderViewHolder.SpeedDialHeaderListener; import com.android.dialer.speeddial.SuggestionViewHolder.SuggestedContactsListener; +import com.android.dialer.speeddial.draghelper.SpeedDialItemTouchHelperCallback.ItemTouchHelperAdapter; import com.android.dialer.speeddial.loader.SpeedDialUiItem; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -55,7 +55,8 @@ import java.util.Map; */ @SuppressWarnings("AndroidApiChecker") @TargetApi(VERSION_CODES.N) -public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { +public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> + implements ItemTouchHelperAdapter { @Retention(RetentionPolicy.SOURCE) @IntDef({RowType.STARRED_HEADER, RowType.SUGGESTION_HEADER, RowType.STARRED, RowType.SUGGESTION}) @@ -74,6 +75,9 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi private final Map<Integer, Integer> positionToRowTypeMap = new ArrayMap<>(); private List<SpeedDialUiItem> speedDialUiItems; + // Needed for FavoriteViewHolder + private ItemTouchHelper itemTouchHelper; + public SpeedDialAdapter( Context context, FavoriteContactsListener favoritesListener, @@ -97,7 +101,9 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi switch (viewType) { case RowType.STARRED: return new FavoritesViewHolder( - inflater.inflate(R.layout.favorite_item_layout, parent, false), favoritesListener); + inflater.inflate(R.layout.favorite_item_layout, parent, false), + itemTouchHelper, + favoritesListener); case RowType.SUGGESTION: return new SuggestionViewHolder( inflater.inflate(R.layout.suggestion_row_layout, parent, false), suggestedListener); @@ -162,30 +168,46 @@ public final class SpeedDialAdapter extends RecyclerView.Adapter<RecyclerView.Vi } } - /* package-private */ LayoutManager getLayoutManager(Context context) { - GridLayoutManager layoutManager = new GridLayoutManager(context, 3 /* spanCount */); - layoutManager.setSpanSizeLookup( - new SpanSizeLookup() { - @Override - public int getSpanSize(int position) { - return SpeedDialAdapter.this.getSpanSize(position); - } - }); - return layoutManager; + public SpanSizeLookup getSpanSizeLookup() { + return new SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + switch (getItemViewType(position)) { + case RowType.SUGGESTION: + case RowType.STARRED_HEADER: + case RowType.SUGGESTION_HEADER: + return 3; // span the whole screen + case RowType.STARRED: + return 1; // span 1/3 of the screen + default: + throw Assert.createIllegalStateFailException( + "Invalid row type: " + positionToRowTypeMap.get(position)); + } + } + }; } - @VisibleForTesting - int getSpanSize(int position) { - switch (getItemViewType(position)) { - case RowType.SUGGESTION: - case RowType.STARRED_HEADER: - case RowType.SUGGESTION_HEADER: - return 3; // span the whole screen - case RowType.STARRED: - return 1; // span 1/3 of the screen - default: - throw Assert.createIllegalStateFailException( - "Invalid row type: " + positionToRowTypeMap.get(position)); + @Override + public void onItemMove(int fromPosition, int toPosition) { + if (fromPosition < toPosition) { + for (int i = fromPosition; i < toPosition && i < speedDialUiItems.size() - 1; i++) { + Collections.swap(speedDialUiItems, i, i + 1); + } + } else { + for (int i = fromPosition - 1; i > toPosition; i--) { + Collections.swap(speedDialUiItems, i, i - 1); + } } + // TODO(calderwoodra): store pinned positions + notifyItemMoved(fromPosition, toPosition); + } + + @Override + public boolean canDropOver(ViewHolder target) { + return target instanceof FavoritesViewHolder; + } + + public void setItemTouchHelper(ItemTouchHelper itemTouchHelper) { + this.itemTouchHelper = itemTouchHelper; } } |