Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java

Issue 1928063002: [NTP Snippets] Fill space below the last snippet if necessary (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase, address comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 87449f57b3f78ea446720ed3c37907ff68df0335..1a0f7417f81bfc2b4ea37ddc54180ce5e1ec54fb 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
@@ -33,20 +33,38 @@
*/
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 NewTabPageRecyclerView mRecyclerView;
private boolean mWantsSnippets;
- private static final Interpolator FADE_INTERPOLATOR = new FastOutLinearInInterpolator();
-
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
@@ -146,6 +164,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;
}
@@ -174,24 +196,33 @@ private void loadSnippets(List<SnippetArticle> listSnippets) {
mNewTabPageListItems.add(mAboveTheFoldListItem);
mNewTabPageListItems.add(new SnippetHeaderListItem());
mNewTabPageListItems.addAll(listSnippets);
+ mNewTabPageListItems.add(new SpacingListItem());
notifyDataSetChanged();
}
- private void dismissItem(int position) {
- assert getItemViewType(position) == NewTabPageListItem.VIEW_TYPE_SNIPPET;
- mNewTabPageManager.onSnippetDismissed((SnippetArticle) mNewTabPageListItems.get(position));
- mNewTabPageListItems.remove(position);
+ @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;
+
+ // FindBugs chokes on the cast below when not checked, raising BC_UNCONFIRMED_CAST
+ assert recyclerView instanceof NewTabPageRecyclerView;
- notifyItemRangeRemoved(position, numRemovedItems);
+ mRecyclerView = (NewTabPageRecyclerView) recyclerView;
+ }
+
+ private void dismissItem(ViewHolder itemViewHolder) {
+ assert itemViewHolder.getItemViewType() == NewTabPageListItem.VIEW_TYPE_SNIPPET;
+
+ int position = itemViewHolder.getAdapterPosition();
+ mNewTabPageManager.onSnippetDismissed((SnippetArticle) mNewTabPageListItems.get(position));
+
+ mNewTabPageListItems.remove(position);
+ notifyItemRemoved(position);
}
List<NewTabPageListItem> getItemsForTesting() {

Powered by Google App Engine
This is Rietveld 408576698