| 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 b854b8f789c8535303f75613438185ca85642013..aa2fab2040a2760bd113edb1fdf1afa7f78708a6 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 | 
| @@ -32,7 +32,6 @@ import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; | 
| import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; | 
|  | 
| import java.util.ArrayList; | 
| -import java.util.Collections; | 
| import java.util.LinkedHashMap; | 
| import java.util.List; | 
| import java.util.Map; | 
| @@ -118,10 +117,10 @@ public class NewTabPageAdapter | 
|  | 
| // We use our own implementation of the dismissal animation, so we don't call the | 
| // parent implementation. (by default it changes the translation-X and elevation) | 
| -            mRecyclerView.updateViewStateForDismiss(dX, viewHolder); | 
| +            mRecyclerView.updateViewStateForDismiss(dX, (NewTabPageViewHolder) viewHolder); | 
|  | 
| // If there is another item that should be animated at the same time, do the same to it. | 
| -            ViewHolder siblingViewHolder = getDismissSibling(viewHolder); | 
| +            NewTabPageViewHolder siblingViewHolder = getDismissSibling(viewHolder); | 
| if (siblingViewHolder != null) { | 
| mRecyclerView.updateViewStateForDismiss(dX, siblingViewHolder); | 
| } | 
| @@ -388,26 +387,14 @@ public class NewTabPageAdapter | 
| return RecyclerView.NO_POSITION; | 
| } | 
|  | 
| -    public int getSignInPromoPosition() { | 
| -        return getChildPositionOffset(mSigninPromo); | 
| -    } | 
| - | 
| -    public int getBottomSpacerPosition() { | 
| +    int getBottomSpacerPosition() { | 
| return getChildPositionOffset(mBottomSpacer); | 
| } | 
|  | 
| -    public int getLastContentItemPosition() { | 
| +    int getLastContentItemPosition() { | 
| return getChildPositionOffset(hasAllBeenDismissed() ? mAllDismissed : mFooter); | 
| } | 
|  | 
| -    public int getSuggestionPosition(SnippetArticle article) { | 
| -        for (int i = 0; i < mRoot.getItemCount(); i++) { | 
| -            SnippetArticle articleToCheck = mRoot.getSuggestionAt(i); | 
| -            if (articleToCheck != null && articleToCheck.equals(article)) return i; | 
| -        } | 
| -        return RecyclerView.NO_POSITION; | 
| -    } | 
| - | 
| private void setSuggestions(@CategoryInt int category, List<SnippetArticle> suggestions, | 
| @CategoryStatusEnum int status) { | 
| // Count the number of suggestions before this category. | 
| @@ -560,24 +547,16 @@ public class NewTabPageAdapter | 
| /** | 
| * Returns another view holder that should be dismissed at the same time as the provided one. | 
| */ | 
| -    public ViewHolder getDismissSibling(ViewHolder viewHolder) { | 
| +    public NewTabPageViewHolder getDismissSibling(ViewHolder viewHolder) { | 
| int swipePos = viewHolder.getAdapterPosition(); | 
| int siblingPosDelta = mRoot.getDismissSiblingPosDelta(swipePos); | 
| if (siblingPosDelta == 0) return null; | 
|  | 
| -        return mRecyclerView.findViewHolderForAdapterPosition(siblingPosDelta + swipePos); | 
| +        return (NewTabPageViewHolder) mRecyclerView.findViewHolderForAdapterPosition( | 
| +                siblingPosDelta + swipePos); | 
| } | 
|  | 
| -    /** | 
| -     * @return The info associated to the provided category. | 
| -     * @throws NullPointerException if {@code category} isn't currently registered with the adapter. | 
| -     * */ | 
| -    public SuggestionsCategoryInfo getCategoryInfo(@CategoryInt int category) { | 
| -        return mSections.get(category).getCategoryInfo(); | 
| -    } | 
| - | 
| -    @VisibleForTesting | 
| -    public boolean hasAllBeenDismissed() { | 
| +    private boolean hasAllBeenDismissed() { | 
| return mSections.isEmpty() && !mSigninPromo.isVisible(); | 
| } | 
|  | 
| @@ -601,20 +580,13 @@ public class NewTabPageAdapter | 
| * @return Returns the {@link SuggestionsSection} that contains the item at | 
| *     {@code itemPosition}, or null if the item is not part of one. | 
| */ | 
| -    @VisibleForTesting | 
| -    SuggestionsSection getSuggestionsSection(int itemPosition) { | 
| +    private SuggestionsSection getSuggestionsSection(int itemPosition) { | 
| TreeNode child = mRoot.getChildForPosition(itemPosition); | 
| if (!(child instanceof SuggestionsSection)) return null; | 
| return (SuggestionsSection) child; | 
| } | 
|  | 
| -    @VisibleForTesting | 
| -    List<TreeNode> getChildren() { | 
| -        return Collections.unmodifiableList(mChildren); | 
| -    } | 
| - | 
| -    @VisibleForTesting | 
| -    int getChildPositionOffset(TreeNode child) { | 
| +    private int getChildPositionOffset(TreeNode child) { | 
| return mRoot.getStartingOffsetForChild(child); | 
| } | 
|  | 
| @@ -632,12 +604,20 @@ public class NewTabPageAdapter | 
| return RecyclerView.NO_POSITION; | 
| } | 
|  | 
| -    private void announceItemRemoved(String suggestionTitle) { | 
| +    SuggestionsSection getSectionForTesting(@CategoryInt int category) { | 
| +        return mSections.get(category); | 
| +    } | 
| + | 
| +    InnerNode getRootForTesting() { | 
| +        return mRoot; | 
| +    } | 
| + | 
| +    private void announceItemRemoved(String itemTitle) { | 
| // In tests the RecyclerView can be null. | 
| if (mRecyclerView == null) return; | 
|  | 
| mRecyclerView.announceForAccessibility(mRecyclerView.getResources().getString( | 
| -                R.string.ntp_accessibility_item_removed, suggestionTitle)); | 
| +                R.string.ntp_accessibility_item_removed, itemTitle)); | 
| } | 
|  | 
| private void announceItemRemoved(@StringRes int stringToAnnounce) { | 
|  |