package org.wikipedia.feed.view; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import org.wikipedia.feed.FeedCoordinatorBase; import org.wikipedia.feed.announcement.AnnouncementCardView; import org.wikipedia.feed.featured.FeaturedArticleCardView; import org.wikipedia.feed.image.FeaturedImageCardView; import org.wikipedia.feed.model.Card; import org.wikipedia.feed.model.CardType; import org.wikipedia.feed.news.NewsListCardView; import org.wikipedia.feed.offline.OfflineCardView; import org.wikipedia.feed.searchbar.SearchCardView; import org.wikipedia.views.DefaultRecyclerAdapter; import org.wikipedia.views.DefaultViewHolder; import org.wikipedia.views.ItemTouchHelperSwipeAdapter; public class FeedAdapter<T extends View & FeedCardView<?>> extends DefaultRecyclerAdapter<Card, T> { public interface Callback extends ItemTouchHelperSwipeAdapter.Callback, ListCardItemView.Callback, CardHeaderView.Callback, FeaturedImageCardView.Callback, SearchCardView.Callback, NewsListCardView.Callback, AnnouncementCardView.Callback, FeaturedArticleCardView.Callback { void onShowCard(@Nullable Card card); void onRequestMore(); void onRetryFromOffline(); void onError(@NonNull Throwable t); } @NonNull private FeedCoordinatorBase coordinator; @Nullable private Callback callback; public FeedAdapter(@NonNull FeedCoordinatorBase coordinator, @Nullable Callback callback) { super(coordinator.getCards()); this.coordinator = coordinator; this.callback = callback; } @Override public DefaultViewHolder<T> onCreateViewHolder(ViewGroup parent, int viewType) { return new DefaultViewHolder<>(newView(parent.getContext(), viewType)); } @Override public void onBindViewHolder(DefaultViewHolder<T> holder, int position) { Card item = item(position); T view = holder.getView(); if (coordinator.finished() && position == getItemCount() - 1 && callback != null) { callback.onRequestMore(); } //noinspection unchecked ((FeedCardView<Card>) view).setCard(item); if (view instanceof OfflineCardView && position == 1) { ((OfflineCardView) view).setTopPadding(); } } @Override public void onViewAttachedToWindow(DefaultViewHolder<T> holder) { super.onViewAttachedToWindow(holder); holder.getView().setCallback(callback); if (callback != null) { callback.onShowCard(holder.getView().getCard()); } } @Override public void onViewDetachedFromWindow(DefaultViewHolder<T> holder) { holder.getView().setCallback(null); super.onViewDetachedFromWindow(holder); } @Override public int getItemViewType(int position) { return item(position).type().code(); } public int getItemPosition(@NonNull Card card) { return items().indexOf(card); } @NonNull private T newView(@NonNull Context context, int viewType) { //noinspection unchecked return (T) CardType.of(viewType).newView(context); } }