package it.geosolutions.geocollect.android.core.widgets; import it.geosolutions.geocollect.android.app.R; import it.geosolutions.geocollect.android.core.form.utils.FormUtils; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ProgressBar; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; public class UILImageAdapter extends BaseAdapter { private Context context; private String[] imageUrls; private ImageLoader imageLoader; private DisplayImageOptions options; private String missionID; static class ViewHolder { ImageView imageView; ProgressBar progressBar; } public UILImageAdapter(Context context, String[] imageUrls, DisplayImageOptions options){ super(); this.context = context; this.imageLoader = ImageLoader.getInstance(); // TODO: this code should be run by the Application onCreate() callback, that is not executed at the moment // The AndroidManifest and the Application class must be tuned for that to work if(!this.imageLoader.isInited()){ Log.w("UILLoader: ", "ImageLoader was not initialized, init in progress.."); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .threadPriority(Thread.NORM_PRIORITY - 2) .threadPoolSize(5) .memoryCacheExtraOptions(640, 480) //.denyCacheImageMultipleSizesInMemory() .diskCacheFileNameGenerator(new Md5FileNameGenerator()) .tasksProcessingOrder(QueueProcessingType.FIFO) .writeDebugLogs() // TODO: Remove for release app .build(); this.imageLoader.init(config); } this.setImageUrls(imageUrls); this.options = options; } /** * Constructor to create an Adapter by the mission ID * @param context * @param missionID * @param options */ public UILImageAdapter(Context context, String missionID, DisplayImageOptions options) { this(context, FormUtils.getPhotoUriStrings(context, missionID), options); this.missionID = missionID; } @Override public int getCount() { return getImageUrls().length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; View view = convertView; if (view == null) { // TODO: Null checks on this line view = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.uil_item_grid_image, parent, false); holder = new ViewHolder(); assert view != null; holder.imageView = (ImageView) view.findViewById(R.id.image); holder.progressBar = (ProgressBar) view.findViewById(R.id.progress); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } // Store the image Path in the View view.setTag(R.id.tag_image_path, getImageUrls()[position]); imageLoader.displayImage(getImageUrls()[position], holder.imageView, options, new SimpleImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { holder.progressBar.setProgress(0); holder.progressBar.setVisibility(View.VISIBLE); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { holder.progressBar.setVisibility(View.GONE); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { holder.progressBar.setVisibility(View.GONE); } }, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { holder.progressBar.setProgress(Math.round(100.0f * current / total)); } } ); return view; } @Override public void notifyDataSetChanged() { if(missionID != null){ this.imageUrls = FormUtils.getPhotoUriStrings(this.context,missionID); } super.notifyDataSetChanged(); } public String[] getImageUrls() { return imageUrls; } public void setImageUrls(String[] imageUrls) { this.imageUrls = imageUrls; } }