@Override protected void onUnsubscribe() { featureController.removeFeatureEventListener(listener); } });
@Test public void removeFeatureEventListener_should_stopRelayingTheEventsFromTheAdapterViewTypeDelegates() { //GIVEN AdapterViewTypeDelegate stubAdapterViewTypeDelegate = new StubAdapterViewTypeDelegate(); FeatureController<String> featureController = new StubFeatureController<>(asList(stubAdapterViewTypeDelegate)); FeatureEventListener mockListener = createMock(FeatureEventListener.class); final FeatureEvent featureEvent = new FeatureEvent() {}; replay(mockListener); //WHEN featureController.addFeatureEventListener(mockListener); featureController.removeFeatureEventListener(mockListener); stubAdapterViewTypeDelegate.fireEvent(featureEvent); //THEN verify(mockListener); } }
@Override public void call(final Subscriber<? super FeatureEvent> subscriber) { verifyMainThread(); FeatureEventListener listener = new FeatureEventListener() { @Override public void onFeatureEvent(FeatureEvent event) { if (!subscriber.isUnsubscribed()) { subscriber.onNext(event); } } }; subscriber.add( new MainThreadSubscription() { @Override protected void onUnsubscribe() { featureController.removeFeatureEventListener(listener); } }); featureController.addFeatureEventListener(listener); } }
/** * Adds a {@link FeatureEventListener} to all the {@link AdapterViewTypeDelegate} returned by * {@link #getAdapterViewTypeDelegates()}. * * @param featureEventListener the listener to be added. */ public void addFeatureEventListener(FeatureEventListener featureEventListener) { featureEventSource.addFeatureEventListener(featureEventListener); for (AdapterViewTypeDelegate adapterViewTypeDelegate : getAdapterViewTypeDelegates()) { adapterViewTypeDelegate.addFeatureEventListener(featureEventListener); } }
@Nullable FeatureUpdate toFeatureUpdate(FeatureController<MODEL> featureController, MODEL model) { final List<ViewItem> oldItems = featureItems.getItems(featureController); final List<ViewItem> newItems = featureController.buildItems(model); if (newItems == null) { return null; } validateNewViewItems(featureController, newItems); final DiffUtilCallbackImpl callback = new DiffUtilCallbackImpl(mapViewTypeToItemComparator, oldItems, newItems); final DiffResult diffResult = calculateDiff(callback, false); return new FeatureUpdate(featureController, newItems, diffResult); }
@Test public void addFeatureEventListener_should_relayTheEventsFromTheAdapterViewTypeDelegates() { //GIVEN AdapterViewTypeDelegate stubAdapterViewTypeDelegate = new StubAdapterViewTypeDelegate(); FeatureController<String> featureController = new StubFeatureController<>(asList(stubAdapterViewTypeDelegate)); FeatureEventListener mockListener = createMock(FeatureEventListener.class); final FeatureEvent featureEvent = new FeatureEvent() {}; mockListener.onFeatureEvent(featureEvent); replay(mockListener); //WHEN featureController.addFeatureEventListener(mockListener); stubAdapterViewTypeDelegate.fireEvent(featureEvent); //THEN verify(mockListener); }
/** * Removes a {@link FeatureEventListener} from all the {@link AdapterViewTypeDelegate} returned by * {@link #getAdapterViewTypeDelegates()}. * * @param featureEventListener the listener to be removed. */ public void removeFeatureEventListener(FeatureEventListener featureEventListener) { featureEventSource.removeFeatureEventListener(featureEventListener); for (AdapterViewTypeDelegate adapterViewTypeDelegate : getAdapterViewTypeDelegates()) { adapterViewTypeDelegate.removeFeatureEventListener(featureEventListener); } }
private void registerAdapterViewTypeDelegates(List<FeatureController<MODEL>> featureControllers) { for (FeatureController<MODEL> featureController : featureControllers) { for (AdapterViewTypeDelegate delegate : featureController.getAdapterViewTypeDelegates()) { // assign unique view type delegate.setViewType(mapViewTypeToAdapterViewTypeDelegate.size()); // register delegate mapViewTypeToAdapterViewTypeDelegate.put(delegate.getViewType(), delegate); // register item comparator mapViewTypeToItemComparator.put( delegate.getViewType(), delegate.createDiffUtilComparator()); } } }