package io.kaif.mobile.view; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.GestureDetectorCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; 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.view.daemon.DebateDaemon; import io.kaif.mobile.view.viewmodel.DebateViewModel; import io.kaif.mobile.view.widget.OnScrollToLastListener; import rx.Observable; public class LatestDebatesFragment extends BaseFragment { public static final int RELOAD_EXPIRE_INTERVAL = 5 * 60 * 1000; @BindView(R.id.debate_list) RecyclerView debateListView; @BindView(R.id.pull_to_refresh) SwipeRefreshLayout pullToRefreshLayout; @Inject DebateDaemon debateDaemon; private long leaveTime = 0; public static LatestDebatesFragment newInstance() { LatestDebatesFragment fragment = new LatestDebatesFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } private LatestDebateListAdapter adapter; public LatestDebatesFragment() { // Required empty public constructor } @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_latest_debates, 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()); debateListView.setLayoutManager(linearLayoutManager); adapter = new LatestDebateListAdapter(); debateListView.setAdapter(adapter); debateListView.getItemAnimator().setChangeDuration(120); debateListView.addOnScrollListener(new OnScrollToLastListener() { private boolean loadingNextPage = false; @Override public void onScrollToLast() { if (loadingNextPage) { return; } loadingNextPage = true; bind(listDebates(adapter.getLastDebateId())).subscribe(adapter::addAll, throwable -> { }, () -> loadingNextPage = false); } }); GestureDetectorCompat gestureDetector = new GestureDetectorCompat(getActivity(), new OnItemClickListener()); debateListView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return gestureDetector.onTouchEvent(e); } }); pullToRefreshLayout.setOnRefreshListener(LatestDebatesFragment.this::reload); } private void reload() { pullToRefreshLayout.setRefreshing(true); bind(listDebates(null)).subscribe(adapter::refresh, throwable -> { }, () -> pullToRefreshLayout.setRefreshing(false)); } private Observable<List<DebateViewModel>> listDebates(String startDebateId) { return debateDaemon.listLatestDebates(startDebateId); } private class OnItemClickListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { View view = debateListView.findChildViewUnder(e.getX(), e.getY()); if (view == null) { return false; } int position = debateListView.getChildAdapterPosition(view); DebateViewModel debateViewModel = adapter.findItem(position); if (debateViewModel == null) { return false; } Intent intent = DebatesActivity.DebatesActivityIntent.create(getActivity(), debateViewModel); startActivity(intent); return true; } } }