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

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

Issue 2024933002: [NTP Snippets] Show a status card when there are no available snippets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased and address comments Created 4 years, 6 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 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;
}

Powered by Google App Engine
This is Rietveld 408576698