package lab.prada.collage;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import com.androidquery.AQuery;
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.QueueProcessingType;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.support.v4.content.CursorLoader;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
public class MultipleImagePickerActivity extends Activity implements OnItemClickListener {
protected static final String EXTRA_IMAGE_PICKER_IMAGE_PATH = "image_path";
private DisplayImageOptions options;
private GridView listView;
private ImageLoader imageLoader = ImageLoader.getInstance();
private AQuery aq;
private ImageAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multiple_image_picker);
initImageLoader(this);
aq = new AQuery(this);
aq.find(R.id.btnOk).clicked(this, "clickOk");
aq.find(R.id.btnCancel).clicked(this, "clickCancel");
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error).cacheInMemory(true)
.cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build();
listView = (GridView) findViewById(R.id.gridView);
adapter = new ImageAdapter(getCameraImages(this));
((GridView) listView).setAdapter(adapter);
listView.setOnItemClickListener(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
adapter.dispose();
}
public void clickOk(View button){
Bundle bundle = new Bundle();
bundle.putStringArray(EXTRA_IMAGE_PICKER_IMAGE_PATH, adapter.getSelectedItems());
Intent intent = new Intent();
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
}
public void clickCancel(View button){
finish();
}
public static void initImageLoader(Context context) {
// This configuration tuning is custom. You can tune every option, you
// may tune some of them,
// or you can create default configuration by
// ImageLoaderConfiguration.createDefault(this);
// method.
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
context).threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);
}
public List<String> getCameraImages(Context context) {
String[] projection = new String[] { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cur = new CursorLoader(this,images,projection,"",null,"").loadInBackground();
Log.i("ListingImages", " query count=" + cur.getCount());
ArrayList<String> imagePaths = new ArrayList<String>(cur.getCount());
int rawCol = cur.getColumnIndex(MediaStore.Images.Media.DATA);
if (cur.moveToFirst()) {
do {
imagePaths.add(cur.getString(rawCol));
} while (cur.moveToNext());
}
return imagePaths;
}
public class ImageAdapter extends BaseAdapter {
private List<String> datasource;
private Hashtable<Integer,Boolean> selectionTable = new Hashtable<Integer,Boolean>();
public ImageAdapter(List<String> cameraImages) {
datasource = cameraImages;
}
private void selected(int position){
if(selectionTable.size()>Constants.SUPPORTED_FRAME_NUMBER){
Toast.makeText(MultipleImagePickerActivity.this, R.string.over_num_of_images, Toast.LENGTH_LONG).show();
}else{
if(selectionTable.containsKey(position)){
selectionTable.remove(position);
}else{
selectionTable.put(position, true);
}
notifyDataSetChanged();
}
}
public String[] getSelectedItems(){
String[] items = new String[selectionTable.size()];
Enumeration<Integer> ks = selectionTable.keys();
int count = 0;
while(ks.hasMoreElements()){
items[count++] = datasource.get(ks.nextElement());
}
return items;
}
private boolean isSelected(int position){
return selectionTable.containsKey(position);
}
@Override
public int getCount() {
return datasource.size();
}
@Override
public Object getItem(int position) {
return datasource.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void dispose(){
datasource.clear();
datasource = null;
selectionTable.clear();
selectionTable = null;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final View view;
if (convertView == null) {
view = getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
} else {
view = convertView;
}
Log.d("TEST","@@@@ "+position + " " +isSelected(position));
view.findViewById(R.id.imageView1).setVisibility((isSelected(position)?View.VISIBLE:View.INVISIBLE));
imageLoader.displayImage("file://"+datasource.get(position), (ImageView) view.findViewById(R.id.image),
options);
return view;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.multiple_image_picker, menu);
return true;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
adapter.selected(position);
}
}