@Test public void modelClickListenerIsDiffed() { // Internally we wrap the model click listener with an anonymous click listener. We can't hash // the anonymous click listener since that changes the model state, instead our anonymous // click listener should use the hashCode of the user's click listener ModelClickListener modelClickListener = new ModelClickListener(); ViewClickListener viewClickListener = new ViewClickListener(); TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.setModel(model); controller.requestModelBuild(); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); model = new ModelWithClickListener_(); model.clickListener(modelClickListener); controller.setModel(model); lifecycleHelper.buildModelsAndBind(controller); // The second update shouldn't cause a item change model = new ModelWithClickListener_(); model.clickListener(modelClickListener); controller.setModel(model); lifecycleHelper.buildModelsAndBind(controller); model = new ModelWithClickListener_(); model.clickListener(viewClickListener); controller.setModel(model); lifecycleHelper.buildModelsAndBind(controller); verify(observerMock, times(2)).onItemRangeChanged(eq(0), eq(1), any()); verifyNoMoreInteractions(observerMock); }
@Test public void testRemoveAllAfterModels() { List<TestModel> models = new ArrayList<>(); for (int i = 0; i < 10; i++) { TestModel model = new TestModel(); models.add(model); testAdapter.addModels(model); } testAdapter.removeAllAfterModel(models.get(5)); verify(observer).onItemRangeRemoved(6, 4); assertEquals(models.subList(0, 6), testAdapter.models); checkDifferState(); }
@Test public void multipleMoves() { AdapterDataObserver observer = mock(AdapterDataObserver.class); final List<TestModel> testModels = new ArrayList<>(); testModels.add(new TestModel(1)); testModels.add(new TestModel(2)); testModels.add(new TestModel(3)); EpoxyController controller = new EpoxyController() { @Override protected void buildModels() { add(testModels); } }; EpoxyControllerAdapter adapter = controller.getAdapter(); adapter.registerAdapterDataObserver(observer); controller.requestModelBuild(); testModels.add(0, testModels.remove(1)); controller.moveModel(1, 0); verify(observer).onItemRangeMoved(1, 0, 1); testModels.add(2, testModels.remove(1)); controller.moveModel(1, 2); verify(observer).onItemRangeMoved(1, 2, 1); assertEquals(testModels, adapter.getCurrentModels()); controller.requestModelBuild(); assertEquals(testModels, adapter.getCurrentModels()); }
@Test public void setSelection_changesSelection() { CustomerSource cardSource = CustomerSource.fromString(CardInputTestActivity.EXAMPLE_JSON_CARD_SOURCE); CustomerSource secondCardSource = CustomerSource.fromString(CardInputTestActivity.EXAMPLE_JSON_CARD_SOURCE_SECOND); mMaskedCardAdapter.addCustomerSourceIfSupported(cardSource, secondCardSource); assertEquals(2, mMaskedCardAdapter.getItemCount()); verify(mAdapterDataObserver, times(1)).onChanged(); assertNull(mMaskedCardAdapter.getSelectedSource()); assertNotNull(secondCardSource); assertNotNull(secondCardSource.getId()); mMaskedCardAdapter.setSelectedSource(secondCardSource.getId()); verify(mAdapterDataObserver, times(2)).onChanged(); assertNotNull(mMaskedCardAdapter.getSelectedSource()); assertEquals(secondCardSource.getId(), mMaskedCardAdapter.getSelectedSource().getId()); }
@Test public void updateCustomer_removesExistingSourcesAndAddsAllCustomerSources() { CustomerSource cardSource = CustomerSource.fromString(CardInputTestActivity.EXAMPLE_JSON_CARD_SOURCE_SECOND); mMaskedCardAdapter.addCustomerSourceIfSupported(cardSource); assertEquals(1, mMaskedCardAdapter.getItemCount()); assertNull(mMaskedCardAdapter.getSelectedSource()); Customer customer = Customer.fromString(PaymentMethodsActivityTest.TEST_CUSTOMER_OBJECT_WITH_SOURCES); assertNotNull(customer); mMaskedCardAdapter.updateCustomer(customer); assertEquals(2, mMaskedCardAdapter.getItemCount()); assertNotNull(mMaskedCardAdapter.getSelectedSource()); assertEquals(customer.getDefaultSource(), mMaskedCardAdapter.getSelectedSource().getId()); verify(mAdapterDataObserver, times(4)).onChanged(); }
@SuppressWarnings("unchecked") private void setAdapter(RecyclerView.Adapter adapter) { if (mAdapter != null) { mAdapter.unregisterAdapterDataObserver(mHeaderPositionsObserver); } if (adapter instanceof StickyHeaders) { mAdapter = (T) adapter; mAdapter.registerAdapterDataObserver(mHeaderPositionsObserver); mHeaderPositionsObserver.onChanged(); } else { mAdapter = null; mHeaderPositions.clear(); } }
@Override public void onChanged() { observer.onChanged(); }
@Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { super.onItemRangeMoved(fromPosition, toPosition, itemCount); // this should probably be smarter and just move relevant views recreateViews(); reindex(); } };
@Override public void onItemRangeMoved(final int fromPosition, final int toPosition, final int itemCount) { super.onItemRangeMoved(fromPosition, toPosition, itemCount); updateNavigationPreferences(); }
@Override public void onItemRangeRemoved(final int positionStart, final int itemCount) { super.onItemRangeRemoved(positionStart, itemCount); updateNavigationPreferences(); }
@Override public void onItemRangeInserted(int positionStart, int itemCount) { observer.onItemRangeInserted(positionStart, itemCount); updatePrevious(positionStart - 1); updateNext(positionStart + itemCount); }
private void updatePrevious(int position) { if (position >= 0) { observer.onItemRangeChanged(position, 1, DETAILS_PAYLOAD); } }
@Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { updatePrevious(fromPosition - 1); updateNext(fromPosition + itemCount); observer.onItemRangeMoved(fromPosition, toPosition, itemCount); updatePrevious(toPosition - 1); updateNext(toPosition + itemCount); } }
@Override public void onChanged() { super.onChanged(); updateEmptyView(); }
@Override public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { super.onItemRangeChanged(positionStart, itemCount, payload); updateViews(positionStart, itemCount); reindex(); }
@Override public void onItemRangeChanged(int positionStart, int itemCount) { super.onItemRangeChanged(positionStart, itemCount); updateViews(positionStart, itemCount); reindex(); }
@Override public void onItemRangeChanged(final int positionStart, final int itemCount, @Nullable final Object payload) { super.onItemRangeChanged(positionStart, itemCount, payload); updateNavigationPreferences(); }
@Override public void onChanged() { super.onChanged(); updateNavigationPreferences(); }
@Override public void onChanged() { super.onChanged(); checkIfEmpty(); } };
public void setSuggestionsAdapter(RecyclerView.Adapter adapter) { if (mRecyclerView.getAdapter() != null) mRecyclerView.getAdapter().unregisterAdapterDataObserver(mDataObserver); mRecyclerView.setAdapter(adapter); adapter.registerAdapterDataObserver(mDataObserver); mDataObserver.onChanged(); }