package org.witness.informacam.app.utils.adapters; import info.guardianproject.odkparser.utils.QD; import java.util.ArrayList; import java.util.List; import org.witness.informacam.app.R; import org.witness.informacam.app.utils.Constants.App.Editor.Forms; import org.witness.informacam.app.views.RoundedImageView; import org.witness.informacam.models.forms.IForm; import org.witness.informacam.models.media.IMedia; import org.witness.informacam.utils.Constants.App.Storage; import org.witness.informacam.utils.Constants.Models; import android.app.Activity; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.drawable.AnimationDrawable; import android.os.AsyncTask; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; public class GalleryGridAdapter extends BaseAdapter { private class MediaInfo { public boolean hasTags; public boolean hasAudio; public boolean hasNotes; public MediaInfo(boolean hasTags, boolean hasAudio, boolean hasNotes) { this.hasTags = hasTags; this.hasAudio = hasAudio; this.hasNotes = hasNotes; } }; private List<? super IMedia> media; private List<MediaInfo> mediaInfo; private MediaInfo mediaInfoDefault = new MediaInfo(false, false, false); LayoutInflater li; Activity a; boolean mInSelectionMode; private int mNumLoading; private AsyncTask<List<? super IMedia>, Void, Void> mUpdateInfoTask; //private final static String LOG = App.LOG; public GalleryGridAdapter(Activity a, List<? super IMedia> media) throws NullPointerException { this.a = a; li = LayoutInflater.from(a); setMediaAndUpdateInfo(media); } public void setNumLoading(int loading) { mNumLoading = loading; notifyDataSetChanged(); } public void update(List<IMedia> newMedia) { setMediaAndUpdateInfo(newMedia); notifyDataSetChanged(); } @SuppressWarnings("unchecked") private void setMediaAndUpdateInfo(List<? super IMedia> newMedia) { synchronized(this) { this.media = newMedia; this.mediaInfo = null; if (mUpdateInfoTask != null) mUpdateInfoTask.cancel(false); } mUpdateInfoTask = new AsyncTask<List<? super IMedia>, Void, Void>() { private List<? super IMedia> mediaToProcess = null; private List<MediaInfo> mediaInfoProcessed = null; @Override protected Void doInBackground(List<? super IMedia>... params) { mediaToProcess = params[0]; if (mediaToProcess == null || mediaToProcess.size() == 0) return null; mediaInfoProcessed = new ArrayList<MediaInfo>(mediaToProcess.size()); for (int i = 0; i < mediaToProcess.size(); i++) { if (isCancelled()) break; IMedia m = (IMedia) mediaToProcess.get(i); boolean hasAudio = false; boolean hasNotes = false; boolean hasTags = false; try { for (IForm form : m.getForms(a)) { if (form.namespace.equals(Forms.FreeAudio.TAG)) { hasAudio = true; } else if (form.namespace.equals(Forms.FreeText.TAG)) { QD question = form .getQuestionDefByTitleId(Forms.FreeText.PROMPT); if (question != null && question.hasInitialValue && !TextUtils .isEmpty(question.initialValue)) hasNotes = true; } } } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } hasTags = (m.getInnerLevelRegions().size() > 0); mediaInfoProcessed.add(new MediaInfo(hasTags, hasAudio, hasNotes)); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); synchronized(GalleryGridAdapter.this) { if (mediaToProcess != null && mediaToProcess == media) mediaInfo = mediaInfoProcessed; mUpdateInfoTask = null; } notifyDataSetChanged(); } }; mUpdateInfoTask.execute(media); } public void setInSelectionMode(boolean inSelectionMode) { mInSelectionMode = inSelectionMode; } @Override public int getCount() { int ret = 0; if (media != null) ret = media.size(); ret += mNumLoading; return ret; } @Override public Object getItem(int position) { if (position < mNumLoading) return null; return media.get(position - mNumLoading); } @Override public long getItemId(int position) { Object item = getItem(position); if (item != null) return item.hashCode(); return position; } class ViewHolder { ImageView imageView; CheckBox checkBox; View viewOverlay; View viewSymbols; View viewAudio; View viewNote; View viewTag; View viewEncrypted; AsyncTask<Integer, Void, Bitmap> loadTask; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = null; ViewHolder holder; if (position < mNumLoading) { if (convertView != null && !(((ViewGroup)convertView).getChildAt(0) instanceof RoundedImageView)) view = convertView; else view = li.inflate(R.layout.adapter_gallery_grid_placeholder, parent, false); holder = (ViewHolder)view.getTag(); if (holder == null) { holder = new ViewHolder(); holder.imageView = (ImageView) view.findViewById(R.id.flPlaceholder); AnimationDrawable encryptionAnimation = (AnimationDrawable) holder.imageView.getDrawable(); encryptionAnimation.start(); view.setTag(holder); } else { AnimationDrawable encryptionAnimation = (AnimationDrawable) holder.imageView.getDrawable(); encryptionAnimation.start(); } } else { IMedia m = (IMedia) media.get(position - mNumLoading); MediaInfo info = mediaInfoDefault; if (mediaInfo != null && mediaInfo.size() > 0) info = mediaInfo.get(Math.min(mediaInfo.size()-1,position - mNumLoading)); if (convertView != null && (((ViewGroup)convertView).getChildAt(0) instanceof RoundedImageView)) view = convertView; else view = li.inflate(R.layout.adapter_gallery_grid, parent, false); holder = (ViewHolder)view.getTag(); if (holder == null) { holder = new ViewHolder(); holder.checkBox = (CheckBox) view .findViewById(R.id.chkSelect); holder.imageView = (ImageView) view.findViewById(R.id.gallery_thumb); holder.viewOverlay = view.findViewById(R.id.new_media_overlay); holder.viewSymbols = view.findViewById(R.id.llSymbols); holder.viewAudio = view.findViewById(R.id.ivAudioNote); holder.viewNote = view.findViewById(R.id.ivNote); holder.viewTag = view.findViewById(R.id.ivTag); holder.viewEncrypted = view.findViewById(R.id.ivEncrypted); view.setTag(holder); } holder.checkBox.setVisibility( mInSelectionMode ? View.VISIBLE : View.GONE); if (m.has(Models.IMedia.TempKeys.IS_SELECTED)) { holder.checkBox.setChecked(m .getBoolean(Models.IMedia.TempKeys.IS_SELECTED)); } else { holder.checkBox.setChecked(false); } if (holder.loadTask != null) holder.loadTask.cancel(true); if (!m.hasThumbnail()) { holder.imageView.setImageResource(R.drawable.ic_home_gallery); holder.loadTask = new ThumbnailTask(holder,m); holder.loadTask.execute(128); } else { holder.imageView.setImageBitmap(m.getThumbnail(128)); } holder.viewOverlay.setVisibility(m.isNew ? View.VISIBLE : View.GONE); holder.viewSymbols.setVisibility((info.hasAudio || info.hasNotes || info.hasTags || (m.dcimEntry.fileAsset.source == Storage.Type.IOCIPHER)) ? View.VISIBLE : View.GONE); holder.viewAudio.setVisibility(info.hasAudio ? View.VISIBLE : View.GONE); holder.viewNote.setVisibility(info.hasNotes ? View.VISIBLE : View.GONE); holder.viewTag.setVisibility(info.hasTags ? View.VISIBLE : View.GONE); holder.viewEncrypted.setVisibility((m.dcimEntry.fileAsset.source == Storage.Type.IOCIPHER) ? View.VISIBLE : View.GONE); } return view; } private static class ThumbnailTask extends AsyncTask<Integer, Void, Bitmap> { private ViewHolder mHolder; private IMedia mMedia; public ThumbnailTask(ViewHolder holder, IMedia media) { mHolder = holder; mMedia = media; } @Override protected void onPostExecute(Bitmap result) { Bitmap bitmap = (Bitmap)result; mHolder.imageView.setImageBitmap(bitmap); } @Override protected Bitmap doInBackground(Integer... size) { Bitmap bitmap = mMedia.getThumbnail(size[0]); return bitmap; } } }