Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCardsManager.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCardsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCardsManager.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..65f90ea4a154c58dd70ec27fd299d1a8fafc5bb6 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCardsManager.java |
@@ -0,0 +1,150 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.ntp; |
+ |
+import android.support.v7.widget.RecyclerView.Adapter; |
+import android.view.ViewGroup; |
+ |
+import org.chromium.chrome.browser.ntp.snippets.SnippetCardViewHolder; |
+import org.chromium.chrome.browser.ntp.snippets.SnippetHeaderViewHolder; |
+import org.chromium.chrome.browser.ntp.snippets.SnippetsManager; |
+import org.chromium.chrome.browser.ntp.snippets.SnippetsManager.SnippetsManagerObserver; |
+ |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
+/** |
+ * A class that handles merging above the fold elements and below the fold cards into an adapter |
+ * that will be used to back the NTP RecyclerView. The first element in the adapter should always be |
+ * the above-the-fold view (containing the logo, search box, and most visited tiles) and subsequent |
+ * elements will be the cards shown to the user |
+ */ |
+public class NewTabPageCardsManager extends Adapter<NewTabPageViewHolder> |
newt (away)
2016/03/24 19:47:38
I think NewTabPageAdapter is a better name here. T
dgn
2016/03/28 21:33:02
Done.
|
+ implements SnippetsManagerObserver { |
+ /** |
+ * Describes the above the fold item |
newt (away)
2016/03/24 19:47:38
This comment is rather vague. Could you make it mo
dgn
2016/03/28 21:33:02
Done.
|
+ */ |
+ public static final int SNIPPET_ITEM_ABOVE_THE_FOLD = 1; |
newt (away)
2016/03/24 19:47:38
can these type constants be private?
dgn
2016/03/28 21:33:02
It needs to be used at least by NewTabPageListItem
|
+ /** |
+ * Describes the header of a group of similar card snippets |
+ */ |
+ public static final int SNIPPET_ITEM_TYPE_HEADER = 2; |
+ /** |
+ * Describes a single card snippet |
+ */ |
+ public static final int SNIPPET_ITEM_TYPE_SNIPPET = 3; |
+ |
+ /** |
+ * Base type for anything to add to the new tab page |
+ */ |
+ public interface NewTabPageListItem { |
+ /** |
+ * Returns the type of this snippet item (SNIPPET_ITEM_TYPE_HEADER or |
+ * SNIPPET_ITEM_TYPE_SNIPPET). This is so we can distinguish between different elements |
+ * that are held in a single RecyclerView holder. |
+ * |
+ * @return the type of this list item. |
+ */ |
+ public int getType(); |
+ } |
+ |
+ /** |
+ * Represents the an item in the RecyclerView that will hold the above the fold contents for the |
+ * NTP |
+ */ |
+ static class AboveTheFoldListItem implements NewTabPageListItem { |
newt (away)
2016/03/24 19:47:38
make this class and the class below private, if po
dgn
2016/03/28 21:33:02
Done.
|
+ public AboveTheFoldListItem() {} |
+ |
+ @Override |
+ public int getType() { |
+ return NewTabPageCardsManager.SNIPPET_ITEM_ABOVE_THE_FOLD; |
+ } |
+ } |
+ |
+ static class NewTabPageAboveTheFoldViewHolder extends NewTabPageViewHolder { |
newt (away)
2016/03/24 19:47:38
this name should parallel the class name above.
dgn
2016/03/28 21:33:02
Done.
|
+ public NewTabPageAboveTheFoldViewHolder(NewTabPageLayout view, SnippetsManager manager) { |
+ super(view, manager); |
+ } |
+ |
+ @Override |
+ public void onBindViewHolder(NewTabPageListItem snippetItem) { |
+ // nothing to do |
+ } |
+ } |
+ |
+ private final NewTabPageLayout mNewTabPageLayout; |
+ private final AboveTheFoldListItem mNewTabPageAboveTheFoldItem; |
+ private final SnippetsManager mSnippetsManager; |
+ private List<NewTabPageListItem> mNewTabPageListItems; |
newt (away)
2016/03/24 19:47:38
might as well make this final too
dgn
2016/03/28 21:33:02
Done.
|
+ |
+ /** |
+ * Constructor to create the manager for all the cards to display on the NTP |
+ * |
+ * @param snippetsManager the SnippetsManager to use |
+ * @param newTabPageLayout the layout encapsulating all the above-the-fold elements |
+ * (logo, search box, most visited tiles) |
+ */ |
+ public NewTabPageCardsManager( |
+ SnippetsManager snippetsManager, NewTabPageLayout newTabPageLayout) { |
+ mNewTabPageLayout = newTabPageLayout; |
+ mSnippetsManager = snippetsManager; |
+ mNewTabPageAboveTheFoldItem = new AboveTheFoldListItem(); |
newt (away)
2016/03/24 19:47:38
Likewise, this member variable name should match t
dgn
2016/03/28 21:33:02
Done.
|
+ mNewTabPageListItems = new ArrayList<NewTabPageListItem>(); |
+ mNewTabPageListItems.add(mNewTabPageAboveTheFoldItem); |
+ |
+ mSnippetsManager.setObserver(this); |
+ } |
+ |
+ @Override |
+ public void onSnippetsReceived(List<NewTabPageListItem> listSnippets) { |
+ setSnippetListItems(listSnippets); |
+ } |
+ |
+ /** |
+ * Sets the list of items to display in the snippets RecyclerView |
+ * |
+ * @param listItems the new list of items to display |
+ */ |
+ public void setSnippetListItems(List<NewTabPageListItem> listItems) { |
+ mNewTabPageListItems.clear(); |
+ mNewTabPageListItems.add(mNewTabPageAboveTheFoldItem); |
+ mNewTabPageListItems.addAll(listItems); |
+ notifyDataSetChanged(); |
+ } |
+ |
+ @Override |
+ public int getItemViewType(int position) { |
+ return mNewTabPageListItems.get(position).getType(); |
+ } |
+ |
+ @Override |
+ public NewTabPageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
+ if (viewType == NewTabPageCardsManager.SNIPPET_ITEM_ABOVE_THE_FOLD) { |
+ return new NewTabPageAboveTheFoldViewHolder(mNewTabPageLayout, mSnippetsManager); |
+ } |
+ |
+ if (viewType == NewTabPageCardsManager.SNIPPET_ITEM_TYPE_HEADER) { |
+ return new SnippetHeaderViewHolder( |
+ SnippetHeaderViewHolder.createView(parent), mSnippetsManager); |
+ } |
+ |
+ if (viewType == NewTabPageCardsManager.SNIPPET_ITEM_TYPE_SNIPPET) { |
+ return new SnippetCardViewHolder( |
+ SnippetCardViewHolder.createView(parent), mSnippetsManager); |
+ } |
+ |
+ return null; |
+ } |
+ |
+ @Override |
+ public void onBindViewHolder(NewTabPageViewHolder holder, final int position) { |
+ holder.onBindViewHolder(mNewTabPageListItems.get(position)); |
+ } |
+ |
+ @Override |
+ public int getItemCount() { |
+ return mNewTabPageListItems.size(); |
+ } |
+} |