Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java |
| index 4048be5cddb9a19c98e00fda7e0cfad87b7b5782..ac9e2a5eb7878ba3a124f1a7202a25a1396ba541 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java |
| @@ -15,6 +15,7 @@ |
| import android.view.animation.Interpolator; |
| import org.chromium.base.Log; |
| +import org.chromium.base.annotations.SuppressFBWarnings; |
| import org.chromium.chrome.browser.ntp.NewTabPageLayout; |
| import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
| import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; |
| @@ -33,19 +34,37 @@ |
| */ |
| public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements SnippetsObserver { |
| private static final String TAG = "Ntp"; |
| + private static final Interpolator FADE_INTERPOLATOR = new FastOutLinearInInterpolator(); |
| private final NewTabPageManager mNewTabPageManager; |
| private final NewTabPageLayout mNewTabPageLayout; |
| private final AboveTheFoldListItem mAboveTheFoldListItem; |
| private final List<NewTabPageListItem> mNewTabPageListItems; |
| private final ItemTouchCallbacks mItemTouchCallbacks; |
| - |
| - private static final Interpolator FADE_INTERPOLATOR = new FastOutLinearInInterpolator(); |
| + private NewTabPageRecyclerView mRecyclerView; |
| private class ItemTouchCallbacks extends ItemTouchHelper.Callback { |
| @Override |
| public void onSwiped(ViewHolder viewHolder, int direction) { |
| - NewTabPageAdapter.this.dismissItem(viewHolder.getAdapterPosition()); |
| + mRecyclerView.onItemDismissStarted(viewHolder.itemView); |
| + |
| + // This is going to have a effect at the next layout pass, which is going to happen |
| + // after the item has been removed from the adapter and the layout. |
| + mRecyclerView.refreshBottomSpacing(); |
| + |
| + NewTabPageAdapter.this.dismissItem(viewHolder); |
| + } |
| + |
| + @Override |
| + public void clearView(RecyclerView recyclerView, ViewHolder viewHolder) { |
| + // clearView() is called when an interaction with the item is finished, which does |
| + // not mean that the user went all the way and dismissed the item before releasing it. |
| + // We need to check that the item has been removed. |
| + if (viewHolder.getAdapterPosition() == RecyclerView.NO_POSITION) { |
| + mRecyclerView.onItemDismissFinished(viewHolder.itemView); |
| + } |
| + |
| + super.clearView(recyclerView, viewHolder); |
| } |
| @Override |
| @@ -123,6 +142,7 @@ public void onSnippetsReceived(List<SnippetArticle> listSnippets) { |
| mNewTabPageListItems.add(mAboveTheFoldListItem); |
| mNewTabPageListItems.add(new SnippetHeaderListItem()); |
| mNewTabPageListItems.addAll(listSnippets); |
| + mNewTabPageListItems.add(new SpacingListItem()); |
| notifyDataSetChanged(); |
| @@ -151,6 +171,10 @@ public NewTabPageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
| SnippetArticleViewHolder.createView(parent), mNewTabPageManager); |
| } |
| + if (viewType == NewTabPageListItem.VIEW_TYPE_SPACING) { |
| + return new NewTabPageViewHolder(SpacingListItem.createView(parent)); |
| + } |
| + |
| return null; |
| } |
| @@ -164,20 +188,25 @@ public int getItemCount() { |
| return mNewTabPageListItems.size(); |
| } |
| - private void dismissItem(int position) { |
| - assert getItemViewType(position) == NewTabPageListItem.VIEW_TYPE_SNIPPET; |
| - mNewTabPageManager.onSnippetDismissed((SnippetArticle) mNewTabPageListItems.get(position)); |
| - mNewTabPageListItems.remove(position); |
| + @SuppressFBWarnings("BC_UNCONFIRMED_CAST") |
|
gone
2016/05/16 23:47:29
Adding a type of FindBugs suppression is uglier th
dgn
2016/05/17 09:16:53
Done. Do you know who FindBugs doesn't complain fo
gone
2016/05/17 16:58:19
Honestly don't have a clue :/ I normally just do
|
| + @Override |
| + public void onAttachedToRecyclerView(RecyclerView recyclerView) { |
| + super.onAttachedToRecyclerView(recyclerView); |
| - int numRemovedItems = 1; |
| - if (mNewTabPageListItems.size() == 2) { |
| - // There's only the above-the-fold item and the header left, so we remove the header. |
| - position = 1; // When present, the header is always at that position. |
| - mNewTabPageListItems.remove(position); |
| - ++numRemovedItems; |
| - } |
| + // We are assuming for now that the adapter is used with a single RecyclerView. |
| + // Getting the reference as we are doing here is going to be broken if that changes. |
| + assert mRecyclerView == null; |
| + mRecyclerView = (NewTabPageRecyclerView) recyclerView; |
| + } |
| + |
| + private void dismissItem(ViewHolder itemViewHolder) { |
| + assert itemViewHolder.getItemViewType() == NewTabPageListItem.VIEW_TYPE_SNIPPET; |
| - notifyItemRangeRemoved(position, numRemovedItems); |
| + int position = itemViewHolder.getAdapterPosition(); |
| + mNewTabPageManager.onSnippetDismissed((SnippetArticle) mNewTabPageListItems.get(position)); |
| + |
| + mNewTabPageListItems.remove(position); |
| + notifyItemRemoved(position); |
| } |
| List<NewTabPageListItem> getItemsForTesting() { |