package jp.gr.procon.proconapp.ui.fragment;
import android.app.Activity;
import android.content.res.ColorStateList;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
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.ArrayList;
import java.util.Collections;
import jp.gr.procon.proconapp.R;
import jp.gr.procon.proconapp.api.SocialTwitterApi;
import jp.gr.procon.proconapp.model.FeedTwitterStatus;
import jp.gr.procon.proconapp.model.PageApiState;
import jp.gr.procon.proconapp.ui.adapter.TwitterFeedRecyclerAdapter;
import jp.gr.procon.proconapp.ui.view.DividerItemDecoration;
import timber.log.Timber;
public class TwitterFeedFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
private static final int API_MAX_COUNT = 50;
public interface OnClickTweetListener {
void onClickTweet(FeedTwitterStatus tweet);
void onClickPostTweet();
void onClickMoreButton();
}
public static TwitterFeedFragment newInstance() {
TwitterFeedFragment fragment = new TwitterFeedFragment();
return fragment;
}
private SwipeRefreshLayout mSwipeRefreshLayout;
private RecyclerView mRecyclerView;
private TwitterFeedRecyclerAdapter mAdapter;
private ArrayList<FeedTwitterStatus> mTweetList;
private SocialTwitterApiAsyncTask mSocialTwitterApiAsyncTask;
private OnClickTweetListener mOnClickTweetListener;
public TwitterFeedFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTweetList = new ArrayList<>();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_refreshable_recycler_view, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState != null) {
// TODO save
}
mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.layout_swipe_refresh);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeResources(
R.color.indicator_red,
R.color.indicator_green,
R.color.indicator_blue,
R.color.indicator_orange);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
mAdapter = new TwitterFeedRecyclerAdapter(mTweetList);
mAdapter.setOnClickTweetListener(mOnClickTweetListener);
mAdapter.setOnClickMoreButtonListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnClickTweetListener != null) {
mOnClickTweetListener.onClickMoreButton();
}
}
});
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
mRecyclerView.setAdapter(mAdapter);
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.floating_action_button);
fab.setVisibility(View.VISIBLE);
fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.background_fab_gray_blue)));
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnClickTweetListener != null) {
mOnClickTweetListener.onClickPostTweet();
}
}
});
}
@Override
public void onResume() {
super.onResume();
if (mTweetList.size() == 0) {
startApiAsyncTask();
}
}
@Override
public void onPause() {
stopApiAsyncTask();
mSwipeRefreshLayout.setRefreshing(false);
super.onPause();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Fragment parent = getParentFragment();
if (parent != null && parent instanceof OnClickTweetListener) {
mOnClickTweetListener = (OnClickTweetListener) parent;
} else if (activity instanceof OnClickTweetListener) {
mOnClickTweetListener = (OnClickTweetListener) activity;
} else {
throw new RuntimeException("activity or parent fragment implement OnClickTweetListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mOnClickTweetListener = null;
}
private void startApiAsyncTask() {
if (mSocialTwitterApiAsyncTask != null) {
return;
}
mSocialTwitterApiAsyncTask = new SocialTwitterApiAsyncTask(getUserToken());
mSocialTwitterApiAsyncTask.execute(API_MAX_COUNT);
}
private void stopApiAsyncTask() {
if (mSocialTwitterApiAsyncTask != null) {
mSocialTwitterApiAsyncTask.cancel(true);
}
mSocialTwitterApiAsyncTask = null;
}
@Override
public void onRefresh() {
stopApiAsyncTask();
startApiAsyncTask();
}
public class SocialTwitterApiAsyncTask extends AsyncTask<String, Void, SocialTwitterApi.GetRequest> {
private String mUserToken;
public SocialTwitterApiAsyncTask(String userToken) {
mUserToken = userToken;
}
public void execute(int count) {
execute(Integer.toString(count));
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected SocialTwitterApi.GetRequest doInBackground(String... params) {
return new SocialTwitterApi.GetRequest(mUserToken).get(params[0]);
}
@Override
protected void onPostExecute(SocialTwitterApi.GetRequest api) {
super.onPostExecute(api);
if (isDetached() || getActivity() == null) {
return;
}
if (api.isSuccessful()) {
ArrayList<FeedTwitterStatus> feed = api.getResponseObj().getStatusList();
Collections.sort(feed);
if (mTweetList.size() == 0) {
// 新規取得
mTweetList.addAll(feed);
} else {
FeedTwitterStatus latestTweet = mTweetList.get(0);
// 取得済みの最新ツイートより新しいものを追加
int index = Collections.binarySearch(feed, latestTweet);
if (index > 0) {
mTweetList.addAll(0, feed.subList(0, index));
} else if (index < 0) {
// indexが-1の時全部最新ツイート
// -2以下の場合がないと想定
Timber.d("onPostExecute: latestTweetIndex in new feed" + index);
mTweetList.addAll(0, feed);
} else {
Timber.d("onPostExecute: already added");
}
}
mAdapter.notifyDataSetChanged();
}
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
protected void onCancelled() {
super.onCancelled();
mSwipeRefreshLayout.setRefreshing(false);
}
}
}