package org.wikipedia.feed.news;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.wikipedia.R;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.feed.model.Card;
import org.wikipedia.feed.view.ListCardItemView;
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.json.GsonMarshaller;
import org.wikipedia.json.GsonUnmarshaller;
import org.wikipedia.page.ExclusiveBottomSheetPresenter;
import org.wikipedia.page.PageActivity;
import org.wikipedia.readinglist.AddToReadingListDialog;
import org.wikipedia.util.DimenUtil;
import org.wikipedia.util.GradientUtil;
import org.wikipedia.util.ResourceUtil;
import org.wikipedia.util.ShareUtil;
import org.wikipedia.views.DefaultRecyclerAdapter;
import org.wikipedia.views.DefaultViewHolder;
import org.wikipedia.views.DrawableItemDecoration;
import org.wikipedia.views.FaceAndColorDetectImageView;
import org.wikipedia.views.ViewUtil;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import static org.wikipedia.feed.news.NewsActivity.EXTRA_NEWS_ITEM;
import static org.wikipedia.feed.news.NewsActivity.EXTRA_WIKI;
import static org.wikipedia.richtext.RichTextUtil.stripHtml;
import static org.wikipedia.util.DimenUtil.newsFeatureImageHeightForDevice;
public class NewsFragment extends Fragment {
@BindView(R.id.view_news_fullscreen_header_image) FaceAndColorDetectImageView image;
@BindView(R.id.view_news_fullscreen_story_text) TextView text;
@BindView(R.id.view_news_fullscreen_link_card_list) RecyclerView links;
@BindView(R.id.view_news_fullscreen_toolbar) Toolbar toolbar;
private ExclusiveBottomSheetPresenter bottomSheetPresenter = new ExclusiveBottomSheetPresenter();
private Unbinder unbinder;
@NonNull
public static NewsFragment newInstance(@NonNull NewsItem item, @NonNull WikiSite wiki) {
NewsFragment instance = new NewsFragment();
Bundle args = new Bundle();
args.putString(EXTRA_NEWS_ITEM, GsonMarshaller.marshal(item));
args.putString(EXTRA_WIKI, GsonMarshaller.marshal(wiki));
instance.setArguments(args);
return instance;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_news, container, false);
unbinder = ButterKnife.bind(this, view);
ViewUtil.setTopPaddingDp(toolbar, (int) DimenUtil.getTranslucentStatusBarHeight(getContext()));
ViewUtil.setBackgroundDrawable(toolbar, GradientUtil.getCubicGradient(
ContextCompat.getColor(getContext(), R.color.lead_gradient_start), Gravity.TOP));
getAppCompatActivity().setSupportActionBar(toolbar);
getAppCompatActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getAppCompatActivity().getSupportActionBar().setTitle("");
NewsItem item = GsonUnmarshaller.unmarshal(NewsItem.class, getActivity().getIntent().getStringExtra(EXTRA_NEWS_ITEM));
WikiSite wiki = GsonUnmarshaller.unmarshal(WikiSite.class, getActivity().getIntent().getStringExtra(EXTRA_WIKI));
Uri imageUri = item.featureImage();
int height = imageUri == null ? DimenUtil.getContentTopOffsetPx(getContext()) : newsFeatureImageHeightForDevice();
if (imageUri == null) {
toolbar.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.actionbar_background));
}
DimenUtil.setViewHeight(image, height);
image.loadImage(imageUri);
text.setText(stripHtml(item.story()));
initRecycler();
links.setAdapter(new RecyclerAdapter(item.linkCards(wiki), new Callback()));
return view;
}
@Override public void onDestroyView() {
unbinder.unbind();
unbinder = null;
super.onDestroyView();
}
private AppCompatActivity getAppCompatActivity() {
return (AppCompatActivity) getActivity();
}
private void initRecycler() {
links.setLayoutManager(new LinearLayoutManager(getContext()));
links.addItemDecoration(new DrawableItemDecoration(getContext(),
ResourceUtil.getThemedAttributeId(getContext(), R.attr.list_separator_drawable), true));
links.setNestedScrollingEnabled(false);
}
private static class RecyclerAdapter extends DefaultRecyclerAdapter<NewsLinkCard, ListCardItemView> {
@Nullable private Callback callback;
RecyclerAdapter(@NonNull List<NewsLinkCard> items, @NonNull Callback callback) {
super(items);
this.callback = callback;
}
@Override public DefaultViewHolder<ListCardItemView> onCreateViewHolder(ViewGroup parent, int viewType) {
return new DefaultViewHolder<>(new ListCardItemView(parent.getContext()));
}
@Override
public void onBindViewHolder(DefaultViewHolder<ListCardItemView> holder, int position) {
NewsLinkCard card = item(position);
holder.getView().setCard(card)
.setHistoryEntry(new HistoryEntry(card.pageTitle(), HistoryEntry.SOURCE_NEWS))
.setCallback(callback);
}
}
private class Callback implements ListCardItemView.Callback {
@Override
public void onSelectPage(@NonNull Card card, @NonNull HistoryEntry entry) {
startActivity(PageActivity.newIntent(getContext(), entry, entry.getTitle()));
}
@Override
public void onAddPageToList(@NonNull HistoryEntry entry) {
bottomSheetPresenter.show(getChildFragmentManager(),
AddToReadingListDialog.newInstance(entry.getTitle(),
AddToReadingListDialog.InvokeSource.NEWS_ACTIVITY));
}
@Override
public void onSharePage(@NonNull HistoryEntry entry) {
ShareUtil.shareText(getActivity(), entry.getTitle());
}
}
}