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 c00cf332f8721018cf024b6ebf5eee8cfaddfeb2..4ba9f41115b5462154467e02b7580fc43b3d47c0 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 |
@@ -26,6 +26,7 @@ |
import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; |
import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder; |
import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; |
+import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig; |
import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; |
import java.util.ArrayList; |
@@ -138,6 +139,24 @@ public NewTabPageAdapter(NewTabPageManager manager, View aboveTheFoldView, UiCon |
protected List<TreeNode> getChildren() { |
return mChildren; |
} |
+ |
+ @Override |
+ public void onItemRangeChanged(TreeNode child, int index, int count) { |
+ if (mChildren.isEmpty()) return; // The sections have not been initialised yet. |
+ super.onItemRangeChanged(child, index, count); |
+ } |
+ |
+ @Override |
+ public void onItemRangeInserted(TreeNode child, int index, int count) { |
+ if (mChildren.isEmpty()) return; // The sections have not been initialised yet. |
+ super.onItemRangeInserted(child, index, count); |
+ } |
+ |
+ @Override |
+ public void onItemRangeRemoved(TreeNode child, int index, int count) { |
+ if (mChildren.isEmpty()) return; // The sections have not been initialised yet. |
+ super.onItemRangeRemoved(child, index, count); |
+ } |
}; |
mSigninPromo = new SignInPromo(mRoot, this); |
@@ -155,6 +174,7 @@ public NewTabPageAdapter(NewTabPageManager manager, View aboveTheFoldView, UiCon |
*/ |
public void resetSections(boolean alwaysAllowEmptySections) { |
mSections.clear(); |
+ mChildren.clear(); |
SuggestionsSource suggestionsSource = mNewTabPageManager.getSuggestionsSource(); |
int[] categories = suggestionsSource.getCategories(); |
@@ -341,11 +361,7 @@ public int getAboveTheFoldPosition() { |
} |
public int getFirstHeaderPosition() { |
- int count = getItemCount(); |
- for (int i = 0; i < count; i++) { |
- if (getItemViewType(i) == ItemViewType.HEADER) return i; |
- } |
- return RecyclerView.NO_POSITION; |
+ return getFirstPositionForType(ItemViewType.HEADER); |
} |
public int getFirstCardPosition() { |
@@ -355,10 +371,6 @@ public int getFirstCardPosition() { |
return RecyclerView.NO_POSITION; |
} |
- public int getFooterPosition() { |
- return getChildPositionOffset(mFooter); |
- } |
- |
public int getBottomSpacerPosition() { |
return getChildPositionOffset(mBottomSpacer); |
} |
@@ -409,17 +421,27 @@ private void updateChildren() { |
notifyDataSetChanged(); |
} |
+ private void updateAllDismissedVisibility() { |
+ boolean showAllDismissed = hasAllBeenDismissed(); |
+ if (showAllDismissed == mChildren.contains(mAllDismissed)) return; |
+ |
+ if (showAllDismissed) { |
+ assert mChildren.contains(mFooter); |
+ mChildren.set(mChildren.indexOf(mFooter), mAllDismissed); |
+ } else { |
+ assert mChildren.contains(mAllDismissed); |
+ mChildren.set(mChildren.indexOf(mAllDismissed), mFooter); |
+ } |
+ notifyItemChanged(getLastContentItemPosition()); |
+ } |
+ |
private void removeSection(SuggestionsSection section) { |
mSections.remove(section.getCategory()); |
int startPos = getChildPositionOffset(section); |
mChildren.remove(section); |
notifyItemRangeRemoved(startPos, section.getItemCount()); |
- if (hasAllBeenDismissed()) { |
- int footerPosition = getFooterPosition(); |
- mChildren.set(mChildren.indexOf(mFooter), mAllDismissed); |
- notifyItemChanged(footerPosition); |
- } |
+ updateAllDismissedVisibility(); |
notifyItemChanged(getBottomSpacerPosition()); |
} |
@@ -427,24 +449,25 @@ private void removeSection(SuggestionsSection section) { |
@Override |
public void onItemRangeChanged(TreeNode child, int itemPosition, int itemCount) { |
assert child == mRoot; |
- if (mChildren.isEmpty()) return; // The sections have not been initialised yet. |
notifyItemRangeChanged(itemPosition, itemCount); |
} |
@Override |
public void onItemRangeInserted(TreeNode child, int itemPosition, int itemCount) { |
assert child == mRoot; |
- if (mChildren.isEmpty()) return; // The sections have not been initialised yet. |
notifyItemRangeInserted(itemPosition, itemCount); |
notifyItemChanged(getItemCount() - 1); // Refresh the spacer too. |
+ |
+ updateAllDismissedVisibility(); |
} |
@Override |
public void onItemRangeRemoved(TreeNode child, int itemPosition, int itemCount) { |
assert child == mRoot; |
- if (mChildren.isEmpty()) return; // The sections have not been initialised yet. |
notifyItemRangeRemoved(itemPosition, itemCount); |
notifyItemChanged(getItemCount() - 1); // Refresh the spacer too. |
+ |
+ updateAllDismissedVisibility(); |
} |
@Override |
@@ -492,6 +515,7 @@ public void dismissItem(int position) { |
} |
private void dismissSection(SuggestionsSection section) { |
+ assert SnippetsConfig.isSectionDismissalEnabled(); |
mNewTabPageManager.getSuggestionsSource().dismissCategory(section.getCategory()); |
removeSection(section); |
} |
@@ -517,12 +541,6 @@ private void dismissSuggestion(int position) { |
private void dismissPromo() { |
// TODO(dgn): accessibility announcement. |
mSigninPromo.dismiss(); |
- |
- if (hasAllBeenDismissed()) { |
- int footerPosition = getFooterPosition(); |
- mChildren.set(mChildren.indexOf(mFooter), mAllDismissed); |
- notifyItemChanged(footerPosition); |
- } |
} |
/** |
@@ -567,6 +585,15 @@ SnippetArticle getSuggestionAt(int position) { |
return mRoot.getSuggestionAt(position); |
} |
+ @VisibleForTesting |
+ int getFirstPositionForType(@ItemViewType int viewType) { |
+ int count = getItemCount(); |
+ for (int i = 0; i < count; i++) { |
+ if (getItemViewType(i) == viewType) return i; |
+ } |
+ return RecyclerView.NO_POSITION; |
+ } |
+ |
private void announceItemRemoved(String suggestionTitle) { |
// In tests the RecyclerView can be null. |
if (mRecyclerView == null) return; |