package io.kaif.mobile.view;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.kaif.mobile.KaifApplication;
import io.kaif.mobile.R;
import io.kaif.mobile.app.BaseFragment;
import io.kaif.mobile.event.vote.VoteArticleSuccessEvent;
import io.kaif.mobile.view.daemon.ArticleDaemon;
import io.kaif.mobile.view.daemon.VoteDaemon;
import io.kaif.mobile.view.viewmodel.ArticleViewModel;
import io.kaif.mobile.view.widget.OnScrollToLastListener;
import rx.Observable;
public class ArticlesFragment extends BaseFragment {
public static final int RELOAD_EXPIRE_INTERVAL = 5 * 60 * 1000;
@BindView(R.id.article_list)
RecyclerView articleListView;
@BindView(R.id.pull_to_refresh)
SwipeRefreshLayout pullToRefreshLayout;
@Inject
ArticleDaemon articleDaemon;
@Inject
VoteDaemon voteDaemon;
private long leaveTime = 0;
private final static String ARGUMENT_IS_HOT = "IS_HOT";
public static ArticlesFragment newInstance(boolean isHot) {
ArticlesFragment fragment = new ArticlesFragment();
Bundle args = new Bundle();
args.putBoolean(ARGUMENT_IS_HOT, isHot);
fragment.setArguments(args);
return fragment;
}
private ArticleListAdapter adapter;
private boolean isHot;
public ArticlesFragment() {
// Required empty public constructor
}
private Observable<List<ArticleViewModel>> listArticles(String startArticleId) {
if (isHot) {
return articleDaemon.listHotArticles(startArticleId);
}
return articleDaemon.listLatestArticles(startArticleId);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
KaifApplication.getInstance().beans().inject(this);
isHot = getArguments().getBoolean(ARGUMENT_IS_HOT);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_articles, container, false);
ButterKnife.bind(this, view);
setupView();
return view;
}
@Override
public void onResume() {
super.onResume();
reloadIfRequired();
}
@Override
public void onPause() {
leaveTime = System.currentTimeMillis();
super.onPause();
}
private void reloadIfRequired() {
if (System.currentTimeMillis() - leaveTime <= RELOAD_EXPIRE_INTERVAL) {
return;
}
reload();
}
private void setupView() {
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
articleListView.setLayoutManager(linearLayoutManager);
adapter = new ArticleListAdapter(voteDaemon,
item -> startActivity(DebatesActivity.DebatesActivityIntent.create(getActivity(), item)));
articleListView.setAdapter(adapter);
articleListView.getItemAnimator().setChangeDuration(120);
articleListView.addOnScrollListener(new OnScrollToLastListener() {
private boolean loadingNextPage = false;
@Override
public void onScrollToLast() {
if (loadingNextPage) {
return;
}
loadingNextPage = true;
bind(listArticles(adapter.getLastArticleId())).subscribe(adapter::addAll, throwable -> {
}, () -> loadingNextPage = false);
}
});
pullToRefreshLayout.setOnRefreshListener(this::reload);
bind(voteDaemon.getSubject(VoteArticleSuccessEvent.class)).subscribe(event -> {
adapter.updateVote(event.getArticleId(), event.getVoteState());
});
}
private void reload() {
pullToRefreshLayout.setRefreshing(true);
bind(listArticles(null)).subscribe(adapter::refresh,
throwable -> pullToRefreshLayout.setRefreshing(false),
() -> pullToRefreshLayout.setRefreshing(false));
}
}