| 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 304b18e9a4d8e3387aebb8fac4bf57935f1b184b..b9673f2442429cf91056b8bce63218298d319594 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
|
| @@ -19,15 +19,12 @@ import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
|
| import org.chromium.chrome.browser.ntp.UiConfig;
|
| import org.chromium.chrome.browser.ntp.snippets.CategoryStatus;
|
| import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnum;
|
| -import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
|
| -import org.chromium.chrome.browser.ntp.snippets.KnownCategories.KnownCategoriesEnum;
|
| import org.chromium.chrome.browser.ntp.snippets.SnippetArticleListItem;
|
| 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;
|
| -import org.chromium.chrome.browser.ntp.snippets.SnippetsSource;
|
| -import org.chromium.chrome.browser.ntp.snippets.SnippetsSource.SnippetsObserver;
|
| +import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
|
|
|
| import java.util.ArrayList;
|
| import java.util.Collections;
|
| @@ -41,12 +38,13 @@ import java.util.TreeMap;
|
| * 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 NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements SnippetsObserver {
|
| +public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
|
| + implements SuggestionsSource.Observer {
|
| private static final String TAG = "Ntp";
|
|
|
| private final NewTabPageManager mNewTabPageManager;
|
| private final NewTabPageLayout mNewTabPageLayout;
|
| - private SnippetsSource mSnippetsSource;
|
| + private SuggestionsSource mSuggestionsSource;
|
| private final UiConfig mUiConfig;
|
| private final ItemTouchCallbacks mItemTouchCallbacks = new ItemTouchCallbacks();
|
| private NewTabPageRecyclerView mRecyclerView;
|
| @@ -116,22 +114,22 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| * @param manager the NewTabPageManager to use to interact with the rest of the system.
|
| * @param newTabPageLayout the layout encapsulating all the above-the-fold elements
|
| * (logo, search box, most visited tiles)
|
| - * @param snippetsSource the bridge to interact with the snippets service.
|
| + * @param suggestionsSource the bridge to interact with the content suggestions service.
|
| * @param uiConfig the NTP UI configuration, to be passed to created views.
|
| */
|
| public NewTabPageAdapter(NewTabPageManager manager, NewTabPageLayout newTabPageLayout,
|
| - SnippetsSource snippetsSource, UiConfig uiConfig) {
|
| + SuggestionsSource suggestionsSource, UiConfig uiConfig) {
|
| mNewTabPageManager = manager;
|
| mNewTabPageLayout = newTabPageLayout;
|
| - mSnippetsSource = snippetsSource;
|
| + mSuggestionsSource = suggestionsSource;
|
| mUiConfig = uiConfig;
|
|
|
| - // TODO(mvanouwerkerk): Do not hard code ARTICLES. Maybe do not initialize an empty
|
| - // section in the constructor.
|
| - setSuggestions(KnownCategories.ARTICLES,
|
| - Collections.<SnippetArticleListItem>emptyList(),
|
| - snippetsSource.getCategoryStatus(KnownCategories.ARTICLES));
|
| - snippetsSource.setObserver(this);
|
| + for (int category : mSuggestionsSource.getCategories()) {
|
| + setSuggestions(category, suggestionsSource.getSuggestionsForCategory(category),
|
| + suggestionsSource.getCategoryStatus(category));
|
| + }
|
| + suggestionsSource.setObserver(this);
|
| + updateGroups();
|
| }
|
|
|
| /** Returns callbacks to configure the interactions with the RecyclerView's items. */
|
| @@ -140,31 +138,33 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| }
|
|
|
| @Override
|
| - public void onSuggestionsReceived(
|
| - @KnownCategoriesEnum int category, List<SnippetArticleListItem> suggestions) {
|
| + public void onNewSuggestions(int category) {
|
| // We never want to refresh the suggestions if we already have some content.
|
| if (mSections.containsKey(category) && mSections.get(category).hasSuggestions()) return;
|
|
|
| // The status may have changed while the suggestions were loading, perhaps they should not
|
| // be displayed any more.
|
| if (!SnippetsBridge.isCategoryStatusInitOrAvailable(
|
| - mSnippetsSource.getCategoryStatus(category))) {
|
| + mSuggestionsSource.getCategoryStatus(category))) {
|
| return;
|
| }
|
|
|
| + List<SnippetArticleListItem> suggestions =
|
| + mSuggestionsSource.getSuggestionsForCategory(category);
|
| +
|
| Log.d(TAG, "Received %d new suggestions for category %d.", suggestions.size(), category);
|
|
|
| // At first, there might be no suggestions available, we wait until they have been fetched.
|
| if (suggestions.isEmpty()) return;
|
|
|
| - setSuggestions(category, suggestions, mSnippetsSource.getCategoryStatus(category));
|
| + setSuggestions(category, suggestions, mSuggestionsSource.getCategoryStatus(category));
|
| + updateGroups();
|
|
|
| NewTabPageUma.recordSnippetAction(NewTabPageUma.SNIPPETS_ACTION_SHOWN);
|
| }
|
|
|
| @Override
|
| - public void onCategoryStatusChanged(
|
| - @KnownCategoriesEnum int category, @CategoryStatusEnum int status) {
|
| + public void onCategoryStatusChanged(int category, @CategoryStatusEnum int status) {
|
| // Observers should not be registered for this state.
|
| assert status != CategoryStatus.ALL_SUGGESTIONS_EXPLICITLY_DISABLED;
|
|
|
| @@ -178,6 +178,7 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| if (SnippetsBridge.isCategoryStatusAvailable(status) && section.hasSuggestions()) return;
|
|
|
| setSuggestions(category, Collections.<SnippetArticleListItem>emptyList(), status);
|
| + updateGroups();
|
| }
|
|
|
| @Override
|
| @@ -200,7 +201,7 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
|
|
| if (viewType == NewTabPageListItem.VIEW_TYPE_SNIPPET) {
|
| return new SnippetArticleViewHolder(
|
| - mRecyclerView, mNewTabPageManager, mSnippetsSource, mUiConfig);
|
| + mRecyclerView, mNewTabPageManager, mSuggestionsSource, mUiConfig);
|
| }
|
|
|
| if (viewType == NewTabPageListItem.VIEW_TYPE_SPACING) {
|
| @@ -245,11 +246,17 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| }
|
|
|
| public int getFirstCardPosition() {
|
| - return getFirstHeaderPosition() + 1;
|
| + // TODO(mvanouwerkerk): Don't rely on getFirstHeaderPosition() here.
|
| + int firstHeaderPosition = getFirstHeaderPosition();
|
| + if (firstHeaderPosition == RecyclerView.NO_POSITION) return RecyclerView.NO_POSITION;
|
| + return firstHeaderPosition + 1;
|
| }
|
|
|
| public int getLastContentItemPosition() {
|
| - return getBottomSpacerPosition() - 1;
|
| + // TODO(mvanouwerkerk): Don't rely on getBottomSpacerPosition() here.
|
| + int bottomSpacerPosition = getBottomSpacerPosition();
|
| + if (bottomSpacerPosition == RecyclerView.NO_POSITION) return RecyclerView.NO_POSITION;
|
| + return bottomSpacerPosition - 1;
|
| }
|
|
|
| public int getBottomSpacerPosition() {
|
| @@ -261,20 +268,23 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| SnippetsBridge.fetchSnippets(/*forceRequest=*/true);
|
| }
|
|
|
| - private void setSuggestions(@KnownCategoriesEnum int category,
|
| - List<SnippetArticleListItem> suggestions, @CategoryStatusEnum int status) {
|
| - mGroups.clear();
|
| - mGroups.add(mAboveTheFold);
|
| -
|
| + private void setSuggestions(int category, List<SnippetArticleListItem> suggestions,
|
| + @CategoryStatusEnum int status) {
|
| if (!mSections.containsKey(category)) {
|
| - mSections.put(category, new SuggestionsSection(suggestions, status, this, false));
|
| + SuggestionsCategoryInfo info = mSuggestionsSource.getCategoryInfo(category);
|
| + mSections.put(category, new SuggestionsSection(suggestions, status, info, this));
|
| } else {
|
| mSections.get(category).setSuggestions(suggestions, status, this);
|
| }
|
| + }
|
|
|
| + private void updateGroups() {
|
| + mGroups.clear();
|
| + mGroups.add(mAboveTheFold);
|
| mGroups.addAll(mSections.values());
|
| -
|
| - mGroups.add(mBottomSpacer);
|
| + if (!mSections.isEmpty()) {
|
| + mGroups.add(mBottomSpacer);
|
| + }
|
|
|
| // TODO(bauerb): Notify about a smaller range.
|
| notifyDataSetChanged();
|
| @@ -300,7 +310,7 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| int position = itemViewHolder.getAdapterPosition();
|
| SnippetArticleListItem suggestion = (SnippetArticleListItem) getItems().get(position);
|
|
|
| - mSnippetsSource.getSnippedVisited(suggestion, new Callback<Boolean>() {
|
| + mSuggestionsSource.getSuggestionVisited(suggestion, new Callback<Boolean>() {
|
| @Override
|
| public void onResult(Boolean result) {
|
| NewTabPageUma.recordSnippetAction(result
|
| @@ -309,7 +319,7 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
|
| }
|
| });
|
|
|
| - mSnippetsSource.discardSnippet(suggestion);
|
| + mSuggestionsSource.dismissSuggestion(suggestion);
|
| SuggestionsSection section = (SuggestionsSection) getGroup(position);
|
| section.dismissSuggestion(suggestion);
|
|
|
|
|