package org.wikipedia.feed.featured;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import org.wikipedia.R;
import org.wikipedia.concurrency.CallbackTask;
import org.wikipedia.feed.view.ActionFooterView;
import org.wikipedia.feed.view.CardHeaderView;
import org.wikipedia.feed.view.DefaultFeedCardView;
import org.wikipedia.feed.view.FeedAdapter;
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.page.PageTitle;
import org.wikipedia.readinglist.ReadingList;
import org.wikipedia.readinglist.ReadingListBookmarkMenu;
import org.wikipedia.readinglist.page.ReadingListPage;
import org.wikipedia.readinglist.page.database.ReadingListDaoProxy;
import org.wikipedia.views.FaceAndColorDetectImageView;
import org.wikipedia.views.GoneIfEmptyTextView;
import org.wikipedia.views.ItemTouchHelperSwipeAdapter;
import org.wikipedia.views.ViewUtil;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class FeaturedArticleCardView extends DefaultFeedCardView<FeaturedArticleCard>
implements ItemTouchHelperSwipeAdapter.SwipeableView {
public interface Callback {
void onAddFeaturedPageToList(@NonNull FeaturedArticleCard card, @NonNull HistoryEntry entry);
void onRemoveFeaturedPageFromList(@NonNull FeaturedArticleCard card, @NonNull HistoryEntry entry);
}
@BindView(R.id.view_featured_article_card_header) View headerView;
@BindView(R.id.view_featured_article_card_footer) View footerView;
@BindView(R.id.view_featured_article_card_image) FaceAndColorDetectImageView imageView;
@BindView(R.id.view_featured_article_card_article_title) TextView articleTitleView;
@BindView(R.id.view_featured_article_card_article_subtitle) GoneIfEmptyTextView articleSubtitleView;
@BindView(R.id.view_featured_article_card_extract) TextView extractView;
public FeaturedArticleCardView(Context context) {
super(context);
inflate(getContext(), R.layout.view_card_featured_article, this);
ButterKnife.bind(this);
}
@Override public void setCard(@NonNull FeaturedArticleCard card) {
super.setCard(card);
String articleTitle = card.articleTitle();
String articleSubtitle = card.articleSubtitle();
String extract = card.extract();
Uri imageUri = card.image();
articleTitle(articleTitle);
articleSubtitle(articleSubtitle);
extract(extract);
image(imageUri);
header(card);
footer(card);
}
@OnClick({R.id.view_featured_article_card_image, R.id.view_featured_article_card_text_container})
void onCardClick() {
if (getCallback() != null && getCard() != null) {
getCallback().onSelectPage(getCard(),
getCard().historyEntry(HistoryEntry.SOURCE_FEED_FEATURED));
}
}
@Override public void setCallback(@Nullable FeedAdapter.Callback callback) {
super.setCallback(callback);
if (headerView instanceof CardHeaderView) {
((CardHeaderView) headerView).setCallback(callback);
}
}
private void articleTitle(@NonNull String articleTitle) {
articleTitleView.setText(articleTitle);
}
private void articleSubtitle(@Nullable String articleSubtitle) {
articleSubtitleView.setText(articleSubtitle);
}
private void extract(@Nullable String extract) {
extractView.setText(extract);
}
private void header(@NonNull FeaturedArticleCard card) {
CardHeaderView header = new CardHeaderView(getContext())
.setTitle(card.title())
.setSubtitle(card.subtitle())
.setImage(R.drawable.ic_star_black_24dp)
.setImageCircleColor(R.color.foundation_yellow)
.setCard(card)
.setCallback(getCallback());
header(header);
}
private void footer(@NonNull FeaturedArticleCard card) {
PageTitle title = new PageTitle(card.articleTitle(), card.wikiSite());
ReadingList.DAO.anyListContainsTitleAsync(ReadingListDaoProxy.key(title),
new CallbackTask.DefaultCallback<ReadingListPage>() {
@Override public void success(@Nullable ReadingListPage page) {
boolean listContainsTitle = page != null;
int actionIcon = listContainsTitle
? R.drawable.ic_bookmark_white_24dp
: R.drawable.ic_bookmark_border_black_24dp;
int actionText = listContainsTitle
? R.string.view_featured_article_footer_saved_button_label
: R.string.view_featured_article_footer_save_button_label;
ActionFooterView footer = new ActionFooterView(getContext())
.actionIcon(actionIcon)
.actionText(actionText)
.onActionListener(listContainsTitle
? new CardBookmarkMenuListener()
: new CardAddToListListener())
.onShareListener(new CardShareListener());
if (listContainsTitle) {
footer.actionIconColor(R.color.foundation_blue);
footer.actionTextColor(R.color.foundation_blue);
}
footer(footer);
}
});
}
private void image(@Nullable Uri uri) {
if (uri == null) {
imageView.setVisibility(GONE);
} else {
imageView.setVisibility(VISIBLE);
imageView.loadImage(uri);
}
}
private void header(@NonNull View view) {
ViewUtil.replace(headerView, view);
headerView = view;
}
private void footer(@NonNull View view) {
ViewUtil.replace(footerView, view);
footerView = view;
}
@NonNull private HistoryEntry getEntry() {
return getCard().historyEntry(HistoryEntry.SOURCE_FEED_FEATURED);
}
private class CardAddToListListener implements OnClickListener {
@Override
public void onClick(View v) {
if (getCallback() != null && getCard() != null) {
getCallback().onAddFeaturedPageToList(getCard(), getEntry());
}
}
}
private class CardBookmarkMenuListener implements OnClickListener {
@Override
public void onClick(View v) {
if (getCallback() != null && getCard() != null) {
new ReadingListBookmarkMenu(footerView, new ReadingListBookmarkMenu.Callback() {
@Override
public void onAddRequest(@Nullable ReadingListPage page) {
if (getCallback() != null && getCard() != null) {
getCallback().onAddFeaturedPageToList(getCard(),
getCard().historyEntry(HistoryEntry.SOURCE_FEED_FEATURED));
}
}
@Override
public void onDeleted(@Nullable ReadingListPage page) {
if (getCallback() != null && getCard() != null) {
getCallback().onRemoveFeaturedPageFromList(getCard(), getEntry());
}
}
}).show(getEntry().getTitle());
}
}
}
private class CardShareListener implements OnClickListener {
@Override
public void onClick(View v) {
if (getCallback() != null && getCard() != null) {
getCallback().onSharePage(getEntry());
}
}
}
}