| Index: chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
 | 
| diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
 | 
| index a496b755eface470e7984ecce199aa9fed75a4aa..e109cbe2f3ed28dd5b2adca5199853192ccb8071 100644
 | 
| --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
 | 
| +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
 | 
| @@ -10,7 +10,6 @@ import static org.junit.Assert.assertThat;
 | 
|  import static org.junit.Assert.assertTrue;
 | 
|  import static org.junit.Assert.fail;
 | 
|  import static org.mockito.ArgumentMatchers.any;
 | 
| -import static org.mockito.ArgumentMatchers.anyString;
 | 
|  import static org.mockito.Mockito.doNothing;
 | 
|  import static org.mockito.Mockito.mock;
 | 
|  import static org.mockito.Mockito.spy;
 | 
| @@ -19,6 +18,7 @@ import static org.mockito.Mockito.verify;
 | 
|  import static org.mockito.Mockito.when;
 | 
|  
 | 
|  import android.support.annotation.Nullable;
 | 
| +import android.support.v7.widget.RecyclerView.AdapterDataObserver;
 | 
|  import android.view.ContextMenu;
 | 
|  import android.view.Menu;
 | 
|  import android.view.MenuItem.OnMenuItemClickListener;
 | 
| @@ -228,7 +228,7 @@ public class NewTabPageAdapterTest {
 | 
|          mSource = new FakeSuggestionsSource();
 | 
|          mSource.setStatusForCategory(category, CategoryStatus.INITIALIZING);
 | 
|          mSource.setInfoForCategory(category, createInfo(category, false, true));
 | 
| -        mAdapter = NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null);
 | 
|      }
 | 
|  
 | 
|      @After
 | 
| @@ -395,20 +395,20 @@ public class NewTabPageAdapterTest {
 | 
|          assertItemsFor();
 | 
|  
 | 
|          // Same when loading a new NTP.
 | 
| -        mAdapter = NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null);
 | 
|          assertItemsFor();
 | 
|  
 | 
|          // Same for CATEGORY_EXPLICITLY_DISABLED.
 | 
|          mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AVAILABLE);
 | 
|          mSource.setSuggestionsForCategory(KnownCategories.ARTICLES, snippets);
 | 
| -        mAdapter = NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null);
 | 
|          assertItemsFor(section(5));
 | 
|          mSource.setStatusForCategory(
 | 
|                  KnownCategories.ARTICLES, CategoryStatus.CATEGORY_EXPLICITLY_DISABLED);
 | 
|          assertItemsFor();
 | 
|  
 | 
|          // Same when loading a new NTP.
 | 
| -        mAdapter = NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null);
 | 
|          assertItemsFor();
 | 
|      }
 | 
|  
 | 
| @@ -429,7 +429,7 @@ public class NewTabPageAdapterTest {
 | 
|          assertItemsFor(section(4));
 | 
|  
 | 
|          // But it disappears when loading a new NTP.
 | 
| -        mAdapter = NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null);
 | 
|          assertItemsFor();
 | 
|      }
 | 
|  
 | 
