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 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.debate.CreateDebateFailedEvent; import io.kaif.mobile.event.debate.CreateDebateSuccessEvent; import io.kaif.mobile.event.debate.CreateLocalDebateEvent; import io.kaif.mobile.event.debate.DebateEvent; import io.kaif.mobile.event.vote.VoteArticleSuccessEvent; import io.kaif.mobile.event.vote.VoteDebateSuccessEvent; import io.kaif.mobile.view.daemon.DebateDaemon; import io.kaif.mobile.view.daemon.VoteDaemon; import io.kaif.mobile.view.util.Views; import io.kaif.mobile.view.viewmodel.ArticleViewModel; import io.kaif.mobile.view.widget.ReplyDialog; public class DebatesFragment extends BaseFragment { public static final String ARTICLE = "ARTICLE"; public static final String DEBATE_ID = "DEBATE_ID"; public static final int AUTO_SCROLL_OFFSET_DP = 30; @BindView(R.id.debate_list) RecyclerView debateListView; @BindView(R.id.pull_to_refresh) SwipeRefreshLayout pullToRefreshLayout; @Inject DebateDaemon debateDaemon; @Inject VoteDaemon voteDaemon; private DebateListAdapter adapter; private ArticleViewModel article; public static DebatesFragment newInstance(ArticleViewModel articleViewModel, String anchorDebateId) { DebatesFragment fragment = new DebatesFragment(); Bundle args = new Bundle(); args.putSerializable(ARTICLE, articleViewModel); args.putString(DEBATE_ID, anchorDebateId); fragment.setArguments(args); return fragment; } public DebatesFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); KaifApplication.getInstance().beans().inject(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_debates, container, false); ButterKnife.bind(this, view); article = (ArticleViewModel) getArguments().getSerializable(ARTICLE); setupView(); fillContent(); return view; } private void fillContent() { refreshDebates(); } private void setupView() { final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); debateListView.setLayoutManager(linearLayoutManager); adapter = new DebateListAdapter(article, voteDaemon, (debateId, level) -> ReplyDialog.createFragment(article.getArticleId(), debateId, level) .show(getFragmentManager(), "fragment_reply")); debateListView.setAdapter(adapter); debateListView.getItemAnimator().setChangeDuration(120); pullToRefreshLayout.setOnRefreshListener(this::refreshDebates); pullToRefreshLayout.setRefreshing(true); bind(voteDaemon.getSubject(VoteArticleSuccessEvent.class, VoteDebateSuccessEvent.class)). subscribe(event -> { if (event instanceof VoteArticleSuccessEvent) { VoteArticleSuccessEvent articleSuccessEvent = (VoteArticleSuccessEvent) event; adapter.updateArticleVote(articleSuccessEvent.getArticleId(), articleSuccessEvent.getVoteState()); } else if (event instanceof VoteDebateSuccessEvent) { VoteDebateSuccessEvent debateSuccessEvent = (VoteDebateSuccessEvent) event; adapter.updateDebateVote(debateSuccessEvent.getDebateId(), debateSuccessEvent.getVoteState()); } }); bind(debateDaemon.getSubject(CreateLocalDebateEvent.class, CreateDebateSuccessEvent.class, CreateDebateFailedEvent.class)).subscribe(this::processDebateEvent); } private void processDebateEvent(DebateEvent event) { if (event instanceof CreateDebateSuccessEvent) { refreshDebates(); } } public void refreshDebates() { bind(debateDaemon.listDebates(article.getArticleId())).subscribe((debates) -> { adapter.refresh(debates); String anchorId = getArguments().getString(DEBATE_ID); if (anchorId != null) { int position = adapter.findPositionByDebateId(anchorId); adapter.selectItem(position); ((LinearLayoutManager) debateListView.getLayoutManager()).scrollToPositionWithOffset( position, (int) Views.convertDpToPixel(AUTO_SCROLL_OFFSET_DP, getActivity())); } }, throwable -> { }, () -> pullToRefreshLayout.setRefreshing(false)); } }