package com.mcxiaoke.minicat.fragment;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.mcxiaoke.minicat.AppContext;
import com.mcxiaoke.minicat.Cache;
import com.mcxiaoke.minicat.R;
import com.mcxiaoke.minicat.api.Api;
import com.mcxiaoke.minicat.api.Paging;
import com.mcxiaoke.minicat.controller.EmptyViewController;
import com.mcxiaoke.minicat.controller.UIController;
import com.mcxiaoke.minicat.dao.model.StatusModel;
import com.mcxiaoke.minicat.dao.model.UserModel;
import com.mcxiaoke.minicat.util.LogUtil;
import com.mcxiaoke.minicat.util.NetworkHelper;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
/**
* Project: fanfouapp
* Package: com.mcxiaoke.fanfouapp.fragment
* User: mcxiaoke
* Date: 13-5-28
* Time: 下午9:02
*/
public class PhotosFragment extends AbstractFragment implements AdapterView.OnItemClickListener {
private static final String TAG = PhotosFragment.class.getSimpleName();
private ViewGroup mEmptyView;
private EmptyViewController mEmptyViewController;
private GridView mGridView;
private ArrayAdapter<StatusModel> mArrayAdapter;
private ArrayList<StatusModel> mData;
private UserModel user;
private Thread mThread;
private Handler mHandler;
private volatile boolean mCancelled;
public static PhotosFragment newInstance(UserModel user) {
PhotosFragment fragment = new PhotosFragment();
Bundle args = new Bundle();
args.putParcelable("user", user);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
user = getArguments().getParcelable("user");
mData = new ArrayList<StatusModel>();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fm_photos, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
View root = getView();
mEmptyView = (ViewGroup) root.findViewById(android.R.id.empty);
mEmptyViewController = new EmptyViewController(mEmptyView);
mGridView = (GridView) root.findViewById(R.id.gridview);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mArrayAdapter = new GridViewAdapter(getActivity(), R.id.text, mData);
mGridView.setOnItemClickListener(this);
mGridView.setAdapter(mArrayAdapter);
getActivity().getActionBar().setTitle(user.getScreenName() + "的相册");
startRefresh();
}
@Override
public void onDestroy() {
super.onDestroy();
stopTask();
if (mData != null && mData.size() > 120) {
Cache.clear();
Cache.put(user.getId(), mData);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public String getTitle() {
return "照片集";
}
@Override
public void startRefresh() {
final List<StatusModel> cache = Cache.get(user.getId());
if (cache != null) {
refreshUI(cache);
return;
}
startTask();
getBaseSupport().showProgressIndicator();
showProgress();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
StatusModel status = (StatusModel) parent.getItemAtPosition(position);
if (AppContext.DEBUG) {
LogUtil.d(TAG, "onItemClick() " + status);
}
if (status != null) {
UIController.showGallery(getActivity(), user.getId(), position);
}
}
private void showProgress() {
mGridView.setVisibility(View.GONE);
mEmptyViewController.showProgress();
}
private void showContent(int size) {
mEmptyViewController.hideProgress();
mGridView.setVisibility(View.VISIBLE);
}
private void showEmpty(String text) {
mGridView.setVisibility(View.GONE);
mEmptyViewController.showEmpty(text);
}
private void stopTask() {
if (mThread != null) {
mCancelled = true;
mThread.interrupt();
mThread = null;
}
}
private void startTask() {
stopTask();
loadData();
}
private void updateUI(final List<StatusModel> data) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
refreshUI(data);
}
};
mHandler.post(runnable);
}
private synchronized void refreshUI(final List<StatusModel> data) {
getBaseSupport().hideProgressIndicator();
if (data != null && data.size() > 0) {
int size = data.size();
showContent(size);
mArrayAdapter.addAll(data);
mArrayAdapter.notifyDataSetChanged();
Cache.put(user.getId(), mData);
} else {
if (mArrayAdapter.isEmpty()) {
showEmpty("无法获取数据");
}
}
}
private void loadData() {
mThread = new Thread() {
@Override
public void run() {
final long start = System.currentTimeMillis();
final String id = user.getId();
final Api api = AppContext.getApi();
List<StatusModel> statusModels = new ArrayList<StatusModel>();
try {
// 分页获取,最多30页=1800张照片
Paging paging = new Paging();
paging.count = 60;
final int max = NetworkHelper.isWifi(getActivity()) ? 30 : 1;
for (int i = 0; i < max; i++) {
paging.page = i;
if (mCancelled) {
break;
}
if (AppContext.DEBUG) {
Log.d("PhotosFragment", "fetch next page photos " + i);
}
final List<StatusModel> models = api.getPhotosTimeline(id, paging);
if (mCancelled) {
break;
}
if (models != null) {
statusModels.addAll(models);
}
if (i % 3 == 0) {
updateUI(new ArrayList<StatusModel>(statusModels));
statusModels.clear();
}
if (models == null || models.size() < paging.count) {
break;
}
if (System.currentTimeMillis() - start > 60 * 1000L) {
break;
}
}
if (AppContext.DEBUG) {
Log.d("PhotosFragment", "fetch photos finished");
}
} catch (Exception ex) {
if (AppContext.DEBUG) {
Log.w("PhotosFragment", "fetch photos error:" + ex);
}
}
updateUI(statusModels);
}
};
mThread.start();
}
static class GridViewAdapter extends ArrayAdapter<StatusModel> {
private Picasso picasso;
public GridViewAdapter(Context context, int textViewResourceId, List<StatusModel> objects) {
super(context, textViewResourceId, objects);
picasso = new Picasso.Builder(context).build();
}
@Override
public StatusModel getItem(int position) {
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_photo, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.image);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
StatusModel status = getItem(position);
holder.text.setText(status.getSimpleText());
picasso.load(status.getPhotoLargeUrl()).placeholder(R.drawable.photo_placeholder).into(holder.image);
return convertView;
}
static class ViewHolder {
public ImageView image;
public TextView text;
}
}
}