| @@ -450,8 +450,7 @@ public class NewTabPageAdapterTest {
 | 
|          suggestionsSource.setInfoForCategory(category, createInfo(category, false, true));
 | 
|  
 | 
|          // 1.1 - Initial state
 | 
| -        mAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|          assertItemsFor(sectionWithStatusCard());
 | 
|  
 | 
|          // 1.2 - With suggestions
 | 
| @@ -474,8 +473,7 @@ public class NewTabPageAdapterTest {
 | 
|          suggestionsSource.setInfoForCategory(category, createInfo(category, false, false));
 | 
|  
 | 
|          // 2.1 - Initial state
 | 
| -        mAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|          assertItemsFor();
 | 
|  
 | 
|          // 2.2 - With suggestions
 | 
| @@ -506,8 +504,7 @@ public class NewTabPageAdapterTest {
 | 
|          suggestionsSource.setInfoForCategory(category, createInfo(category, true, true));
 | 
|  
 | 
|          // 1.1 - Initial state.
 | 
| -        mAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|          assertItemsFor(sectionWithStatusCardAndMoreButton());
 | 
|  
 | 
|          // 1.2 - With suggestions.
 | 
| @@ -530,8 +527,7 @@ public class NewTabPageAdapterTest {
 | 
|          suggestionsSource.setInfoForCategory(category, createInfo(category, false, true));
 | 
|  
 | 
|          // 2.1 - Initial state.
 | 
| -        mAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|          assertItemsFor(sectionWithStatusCard());
 | 
|  
 | 
|          // 2.2 - With suggestions.
 | 
| @@ -589,8 +585,7 @@ public class NewTabPageAdapterTest {
 | 
|          mSource.setInfoForCategory(dynamicCategory1, createInfo(dynamicCategory1, true, false));
 | 
|          mSource.setStatusForCategory(dynamicCategory1, CategoryStatus.AVAILABLE);
 | 
|          mSource.setSuggestionsForCategory(dynamicCategory1, dynamics1);
 | 
| -        mAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null); // Reload
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null); // Reload
 | 
|          assertItemsFor(section(3), sectionWithMoreButton(5));
 | 
|  
 | 
|          int dynamicCategory2 = 1011;
 | 
| @@ -598,8 +593,7 @@ public class NewTabPageAdapterTest {
 | 
|          mSource.setInfoForCategory(dynamicCategory2, createInfo(dynamicCategory1, false, false));
 | 
|          mSource.setStatusForCategory(dynamicCategory2, CategoryStatus.AVAILABLE);
 | 
|          mSource.setSuggestionsForCategory(dynamicCategory2, dynamics2);
 | 
| -        mAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(mSource), null, null); // Reload
 | 
| +        mAdapter = new NewTabPageAdapter(new MockNewTabPageManager(mSource), null, null); // Reload
 | 
|          assertItemsFor(section(3), sectionWithMoreButton(5), section(11));
 | 
|      }
 | 
|  
 | 
| @@ -617,7 +611,7 @@ public class NewTabPageAdapterTest {
 | 
|          registerCategory(suggestionsSource, KnownCategories.DOWNLOADS, 0);
 | 
|  
 | 
|          NewTabPageAdapter ntpAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +                new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|          List<ItemGroup> groups = ntpAdapter.getGroups();
 | 
|  
 | 
|          assertEquals(basicGroupCount + 4, groups.size());
 | 
| @@ -639,7 +633,7 @@ public class NewTabPageAdapterTest {
 | 
|          registerCategory(suggestionsSource, KnownCategories.BOOKMARKS, 0);
 | 
|  
 | 
|          ntpAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +                new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|          groups = ntpAdapter.getGroups();
 | 
|  
 | 
|          assertEquals(basicGroupCount + 4, groups.size());
 | 
| @@ -660,7 +654,7 @@ public class NewTabPageAdapterTest {
 | 
|          registerCategory(suggestionsSource, KnownCategories.DOWNLOADS, 0);
 | 
|  
 | 
|          ntpAdapter =
 | 
| -                NewTabPageAdapter.create(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +                new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
|  
 | 
|          // The adapter is already initialised, it will not accept new categories anymore.
 | 
|          registerCategory(suggestionsSource, 42, 1);
 | 
| @@ -686,10 +680,10 @@ public class NewTabPageAdapterTest {
 | 
|          doNothing().when(suggestionsSource).dismissSuggestion(any(SnippetArticle.class));
 | 
|  
 | 
|          registerCategory(suggestionsSource, KnownCategories.ARTICLES, 3);
 | 
| -        NewTabPageAdapter adapter = spy(
 | 
| -                new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null));
 | 
| -        adapter.finishInitialization();
 | 
| -        doNothing().when(adapter).announceItemRemoved(anyString());
 | 
| +        NewTabPageAdapter adapter =
 | 
| +                new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSource), null, null);
 | 
| +        AdapterDataObserver dataObserver = mock(AdapterDataObserver.class);
 | 
| +        adapter.registerAdapterDataObserver(dataObserver);
 | 
|  
 | 
|          // Adapter content:
 | 
|          // Idx | Item
 | 
| @@ -701,18 +695,21 @@ public class NewTabPageAdapterTest {
 | 
|          // 6   | Spacer
 | 
|  
 | 
|          adapter.dismissItem(3); // Dismiss the second suggestion of the second section.
 | 
| -        verify(adapter).notifyItemRemoved(3);
 | 
| +        verify(dataObserver).onItemRangeRemoved(3, 1);
 | 
| +        verify(dataObserver).onItemRangeChanged(5, 1, null);
 | 
|  
 | 
|          // Make sure the call with the updated position works properly.
 | 
|          adapter.dismissItem(3);
 | 
| -        verify(adapter, times(2)).notifyItemRemoved(3);
 | 
| +        verify(dataObserver, times(2)).onItemRangeRemoved(3, 1);
 | 
| +        verify(dataObserver).onItemRangeChanged(4, 1, null);
 | 
|  
 | 
|          // Dismiss the last suggestion in the section. We should now show the status card.
 | 
|          adapter.dismissItem(2);
 | 
| -        verify(adapter).notifyItemRemoved(2);
 | 
| -        verify(adapter).notifyItemInserted(2);
 | 
| -        verify(adapter).notifyItemInserted(3);
 | 
| -        verify(adapter).notifyItemInserted(4);
 | 
| +        verify(dataObserver).onItemRangeRemoved(2, 1);
 | 
| +        verify(dataObserver).onItemRangeInserted(2, 1);
 | 
| +        verify(dataObserver).onItemRangeInserted(3, 1);
 | 
| +        verify(dataObserver).onItemRangeInserted(4, 1);
 | 
| +        verify(dataObserver, times(4)).onItemRangeChanged(6, 1, null);
 | 
|  
 | 
|          // Adapter content:
 | 
|          // Idx | Item
 | 
| @@ -730,9 +727,10 @@ public class NewTabPageAdapterTest {
 | 
|          suggestionsSource.setSuggestionsForCategory(
 | 
|                  KnownCategories.ARTICLES, createDummySuggestions(newSuggestionCount));
 | 
|          adapter.onNewSuggestions(KnownCategories.ARTICLES);
 | 
| -        verify(adapter).notifyItemRangeChanged(2, changedCount);
 | 
| -        verify(adapter).notifyItemRangeInserted(
 | 
| -                2 + changedCount, newSuggestionCount - changedCount);
 | 
| +        verify(dataObserver).onItemRangeChanged(2, changedCount, null);
 | 
| +        verify(dataObserver)
 | 
| +                .onItemRangeInserted(2 + changedCount, newSuggestionCount - changedCount);
 | 
| +        verify(dataObserver).onItemRangeChanged(newSuggestionCount + 3, 1, null);
 | 
|  
 | 
|          // Adapter content:
 | 
|          // Idx | Item
 | 
| @@ -746,8 +744,10 @@ public class NewTabPageAdapterTest {
 | 
|          suggestionsSource.setSuggestionsForCategory(
 | 
|                  KnownCategories.ARTICLES, createDummySuggestions(0));
 | 
|          adapter.onCategoryStatusChanged(KnownCategories.ARTICLES, CategoryStatus.SIGNED_OUT);
 | 
| -        verify(adapter, times(2)).notifyItemRangeChanged(2, changedCount);
 | 
| -        verify(adapter).notifyItemRangeRemoved(2 + changedCount, newSuggestionCount - changedCount);
 | 
| +        verify(dataObserver, times(2)).onItemRangeChanged(2, changedCount, null);
 | 
| +        verify(dataObserver)
 | 
| +                .onItemRangeRemoved(2 + changedCount, newSuggestionCount - changedCount);
 | 
| +        verify(dataObserver, times(5)).onItemRangeChanged(6, 1, null);
 | 
|      }
 | 
|  
 | 
|      @Test
 | 
| @@ -756,7 +756,7 @@ public class NewTabPageAdapterTest {
 | 
|          when(mMockSigninManager.isSignInAllowed()).thenReturn(true);
 | 
|          when(mMockSigninManager.isSignedInOnNative()).thenReturn(false);
 | 
|          MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource);
 | 
| -        NewTabPageAdapter adapter = NewTabPageAdapter.create(ntpManager, null, null);
 | 
| +        NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null);
 | 
|  
 | 
|          assertEquals(5, adapter.getGroups().size());
 | 
|          ItemGroup signinPromoGroup = adapter.getGroup(5);
 | 
| @@ -791,7 +791,7 @@ public class NewTabPageAdapterTest {
 | 
|          ChromePreferenceManager.getInstance(RuntimeEnvironment.application)
 | 
|                  .setNewTabPageSigninPromoDismissed(false);
 | 
|          MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource);
 | 
| -        NewTabPageAdapter adapter = NewTabPageAdapter.create(ntpManager, null, null);
 | 
| +        NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null);
 | 
|          final int signInPromoIndex = 5;
 | 
|  
 | 
|          assertEquals(5, adapter.getGroups().size());
 | 
| @@ -816,7 +816,7 @@ public class NewTabPageAdapterTest {
 | 
|          assertTrue(ChromePreferenceManager.getInstance(RuntimeEnvironment.application)
 | 
|                             .getNewTabPageSigninPromoDismissed());
 | 
|  
 | 
| -        adapter = NewTabPageAdapter.create(ntpManager, null, null);
 | 
| +        adapter = new NewTabPageAdapter(ntpManager, null, null);
 | 
|          assertEquals(5, adapter.getGroups().size());
 | 
|          // The items below the signin promo move up, footer is now at the position of the promo.
 | 
|          assertEquals(NewTabPageItem.VIEW_TYPE_FOOTER, adapter.getItemViewType(signInPromoIndex));
 | 
| 
 |