package com.sailrobotics.posterize;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.ArrayList;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* create an instance of this fragment.
*/
public class SearchResultFragment extends Fragment {
private LruCache<String, Bitmap> mMemoryCache;
public ArrayList<PhotoModel> photos;
ProgressDialog pDialog;
Bitmap bitmap;
public SearchResultFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// for the memory cache
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
// for the disk cache
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_search_result, null);
ListView result_list = (ListView) v.findViewById(R.id.result_list);
ResultAdapter resultAdapter = new ResultAdapter();
result_list.setAdapter(resultAdapter);
result_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> av, View view, int position, long l) {
PhotoModel photo = photos.get(position);
String urls = "https://farm" + photo.getFarm_id() + ".static.flickr.com/" +
photo.getServer_id() + "/" + photo.getPhoto_id() + "_" + photo.getSecret() + "_"
+ "b.jpg";
new LoadImage().execute(urls);
Log.e("CutImage", "myPos " + position + " " + urls);
}
});
return v;
}
@Override
public void onPause() {
super.onPause();
}
static class ViewHolder {
ImageView picture;
TextView title;
}
class ResultAdapter extends BaseAdapter {
/**
* this is the list adpater to result of search
*/
@Override
public int getCount() {
return photos.size();
}
@Override
public Object getItem(int arg0) {
return arg0;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/**
* each item of list is customerized here;
*/
PhotoModel photo = photos.get(position);
// use ViewHolder for recycoling
ViewHolder mViewHolder = null;
if (convertView == null) {
mViewHolder = new ViewHolder();
convertView = SearchResultFragment.this.getActivity().getLayoutInflater().inflate(R.layout.item_result, parent, false);
mViewHolder.picture = (ImageView) convertView.findViewById(R.id.iv_item);
mViewHolder.title = (TextView) convertView.findViewById(R.id.tv_item);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
}
String url = "https://farm" + photo.getFarm_id() + ".staticflickr.com/" +
photo.getServer_id() + "/" + photo.getPhoto_id() + "_" + photo.getSecret() + "_"
+ "s.jpg";
//cancel the previous task if there is a task associated with mViewHolder.picture
if (cancelPotentialWork(url, mViewHolder.picture)) {
final LoadImageTask loadImageTask = new LoadImageTask(mViewHolder.picture);
final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), null, loadImageTask);
mViewHolder.picture.setImageDrawable(asyncDrawable);
loadImageTask.execute(url);
}
mViewHolder.title.setText(photo.getTitle());
return convertView;
}
}
private class LoadImageTask extends AsyncTask<String, Void, Bitmap> {
// use a WeakReference to make sure the ImageView can be collected
private final WeakReference<ImageView> imageViewWeakReference;
private String url = null;
public LoadImageTask(ImageView imageView) {
imageViewWeakReference = new WeakReference<ImageView>(imageView);
}
protected Bitmap doInBackground(String... urls) {
url = urls[0];
//check whether bitmap is cached
Bitmap bitmap = getBitmapFromMemoryCache(url);
if (bitmap == null) {
try {
InputStream in = new java.net.URL(url).openStream();
bitmap = BitmapFactory.decodeStream(in);
addBitmapToMemoryCache(url, bitmap);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
}
return bitmap;
}
protected void onPostExecute(Bitmap result) {
if (isCancelled()) {
result = null;
}
if (result != null) {
final ImageView imageView = imageViewWeakReference.get();
LoadImageTask loadImageTask = getLoadImageTask(imageView);
if (this == loadImageTask && imageView != null) {
imageView.setImageBitmap(result);
}
}
}
}
static class AsyncDrawable extends BitmapDrawable {
private final WeakReference<LoadImageTask> loadImageTaskWeakReference;
public AsyncDrawable(Resources res, Bitmap bitmap, LoadImageTask loadImageTask) {
super(res, bitmap);
this.loadImageTaskWeakReference = new WeakReference<LoadImageTask>(loadImageTask);
}
public LoadImageTask getLoadImageTask() {
return loadImageTaskWeakReference.get();
}
}
static LoadImageTask getLoadImageTask(ImageView iv) {
if (iv != null) {
final Drawable drawable = iv.getDrawable();
if (drawable instanceof AsyncDrawable) {
final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
return asyncDrawable.getLoadImageTask();
}
}
return null;
}
boolean cancelPotentialWork(String url, ImageView iv) {
LoadImageTask loadImageTask = getLoadImageTask(iv);
if (loadImageTask != null) {
// If bitmapData is not yet set or it differs from the new data
if (loadImageTask.url == null || !loadImageTask.url.equals(url)) {
loadImageTask.cancel(true);
} else {
// The same work is already in progress
return false;
}
}
return true;
}
private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemoryCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
private Bitmap getBitmapFromMemoryCache(String key) {
return mMemoryCache.get(key);
}
private class LoadImage extends AsyncTask<String, String, Bitmap> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Downloading Image ....");
pDialog.show();
}
protected Bitmap doInBackground(String... args) {
try {
bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent());
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
protected void onPostExecute(Bitmap image) {
if(image != null){
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "Posterize");
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
}
}
// Create a media file name
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "fromFlickr.png");
FileOutputStream out = null;
try {
out = new FileOutputStream(mediaFile);
image.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
// PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Intent cropImageIntent = new Intent(getActivity(), CropImageActivity.class);
cropImageIntent.putExtra("ImagePATH", mediaFile.getPath());
startActivity(cropImageIntent);
Log.e("IMAGE", mediaFile.getPath());
pDialog.dismiss();
}else{
pDialog.dismiss();
Toast.makeText(getActivity(), "Image Does Not exist or Network Error", Toast.LENGTH_SHORT).show();
}
}
}
}