| 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 d668f989b396ae0b0e0e444007df63b2a6794f6c..1a739f973a7bc489c7ba3c07facf70fef78e5ce0 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
|
| @@ -5,14 +5,11 @@
|
| package org.chromium.chrome.browser.ntp.cards;
|
|
|
| import android.graphics.Canvas;
|
| -import android.support.v4.view.animation.FastOutLinearInInterpolator;
|
| import android.support.v7.widget.RecyclerView;
|
| import android.support.v7.widget.RecyclerView.Adapter;
|
| import android.support.v7.widget.RecyclerView.ViewHolder;
|
| import android.support.v7.widget.helper.ItemTouchHelper;
|
| -import android.view.View;
|
| import android.view.ViewGroup;
|
| -import android.view.animation.Interpolator;
|
|
|
| import org.chromium.base.Log;
|
| import org.chromium.chrome.browser.ntp.NewTabPageLayout;
|
| @@ -21,6 +18,7 @@
|
| import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
|
| import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder;
|
| import org.chromium.chrome.browser.ntp.snippets.SnippetHeaderListItem;
|
| +import org.chromium.chrome.browser.ntp.snippets.SnippetHeaderViewHolder;
|
| import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge.SnippetsObserver;
|
|
|
| import java.util.ArrayList;
|
| @@ -34,11 +32,11 @@
|
| */
|
| 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 SnippetHeaderListItem mHeaderListItem;
|
| private final List<NewTabPageListItem> mNewTabPageListItems;
|
| private final ItemTouchCallbacks mItemTouchCallbacks;
|
| private NewTabPageRecyclerView mRecyclerView;
|
| @@ -49,11 +47,8 @@
|
| public void onSwiped(ViewHolder viewHolder, int direction) {
|
| 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);
|
| + addStatusCardIfNecessary();
|
| }
|
|
|
| @Override
|
| @@ -79,8 +74,7 @@ public int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder) {
|
| assert viewHolder instanceof NewTabPageViewHolder;
|
|
|
| int swipeFlags = 0;
|
| - NewTabPageViewHolder ntpViewHolder = (NewTabPageViewHolder) viewHolder;
|
| - if (ntpViewHolder.isDismissable()) {
|
| + if (((NewTabPageViewHolder) viewHolder).isDismissable()) {
|
| swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
|
| }
|
|
|
| @@ -90,10 +84,9 @@ public int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder) {
|
| @Override
|
| public void onChildDraw(Canvas c, RecyclerView recyclerView, ViewHolder viewHolder,
|
| float dX, float dY, int actionState, boolean isCurrentlyActive) {
|
| - View itemView = viewHolder.itemView;
|
| - float input = Math.abs(dX) / itemView.getMeasuredWidth();
|
| - float alpha = 1 - FADE_INTERPOLATOR.getInterpolation(input);
|
| - itemView.setAlpha(alpha);
|
| + assert viewHolder instanceof NewTabPageViewHolder;
|
| +
|
| + ((NewTabPageViewHolder) viewHolder).updateViewStateForDismiss(dX);
|
| super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
|
| }
|
| }
|
| @@ -110,10 +103,12 @@ public NewTabPageAdapter(NewTabPageManager manager, NewTabPageLayout newTabPageL
|
| mNewTabPageManager = manager;
|
| mNewTabPageLayout = newTabPageLayout;
|
| mAboveTheFoldListItem = new AboveTheFoldListItem();
|
| + mHeaderListItem = new SnippetHeaderListItem();
|
| mItemTouchCallbacks = new ItemTouchCallbacks();
|
| mNewTabPageListItems = new ArrayList<NewTabPageListItem>();
|
| - mNewTabPageListItems.add(mAboveTheFoldListItem);
|
| mWantsSnippets = true;
|
| +
|
| + loadSnippets(new ArrayList<SnippetArticle>());
|
| mNewTabPageManager.setSnippetsObserver(this);
|
| }
|
|
|
| @@ -154,23 +149,28 @@ public int getItemViewType(int position) {
|
|
|
| @Override
|
| public NewTabPageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
| + assert parent == mRecyclerView;
|
| +
|
| if (viewType == NewTabPageListItem.VIEW_TYPE_ABOVE_THE_FOLD) {
|
| return new NewTabPageViewHolder(mNewTabPageLayout);
|
| }
|
|
|
| if (viewType == NewTabPageListItem.VIEW_TYPE_HEADER) {
|
| - return new NewTabPageViewHolder(SnippetHeaderListItem.createView(parent));
|
| + return new SnippetHeaderViewHolder(SnippetHeaderListItem.createView(parent));
|
| }
|
|
|
| if (viewType == NewTabPageListItem.VIEW_TYPE_SNIPPET) {
|
| - return new SnippetArticleViewHolder(
|
| - SnippetArticleViewHolder.createView(parent), mNewTabPageManager);
|
| + return new SnippetArticleViewHolder(mRecyclerView, mNewTabPageManager);
|
| }
|
|
|
| if (viewType == NewTabPageListItem.VIEW_TYPE_SPACING) {
|
| return new NewTabPageViewHolder(SpacingListItem.createView(parent));
|
| }
|
|
|
| + if (viewType == NewTabPageListItem.VIEW_TYPE_STATUS) {
|
| + return new StatusListItem.ViewHolder(mRecyclerView, this);
|
| + }
|
| +
|
| return null;
|
| }
|
|
|
| @@ -184,6 +184,12 @@ public int getItemCount() {
|
| return mNewTabPageListItems.size();
|
| }
|
|
|
| + /** Start a request for new snippets. */
|
| + public void reloadSnippets() {
|
| + mWantsSnippets = true;
|
| + mNewTabPageManager.fetchSnippets();
|
| + }
|
| +
|
| private void loadSnippets(List<SnippetArticle> listSnippets) {
|
| // Copy thumbnails over
|
| for (SnippetArticle newSnippet : listSnippets) {
|
| @@ -195,10 +201,19 @@ private void loadSnippets(List<SnippetArticle> listSnippets) {
|
| .getThumbnailBitmap());
|
| }
|
|
|
| + boolean hasContentToShow = !listSnippets.isEmpty();
|
| + mHeaderListItem.setVisible(hasContentToShow);
|
| +
|
| mNewTabPageListItems.clear();
|
| mNewTabPageListItems.add(mAboveTheFoldListItem);
|
| - mNewTabPageListItems.add(new SnippetHeaderListItem());
|
| - mNewTabPageListItems.addAll(listSnippets);
|
| + mNewTabPageListItems.add(mHeaderListItem);
|
| +
|
| + if (hasContentToShow) {
|
| + mNewTabPageListItems.addAll(listSnippets);
|
| + } else {
|
| + mNewTabPageListItems.add(new StatusListItem());
|
| + }
|
| +
|
| mNewTabPageListItems.add(new SpacingListItem());
|
|
|
| notifyDataSetChanged();
|
| @@ -228,6 +243,18 @@ private void dismissItem(ViewHolder itemViewHolder) {
|
| notifyItemRemoved(position);
|
| }
|
|
|
| + private void addStatusCardIfNecessary() {
|
| + if (mNewTabPageListItems.size() == 3 /* above-the-fold + header + spacing */) {
|
| + // TODO(dgn) hack until we refactor the entire class with sections, etc.
|
| + // (see https://crbug.com/616090)
|
| + mNewTabPageListItems.add(2, new StatusListItem());
|
| +
|
| + // We also want to refresh the header and the bottom padding.
|
| + mHeaderListItem.setVisible(false);
|
| + notifyDataSetChanged();
|
| + }
|
| + }
|
| +
|
| List<NewTabPageListItem> getItemsForTesting() {
|
| return mNewTabPageListItems;
|
| }
|
|
|