package me.nereo.baiduimageview.ui.fragment;
import android.app.Fragment;
import android.app.LoaderManager;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.AdapterView;
import com.etsy.android.grid.StaggeredGridView;
import com.google.gson.Gson;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.listener.PauseOnScrollListener;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import me.nereo.baiduimageview.R;
import me.nereo.baiduimageview.data.BaiduData;
import me.nereo.baiduimageview.model.Image;
import me.nereo.baiduimageview.model.ImageData;
import me.nereo.baiduimageview.ui.ImageGallery;
import me.nereo.baiduimageview.ui.adapter.ImageGridAdapter;
import me.nereo.baiduimageview.ui.view.LoadingFooter;
import me.nereo.baiduimageview.util.Logger;
import me.nereo.baiduimageview.util.UrlBuilder;
import me.nereo.baiduimageview.vender.BaiduApi;
import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh;
import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshLayout;
import uk.co.senab.actionbarpulltorefresh.library.listeners.OnRefreshListener;
/**
* Created by Administrator on 2014-07-07.
*/
public class ImageGridFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, OnRefreshListener{
private static final int PAGE_SIZE = 25;
private StaggeredGridView mGridView;
private PullToRefreshLayout mPullToRefreshLayout;
private ImageGridAdapter mAdapter;
private int mGridItemSpace;
private String category;
private String sort = "0";
private LoadingFooter mLoadingFooter;
private boolean onLoading = false;
private int mCurrentPage = 1;
private ArrayList<String> urls = new ArrayList<String>();
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
onLoading = false;
if(msg.arg1 == 0){
String json = msg.getData().getString("data");
Logger.d(json);
Gson gson = new Gson();
ImageData imageData = gson.fromJson(json, ImageData.class);
final List<Image> images = imageData.getImgs();
if(mCurrentPage == 1){
mAdapter.clearData();
if(mPullToRefreshLayout.isRefreshing())
mPullToRefreshLayout.setRefreshComplete();
}
mAdapter.setData(images);
mLoadingFooter.setState(LoadingFooter.State.SUCCESS);
}else if(msg.arg1 == 1){
mLoadingFooter.setState(LoadingFooter.State.FAILED);
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
category = getArguments().getString("TAG");
sort = getArguments().getString("SORT");
Logger.i("current sort: "+sort);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mLoadingFooter = new LoadingFooter(getActivity());
mGridItemSpace = getResources().getDimensionPixelSize(R.dimen.grid_space);
mPullToRefreshLayout = (PullToRefreshLayout) getView().findViewById(R.id.ptr_layout);
ActionBarPullToRefresh.from(getActivity())
.allChildrenArePullable()
.listener(this)
.setup(mPullToRefreshLayout);
mGridView = (StaggeredGridView) getView().findViewById(R.id.grid_view);
mAdapter = new ImageGridAdapter(getActivity());
mGridView.addFooterView(mLoadingFooter.getFooter());
mGridView.setAdapter(mAdapter);
mGridView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), false, true){
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
int lastVisibleItem = firstVisibleItem + visibleItemCount;
boolean arrivedBottom = (firstVisibleItem > visibleItemCount) && (lastVisibleItem >= totalItemCount);
if(!onLoading && arrivedBottom){
// Logger.i("do loading more");
onLoading = true;
loadNextPage();
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
super.onScrollStateChanged(view, scrollState);
}
});
mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
final int numColumns = 2;
final int columnWidth = ( mGridView.getWidth()/numColumns ) - mGridItemSpace;
mAdapter.setItemWidth(columnWidth);
mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
List<Image> imgs = mAdapter.getData();
if(imgs != null && imgs.size()>0){
for(Image img : imgs){
if(!urls.contains(img.getImageUrl()))
urls.add(img.getImageUrl());
}
}
Intent intent = new Intent(getActivity(), ImageGallery.class);
intent.putStringArrayListExtra("URLS", urls);
intent.putExtra("POSITION", i);
startActivity(intent);
}
});
//loadImageData();
//System.out.println(mGridView.getColumnWidth());
getLoaderManager().initLoader(0, null, this);
}
private void loadImageData(final String category, int page){
Logger.d("do here loadImageData");
Logger.d(Thread.currentThread().getName());
OkHttpClient client = new OkHttpClient();
String url = new UrlBuilder(BaiduApi.Image.HOST)
.add("col", category)
.add("tag", "全部")
.add("sort", sort)
.add("pn", String.valueOf( (page-1)*PAGE_SIZE ))
.add("rn", String.valueOf(PAGE_SIZE))
.add("p", "channel")
.add("from", "1")
.build();
Request req = new Request.Builder()
.url(url)
.build();
client.newCall(req).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
e.printStackTrace();
mHandler.sendEmptyMessage(1);
}
@Override
public void onResponse(Response response) throws IOException {
String json = response.body().string();
if(mCurrentPage == 1) {
// clear db
getActivity().getContentResolver().delete(
BaiduData.Images.CONTENT_URI,
BaiduData.Images.COLUMN_TAG +" = ? and "+BaiduData.Images.COLUMN_SORT+"= ?",
new String[]{category, sort});
// insert
ContentValues values = new ContentValues();
values.put(BaiduData.Images.COLUMN_CONTENT, json);
values.put(BaiduData.Images.COLUMN_TAG, category);
values.put(BaiduData.Images.COLUMN_SORT, sort);
getActivity().getContentResolver().insert(BaiduData.Images.CONTENT_URI, values);
}
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("data", json);
msg.setData(bundle);
msg.arg1 = 0;
mHandler.sendMessage(msg);
}
});
}
private void loadFirstPage(){
mCurrentPage = 1;
loadImageData(category, 1);
}
private void loadNextPage(){
loadImageData(category, ++mCurrentPage);
}
@Override
public Loader onCreateLoader(int i, Bundle bundle) {
String[] projection = {
BaiduData.Images.COLUMN_TAG,
BaiduData.Images.COLUMN_CACHE_DATE,
BaiduData.Images.COLUMN_CONTENT
};
//System.out.println("1:"+BaiduData.Images.CONTENT_URI);
CursorLoader loader = new CursorLoader(
getActivity(),
BaiduData.Images.CONTENT_URI,
projection,
BaiduData.Images.COLUMN_TAG +" = ? and "+BaiduData.Images.COLUMN_SORT+"= ?",
new String[]{category, sort},
null);
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
if(c != null){
if(c.getCount() == 0){
loadFirstPage();
System.out.println("no cache in database");
}else{
System.out.println("get cache from database");
c.moveToFirst();
String json = c.getString(c.getColumnIndex(BaiduData.Images.COLUMN_CONTENT));
Gson gson = new Gson();
ImageData imageData = gson.fromJson(json, ImageData.class);
final List<Image> images = imageData.getImgs();
mAdapter.setData(images);
}
}
}
@Override
public void onLoaderReset(Loader loader) {
mAdapter.clearData();
}
@Override
public void onRefreshStarted(View view) {
loadFirstPage();
}
}