package com.mcxiaoke.minicat.fragment; import android.app.Fragment; import android.content.Context; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.mcxiaoke.minicat.AppContext; import com.mcxiaoke.minicat.Cache; import com.mcxiaoke.minicat.R; import com.mcxiaoke.minicat.controller.EmptyViewController; import com.mcxiaoke.minicat.dao.model.StatusModel; import com.mcxiaoke.minicat.util.IOHelper; import com.mcxiaoke.minicat.util.LogUtil; import com.mcxiaoke.minicat.util.Utils; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; import pl.droidsonroids.gif.GifDrawable; import pl.droidsonroids.gif.GifImageView; import uk.co.senab.photoview.PhotoView; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Project: fanfouapp * Package: com.mcxiaoke.fanfouapp.fragment * User: mcxiaoke * Date: 13-6-5 * Time: 下午9:56 */ public class GalleryFragment extends Fragment implements ViewPager.OnPageChangeListener { public static final String TAG = GalleryFragment.class.getSimpleName(); private ViewPager mViewPager; private TextView mStatusView; private TextView mTextView; private GalleryPagerAdapter mGalleryPagerAdapter; private List<StatusModel> mStatusModels; private int mIndex; private String mUserId; private int mCounter; public static GalleryFragment newInstance(String userId, int index) { GalleryFragment fragment = new GalleryFragment(); Bundle args = new Bundle(); args.putString("userId", userId); args.putInt("index", index); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); Bundle args = getArguments(); mIndex = args.getInt("index"); mUserId = args.getString("userId"); List<StatusModel> models = Cache.get(mUserId); if (AppContext.DEBUG) { LogUtil.d(TAG, "onCreate() " + models); } if (models == null || models.isEmpty()) { getActivity().finish(); return; } if (mIndex < 0 || mIndex >= models.size()) { mIndex = 0; } mStatusModels = new ArrayList<StatusModel>(); mStatusModels.addAll(models); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fm_gallery, null); mViewPager = (ViewPager) root.findViewById(R.id.gallery); mStatusView = (TextView) root.findViewById(R.id.status); mTextView = (TextView) root.findViewById(R.id.text); return root; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mGalleryPagerAdapter = new GalleryPagerAdapter(getActivity(), mStatusModels); mViewPager.setOffscreenPageLimit(2); mViewPager.setAdapter(mGalleryPagerAdapter); mViewPager.setCurrentItem(mIndex); setPageText(mIndex); mViewPager.addOnPageChangeListener(this); } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_photo, menu); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == R.id.menu_save) { doSave(); return true; } return super.onOptionsItemSelected(item); } private void doSave() { final StatusModel model = mGalleryPagerAdapter.getUrlAt(mViewPager.getCurrentItem()); final String imageUri = model.getPhotoLargeUrl().split("@")[0]; if (TextUtils.isEmpty(imageUri)) { return; } File file = ImageLoader.getInstance().getDiscCache().get(imageUri); if (file == null || !file.isFile()) { return; } String ext = imageUri.toLowerCase().endsWith(".gif") ? ".gif" : ".jpg"; final String fileName = "IMG_FANFOU_" + System.currentTimeMillis() + ext; File dest = new File(IOHelper.getPictureDir(getActivity()), fileName); if (dest.exists() || IOHelper.copyFile(file, dest)) { Utils.mediaScan(getActivity(), Uri.fromFile(dest)); Utils.notify(getActivity(), "图片已保存到存储卡的 Pictures 目录"); } } @Override public void onDestroy() { super.onDestroy(); ImageLoader.getInstance().clearMemoryCache(); mStatusModels.clear(); mStatusModels = null; } private void setPageText(int position) { final StatusModel model = mStatusModels.get(position); mStatusView.setText(model.getSimpleText()); mTextView.setText("" + (position + 1) + " / " + mStatusModels.size()); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { setPageText(position); if (++mCounter % 20 == 0) { ImageLoader.getInstance().clearMemoryCache(); } } @Override public void onPageScrollStateChanged(int state) { } static class GalleryPagerAdapter extends PagerAdapter { private Context mContext; private LayoutInflater mInflater; private List<StatusModel> mResources; public GalleryPagerAdapter(Context context, List<StatusModel> resources) { mContext = context; mInflater = LayoutInflater.from(context); mResources = resources; } public StatusModel getUrlAt(int position) { if (position < 0 || position >= getCount()) { return null; } return mResources.get(position); } @Override public int getCount() { return mResources.size(); } @Override public Object instantiateItem(ViewGroup container, int position) { ViewGroup view = (ViewGroup) mInflater.inflate(R.layout.gallery_item_photo, container, false); final PhotoView imageView = (PhotoView) view.findViewById(R.id.photo); final GifImageView gifImageView = (GifImageView) view.findViewById(R.id.gif); View vEmpty = view.findViewById(android.R.id.empty); final EmptyViewController emptyViewController = new EmptyViewController(vEmpty); final StatusModel model = mResources.get(position); final String imageUri = model.getPhotoLargeUrl().split("@")[0]; ImageLoader.getInstance().loadImage(imageUri, getDisplayImageOptions(), new ImageLoaderCallback(imageView, gifImageView, emptyViewController)); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object view) { container.removeView((View) view); } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } private DisplayImageOptions getDisplayImageOptions() { DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder(); builder.cacheInMemory(true).cacheOnDisc(true); builder.bitmapConfig(Bitmap.Config.ARGB_8888); builder.showImageOnFail(R.drawable.photo_error); builder.showImageOnLoading(R.drawable.photo_loading); builder.imageScaleType(ImageScaleType.IN_SAMPLE_INT); return builder.build(); } private class ImageLoaderCallback extends SimpleImageLoadingListener { private PhotoView imageView; private GifImageView gifImageView; private EmptyViewController emptyViewController; public ImageLoaderCallback(PhotoView imageView, GifImageView gifImageView, EmptyViewController emptyViewController) { this.imageView = imageView; this.gifImageView = gifImageView; this.emptyViewController = emptyViewController; } private void showProgress() { imageView.setVisibility(View.GONE); gifImageView.setVisibility(View.GONE); emptyViewController.showProgress(); } private void showEmptyText(String text) { imageView.setVisibility(View.GONE); gifImageView.setVisibility(View.GONE); emptyViewController.showEmpty(text); } private void showContent(String imageUri, Bitmap bitmap) { emptyViewController.hideProgress(); if (bitmap == null) { return; } if (imageUri.endsWith(".gif")) { imageView.setVisibility(View.GONE); gifImageView.setVisibility(View.VISIBLE); try { final File file = ImageLoader.getInstance().getDiscCache().get(imageUri); final GifDrawable drawable = new GifDrawable(file); gifImageView.setImageDrawable(drawable); } catch (IOException e) { showEmptyText("IOException"); } } else { gifImageView.setVisibility(View.GONE); imageView.setVisibility(View.VISIBLE); imageView.setImageBitmap(bitmap); } } @Override public void onLoadingStarted(String imageUri, View view) { showProgress(); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { showEmptyText(failReason.getType().toString()); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { showContent(imageUri, loadedImage); } } } }