package com.datdo.mobilib.imageinput;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
import com.datdo.mobilib.util.MblSimpleImageLoader;
import com.datdo.mobilib.util.MblSimpleImageLoader.*;
import com.datdo.mobilib.util.MblUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
class MblPickImageGridViewAdapter extends CursorAdapter {
private MblSimpleImageLoader<ImageMetaData> mImageLoader = new MblSimpleImageLoader<ImageMetaData>() {
@Override
protected ImageMetaData getItemBoundWithView(View view) {
return ((Holder)view.getTag()).mImageData;
}
@Override
protected ImageView getImageViewBoundWithView(View view) {
return ((Holder)view.getTag()).mThumbnailImageView;
}
@Override
protected String getItemId(ImageMetaData item) {
return String.valueOf(item.mImageId);
}
@Override
protected void retrieveImage(final ImageMetaData item, final MblRetrieveImageCallback cb) {
MblUtils.executeOnAsyncThread(new Runnable() {
@Override
public void run() {
Bitmap bm = null;
File file = new File(item.mImagePath);
if (file.exists() && file.length() > 0) {
bm = MediaStore.Images.Thumbnails.getThumbnail(
MblUtils.getCurrentContext().getContentResolver(),
item.mImageId,
MediaStore.Images.Thumbnails.MICRO_KIND,
null);
}
if (bm != null) {
bm = MblUtils.correctBitmapOrientation(item.mImagePath, bm);
}
cb.onRetrievedBitmap(bm);
MblUtils.getMainThreadHandler().post(new Runnable() {
@Override
public void run() {
cb.onRetrievedFile(item.mImagePath);
}
});
}
});
}
@Override
protected void onError(ImageView imageView, ImageMetaData item) {
imageView.setImageBitmap(null);
}
}.setOptions(new MblOptions()
.setSerializeImageLoading(false)
.setDelayedDurationInParallelMode(0)
.setEnableProgressView(false)
.setEnableFadingAnimation(false));
private final Set<Integer> mThumbnailsSelection = new HashSet<Integer>();
private int mPhotoNumberLimit;
private GridView mGridView;
public MblPickImageGridViewAdapter(Context context, int photoNumberLimit, GridView gridView) {
super(context, null, false);
mPhotoNumberLimit = photoNumberLimit;
mGridView = gridView;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
Holder holder = (Holder) view.getTag();
int holderId = cursor.getPosition();
holder.mId = holderId;
int imageId = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Media._ID));
String imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
holder.mImageData = new ImageMetaData(imageId, imagePath);
mImageLoader.loadImage(view);
boolean checkOn = mThumbnailsSelection.contains(holderId);
setItemCheckedStatus(holder, checkOn);
}
@SuppressLint("InflateParams")
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
View view = MblUtils.getLayoutInflater().inflate(R.layout.mbl_image_picker_item, null);
final Holder holder = new Holder();
holder.mThumbnailImageView = (MblAutoResizeSquareImageView) view.findViewById(R.id.image_picker_imageview);
holder.mCheckView = view.findViewById(R.id.image_picker_checkview);
holder.mHiddenLayer = view.findViewById(R.id.image_picker_hidden_layer);
view.setTag(holder);
holder.mCheckView.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
holder.mThumbnailImageView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
toggleItemSelect(holder);
}
});
return view;
}
private void setItemCheckedStatus(Holder holder, boolean checkOn) {
holder.mCheckView.setSelected(checkOn);
holder.mHiddenLayer.setVisibility(checkOn ? View.VISIBLE : View.GONE);
}
private void toggleItemSelect(Holder holder) {
int holderId = holder.mId;
boolean isChecked = mThumbnailsSelection.contains(holderId);
if(!isChecked) {
if(mThumbnailsSelection.size() < mPhotoNumberLimit) {
mThumbnailsSelection.add(holderId);
setItemCheckedStatus(holder, true);
} else {
if (mPhotoNumberLimit == 1) {
for (int i = 0; i < mGridView.getChildCount(); i++) {
View view = mGridView.getChildAt(i);
Holder temp = (Holder) view.getTag();
if (mThumbnailsSelection.contains(temp.mId)){
setItemCheckedStatus(temp, false);
}
}
mThumbnailsSelection.clear();
mThumbnailsSelection.add(holderId);
setItemCheckedStatus(holder, true);
} else {
MblUtils.showToast(
MblUtils.getCurrentContext().getString(R.string.mbl_select_at_most_x_photos_at_once, mPhotoNumberLimit),
Toast.LENGTH_SHORT);
}
}
} else{
mThumbnailsSelection.remove(holderId);
setItemCheckedStatus(holder, false);
}
}
public List<String> getSelectedImageUri() {
Cursor cursor = getCursor();
List<String> selectedImageUris = new ArrayList<String>();
int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
int dateModifiedColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED);
final Map<String, Long> mapOfPathAndDate = new HashMap<String, Long>();
for(Integer position : mThumbnailsSelection) {
cursor.moveToPosition(position);
String path = cursor.getString(dataColumnIndex);
long dateModified = cursor.getLong(dateModifiedColumnIndex);
selectedImageUris.add(path);
mapOfPathAndDate.put(path, dateModified);
}
// sort paths by date modified DESC
Collections.sort(selectedImageUris, new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
long leftDateModified = mapOfPathAndDate.get(lhs);
long rightDateModified = mapOfPathAndDate.get(rhs);
if (leftDateModified > rightDateModified) {
return -1;
}
if (leftDateModified < rightDateModified) {
return 1;
}
return 0;
}
});
return selectedImageUris;
}
private class Holder {
MblAutoResizeSquareImageView mThumbnailImageView;
View mHiddenLayer;
View mCheckView;
int mId;
ImageMetaData mImageData;
}
private class ImageMetaData {
int mImageId;
String mImagePath;
public ImageMetaData(int imageId, String imagePath) {
mImageId = imageId;
mImagePath = imagePath;
}
}
public void clearCache() {
mImageLoader.invalidate(ImageMetaData.class);
}
}