package com.dxjia.doubantop.fragments;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import com.dxjia.doubantop.R;
import com.dxjia.doubantop.adapters.ContentItemAdapter;
import com.dxjia.doubantop.datas.beans.MovieInfoBean;
import com.dxjia.doubantop.datas.beans.MovieTops;
import com.dxjia.doubantop.datas.beans.MovieUSBox;
import com.dxjia.doubantop.datas.beans.entities.SearchResultEntity;
import com.dxjia.doubantop.datas.beans.entities.SubjectEntity;
import com.dxjia.doubantop.datas.beans.entities.SubjectsEntity;
import com.dxjia.doubantop.net.DoubanApiUtils;
import com.dxjia.doubantop.net.RetrofitCallback;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import butterknife.InjectView;
/**
* Created by 德祥 on 2015/7/13.
* The base fragment
*/
public class SwipeRefreshFragment extends BaseFragment {
protected static final String ARG_API_TYPE = "api_type";
private static final int EVENT_UPDATE_INIT = 0;
private static final int EVENT_UPDATE_START = 1;
private static final int EVENT_UPDATE_FAILED = 2;
private static final int EVENT_UPDATE_DONE = 3;
private static final int EVENT_UPDATE_US_BOX_DONE = 4;
private static final int EVENT_UPDATE_MOVIE_TOPS_DONE = 5;
private static final int EVENT_UPDATE_SEARCH_DONE = 6;
private int mApiType = DoubanApiUtils.API_TYPE_UNKOWN;
private String mSearchKey;
@InjectView(R.id.swipe_refresh_layout)
SwipeRefreshLayout mSwipeRefreshLayout;
@InjectView(R.id.movies_list)
RecyclerView mRecyclerView;
private ArrayList<MovieInfoBean> mMoviesList = new ArrayList<MovieInfoBean>();
private ContentItemAdapter mArrayAdapter;
private UpdateHandler mUpdateHandler;
@Override
protected int getLayout() {
return R.layout.swipe_refresh_fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mApiType = getArguments().getInt(ARG_API_TYPE);
}
mMoviesList.clear();
mUpdateHandler = new UpdateHandler();
if (mApiType != DoubanApiUtils.API_TYPE_SEARCH) {
startRequestDelay(100);
}
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupRecyclerView();
}
protected void startRequestDelay(int delay) {
mUpdateHandler.sendEmptyMessageDelayed(EVENT_UPDATE_INIT, delay);
}
private void setupRecyclerView() {
mRecyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(layoutManager);
if (mMoviesList != null && mMoviesList.size() > 0) {
mArrayAdapter = new ContentItemAdapter(getActionsListener(), mMoviesList);
mRecyclerView.setAdapter(mArrayAdapter);
}
mSwipeRefreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
doUpdateWork(mApiType);
}
});
if (DoubanApiUtils.API_TYPE_SEARCH == mApiType) {
setRefreshEnable(false);
}
}
/**
* 设置refresh控件是否可用
* @param enable
*/
public void setRefreshEnable(boolean enable) {
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setEnabled(enable);
}
}
/**
* 按评分从高到低对列表进行排序
*/
private void sortListByScore() {
if (mMoviesList == null || mMoviesList.size() <= 1) {
return;
}
Collections.sort(mMoviesList, new Comparator<MovieInfoBean>() {
@Override
public int compare(MovieInfoBean lhs, MovieInfoBean rhs) {
return (Float.valueOf(rhs.getAverage())).compareTo(Float.valueOf(lhs.getAverage()));
}
});
}
public void startNewSearch(String key) {
if (TextUtils.isEmpty(key)) {
return;
}
if (mApiType == DoubanApiUtils.API_TYPE_SEARCH) {
mSearchKey = key;
setRefreshEnable(true);
fetchSearchContents();
}
}
/**
* 进行搜索
*/
private void fetchSearchContents() {
mSwipeRefreshLayout.setRefreshing(true);
doUpdateWork(mApiType);
}
/**
* UI update handler
*/
private class UpdateHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_UPDATE_INIT:
mSwipeRefreshLayout.setRefreshing(true);
doUpdateWork(mApiType);
break;
case EVENT_UPDATE_START:
mMoviesList.clear();
mRecyclerView.setAdapter(null);
mRecyclerView.invalidate();
break;
case EVENT_UPDATE_FAILED:
mSwipeRefreshLayout.setRefreshing(false);
if (mApiType == DoubanApiUtils.API_TYPE_SEARCH) {
setRefreshEnable(false);
}
break;
case EVENT_UPDATE_US_BOX_DONE:
case EVENT_UPDATE_MOVIE_TOPS_DONE:
case EVENT_UPDATE_SEARCH_DONE:
collectResultsFromResponse(mApiType, msg.obj);
sendEmptyMessage(EVENT_UPDATE_DONE);
break;
case EVENT_UPDATE_DONE:
// search的结果就不排序了
if(mApiType != DoubanApiUtils.API_TYPE_SEARCH) {
sortListByScore();
}
mArrayAdapter = new ContentItemAdapter(getActionsListener(), mMoviesList);
mRecyclerView.setAdapter(mArrayAdapter);
mSwipeRefreshLayout.setRefreshing(false);
if (mApiType == DoubanApiUtils.API_TYPE_SEARCH) {
setRefreshEnable(false);
}
break;
}
super.handleMessage(msg);
}
}
/**
* 异步请求数据
*/
private void doUpdateWork(int apiType) {
if(apiType < 0) {
return;
}
mUpdateHandler.sendEmptyMessage(EVENT_UPDATE_START);
int successCode;
int failCode = EVENT_UPDATE_FAILED;
switch (apiType) {
case DoubanApiUtils.API_TYPE_US_BOX:
successCode = EVENT_UPDATE_US_BOX_DONE;
DoubanApiUtils.getMovieApiService().getMoviceUSBox(DoubanApiUtils.API_KEY,
new RetrofitCallback<>(mUpdateHandler, successCode, failCode, MovieUSBox.class));
break;
case DoubanApiUtils.API_TYPE_TOPS:
successCode = EVENT_UPDATE_MOVIE_TOPS_DONE;
DoubanApiUtils.getMovieApiService().getTop250(DoubanApiUtils.API_KEY,
new RetrofitCallback<>(mUpdateHandler, successCode, failCode, MovieTops.class));
break;
case DoubanApiUtils.API_TYPE_SEARCH:
successCode = EVENT_UPDATE_SEARCH_DONE;
if (TextUtils.isEmpty(mSearchKey)) {
break;
}
String encodeKey;
try {
encodeKey = URLEncoder.encode(mSearchKey, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
encodeKey = "";
}
if (TextUtils.isEmpty(encodeKey)) {
break;
}
DoubanApiUtils.getMovieApiService().doSearch(encodeKey, DoubanApiUtils.API_KEY,
new RetrofitCallback<>(mUpdateHandler, successCode, failCode, SearchResultEntity.class));
break;
default:
successCode = EVENT_UPDATE_US_BOX_DONE;
DoubanApiUtils.getMovieApiService().getMoviceUSBox(DoubanApiUtils.API_KEY,
new RetrofitCallback<>(mUpdateHandler, successCode, failCode, MovieUSBox.class));
break;
}
}
public void collectResultsFromResponse(int apiType, Object object) {
if (object == null) {
return;
}
List<SubjectsEntity> subjects;
SubjectsEntity subjectsEntity;
SubjectEntity subject;
int i;
switch (apiType) {
case DoubanApiUtils.API_TYPE_US_BOX:
MovieUSBox usBox = (MovieUSBox)object;
subjects = usBox.getSubjects();
if (subjects != null) {
for (i = 0; i < subjects.size(); i++) {
subjectsEntity = subjects.get(i);
if (subjectsEntity == null) {
continue;
}
subject = subjectsEntity.getSubject();
if (subject == null) {
continue;
}
mMoviesList.add(new MovieInfoBean(subject));
}
}
break;
case DoubanApiUtils.API_TYPE_TOPS:
MovieTops movieTops = (MovieTops)object;
List<SubjectEntity> subjectEntities;
subjectEntities = movieTops.getSubjects();
if (subjectEntities != null) {
for (i = 0; i < subjectEntities.size(); i++) {
subject = subjectEntities.get(i);
if (subject == null) {
continue;
}
mMoviesList.add(new MovieInfoBean(subject));
}
}
break;
case DoubanApiUtils.API_TYPE_SEARCH:
List<SearchResultEntity.SubjectsEntity> searResSubjectsList;
SearchResultEntity searchResult = (SearchResultEntity)object;
searResSubjectsList = searchResult.getSubjects();
if (searResSubjectsList != null) {
for (i = 0; i < searResSubjectsList.size(); i++) {
SearchResultEntity.SubjectsEntity subsEntity = searResSubjectsList.get(i);
if (subsEntity == null) {
continue;
}
subject = SubjectEntity.cloneFromSearchSubjectsEntity(subsEntity);
if (subject == null) {
continue;
}
mMoviesList.add(new MovieInfoBean(subject));
}
}
break;
default:
break;
}
}
}