package com.seafile.seadroid2.ui.adapter; import android.graphics.Bitmap; import android.support.v4.view.PagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener; import com.seafile.seadroid2.util.ConcurrentAsyncTask; import com.seafile.seadroid2.R; import com.seafile.seadroid2.account.Account; import com.seafile.seadroid2.data.DataManager; import com.seafile.seadroid2.data.SeafPhoto; import com.seafile.seadroid2.transfer.DownloadStateListener; import com.seafile.seadroid2.transfer.DownloadTask; import com.seafile.seadroid2.ui.activity.GalleryActivity; import com.seafile.seadroid2.util.Utils; import uk.co.senab.photoview.PhotoView; import uk.co.senab.photoview.PhotoViewAttacher; import java.io.File; import java.util.List; /** * Gallery Adapter */ public class GalleryAdapter extends PagerAdapter { public static final String DEBUG_TAG = "GalleryAdapter"; /** unique task id */ public static int taskID; private GalleryActivity mActivity; private List<SeafPhoto> seafPhotos; private LayoutInflater inflater; private DisplayImageOptions options; private Account mAccount; private DataManager dm; public GalleryAdapter(GalleryActivity context, Account account, List<SeafPhoto> photos, DataManager dataManager) { mActivity = context; seafPhotos = photos; inflater = context.getLayoutInflater(); options = new DisplayImageOptions.Builder() .showImageForEmptyUri(R.drawable.ic_gallery_empty2) .showImageOnFail(R.drawable.gallery_loading_failed) .cacheInMemory(true) .cacheOnDisk(true) .considerExifParams(true) .extraForDownloader(account) .build(); mAccount = account; dm = dataManager; } @Override public int getCount() { return seafPhotos.size(); } public void setItems(List<SeafPhoto> photos) { seafPhotos = photos; } @Override public View instantiateItem(ViewGroup container, final int position) { View contentView = inflater.inflate(R.layout.gallery_view_item, container, false); final PhotoView photoView = (PhotoView) contentView.findViewById(R.id.gallery_photoview); final ProgressBar progressBar = (ProgressBar) contentView.findViewById(R.id.gallery_progress_bar); final String repoName = seafPhotos.get(position).getRepoName(); final String repoID = seafPhotos.get(position).getRepoID(); final String filePath = Utils.pathJoin(seafPhotos.get(position).getDirPath(), seafPhotos.get(position).getName()); final File file = dm.getLocalRepoFile(repoName, repoID, filePath); if (file.exists()) { ImageLoader.getInstance().displayImage("file://" + file.getAbsolutePath().toString(), photoView, options); } else { ConcurrentAsyncTask.execute(new DownloadTask(++taskID, mAccount, repoName, repoID, filePath, new DownloadStateListener() { @Override public void onFileDownloadProgress(int taskID) { progressBar.setVisibility(View.VISIBLE); } @Override public void onFileDownloaded(int taskID) { //Log.d(DEBUG_TAG, "DownloadTask >> onFileDownloaded"); ImageLoader.getInstance().displayImage("file://" + dm.getLocalRepoFile(repoName, repoID, filePath).getAbsolutePath().toString(), photoView, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String s, View view) { //Log.d(DEBUG_TAG, "ImageLoadingListener >> onLoadingStarted"); progressBar.setVisibility(View.VISIBLE); } @Override public void onLoadingFailed(String s, View view, FailReason failReason) { //Log.d(DEBUG_TAG, "ImageLoadingListener >> onLoadingFailed"); progressBar.setVisibility(View.INVISIBLE); } @Override public void onLoadingComplete(String s, View view, Bitmap bitmap) { //Log.d(DEBUG_TAG, "ImageLoadingListener >> onLoadingComplete"); progressBar.setVisibility(View.INVISIBLE); } @Override public void onLoadingCancelled(String s, View view) { //Log.d(DEBUG_TAG, "ImageLoadingListener >> onLoadingCancelled"); progressBar.setVisibility(View.INVISIBLE); } }, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String s, View view, int i, int i1) { // There isn`t any way to get the actual loading bytes and total bytes with which // could show the progress bar with precise percent // see https://github.com/nostra13/Android-Universal-Image-Loader/issues/402 for details progressBar.setVisibility(View.VISIBLE); } }); } @Override public void onFileDownloadFailed(int taskID) { //Log.d(DEBUG_TAG, "DownloadTask >> onFileDownloadFailed"); progressBar.setVisibility(View.INVISIBLE); ImageLoader.getInstance().displayImage("drawable://" + R.drawable.gallery_loading_failed, photoView, options); } })); } photoView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() { @Override public void onPhotoTap(View view, float x, float y) { mActivity.hideOrShowToolBar(); } }); container.addView(contentView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); return contentView; } /** * when you call notifyDataSetChanged(), * the view pager will remove all views and reload them all. * As so the reload effect is obtained. */ @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } }