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 72d428aa54dc5800a3afaa018915ce8ef7be15d6..217949aa121b78293dc4e0111fbf2811855e41e9 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 |
@@ -16,6 +16,7 @@ |
import org.chromium.chrome.browser.ntp.NewTabPageLayout; |
import org.chromium.chrome.browser.ntp.NewTabPageUma; |
import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
+import org.chromium.chrome.browser.ntp.snippets.DisabledReason; |
import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; |
import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder; |
import org.chromium.chrome.browser.ntp.snippets.SnippetHeaderListItem; |
@@ -35,10 +36,17 @@ |
public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements SnippetsObserver { |
private static final String TAG = "Ntp"; |
+ /** |
+ * Position of the first card in the adapter. This is always going to be a valid position, |
+ * occupied either by a card showing content or by a status card. |
+ */ |
+ private static final int FIRST_CARD_POSITION = 2; |
+ |
private final NewTabPageManager mNewTabPageManager; |
private final NewTabPageLayout mNewTabPageLayout; |
private final AboveTheFoldListItem mAboveTheFoldListItem; |
private final SnippetHeaderListItem mHeaderListItem; |
+ private StatusListItem mStatusListItem; |
private final List<NewTabPageListItem> mNewTabPageListItems; |
private final ItemTouchCallbacks mItemTouchCallbacks; |
private NewTabPageRecyclerView mRecyclerView; |
@@ -113,6 +121,7 @@ public NewTabPageAdapter(NewTabPageManager manager, NewTabPageLayout newTabPageL |
mNewTabPageListItems = new ArrayList<NewTabPageListItem>(); |
mWantsSnippets = true; |
mSnippetsBridge = snippetsBridge; |
+ mStatusListItem = StatusListItem.create(snippetsBridge.getDisabledReason(), this, manager); |
loadSnippets(new ArrayList<SnippetArticle>()); |
mSnippetsBridge.setObserver(this); |
@@ -141,10 +150,22 @@ public void onSnippetsReceived(List<SnippetArticle> listSnippets) { |
} |
@Override |
- public void onSnippetsDisabled() { |
- // Clear the snippets, wait for new updates in case the service is reenabled later. |
- loadSnippets(new ArrayList<SnippetArticle>()); |
- mWantsSnippets = true; |
+ public void onDisabledReasonChanged(int disabledReason) { |
+ // Observers should not be registered for that state |
+ assert disabledReason != DisabledReason.EXPLICITLY_DISABLED; |
+ |
+ mStatusListItem = StatusListItem.create(disabledReason, this, mNewTabPageManager); |
+ if (getItemCount() > 4 /* above-the-fold + header + card + spacing */) { |
+ // We had many items, implies that the service was previously enabled and just |
+ // transitioned. to a disabled state. We now clear it. |
+ loadSnippets(new ArrayList<SnippetArticle>()); |
+ } else { |
+ mNewTabPageListItems.set(FIRST_CARD_POSITION, mStatusListItem); |
+ notifyItemRangeChanged(FIRST_CARD_POSITION, 2); // Update both the first card and the |
+ // spacing item coming after it. |
+ } |
+ |
+ if (disabledReason == DisabledReason.NONE) mWantsSnippets = true; |
} |
@Override |
@@ -174,7 +195,7 @@ public NewTabPageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
} |
if (viewType == NewTabPageListItem.VIEW_TYPE_STATUS) { |
- return new StatusListItem.ViewHolder(mRecyclerView, this); |
+ return new StatusListItem.ViewHolder(mRecyclerView); |
} |
return null; |
@@ -217,7 +238,7 @@ private void loadSnippets(List<SnippetArticle> listSnippets) { |
if (hasContentToShow) { |
mNewTabPageListItems.addAll(listSnippets); |
} else { |
- mNewTabPageListItems.add(new StatusListItem()); |
+ mNewTabPageListItems.add(mStatusListItem); |
} |
mNewTabPageListItems.add(new SpacingListItem()); |
@@ -263,7 +284,7 @@ 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()); |
+ mNewTabPageListItems.add(FIRST_CARD_POSITION, mStatusListItem); |
// We also want to refresh the header and the bottom padding. |
mHeaderListItem.setVisible(false); |