diff options
Diffstat (limited to 'main/src/cgeo/geocaching/ui/ImagesList.java')
| -rw-r--r-- | main/src/cgeo/geocaching/ui/ImagesList.java | 116 |
1 files changed, 65 insertions, 51 deletions
diff --git a/main/src/cgeo/geocaching/ui/ImagesList.java b/main/src/cgeo/geocaching/ui/ImagesList.java index 4eaf06d..dcce969 100644 --- a/main/src/cgeo/geocaching/ui/ImagesList.java +++ b/main/src/cgeo/geocaching/ui/ImagesList.java @@ -9,6 +9,12 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import rx.Subscription; +import rx.android.observables.AndroidObservable; +import rx.functions.Action0; +import rx.functions.Action1; +import rx.subscriptions.CompositeSubscription; +import rx.subscriptions.Subscriptions; import android.app.Activity; import android.content.Intent; @@ -18,14 +24,12 @@ import android.graphics.Bitmap.CompressFormat; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; -import android.os.AsyncTask; import android.text.Html; import android.util.SparseArray; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -44,8 +48,7 @@ public class ImagesList { public enum ImageType { LogImages(R.string.cache_log_images_title), - SpoilerImages(R.string.cache_spoiler_images_title), - AllImages(R.string.cache_images_title); + SpoilerImages(R.string.cache_spoiler_images_title); private final int titleResId; @@ -75,12 +78,31 @@ public class ImagesList { inflater = activity.getLayoutInflater(); } - public void loadImages(final View parentView, final List<Image> images, final boolean offline) { + /** + * Load images into a view. + * + * @param parentView a view to load the images into + * @param images the images to load + * @param offline <tt>true</tt> if the images must be stored for offline use + * @return a subscription which, when unsubscribed, interrupts the loading and clears up resources + */ + public Subscription loadImages(final View parentView, final List<Image> images, final boolean offline) { + // Start with a fresh subscription because of this method can be called several times if the + // englobing activity is stopped/restarted. + final CompositeSubscription subscriptions = new CompositeSubscription(Subscriptions.create(new Action0() { + @Override + public void call() { + removeAllViews(); + } + })); imagesView = (LinearLayout) parentView.findViewById(R.id.spoiler_list); + final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? StoredList.STANDARD_LIST_ID : StoredList.TEMPORARY_LIST_ID, false); + for (final Image img : images) { - LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.cache_image_item, null); + final LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.cache_image_item, null); + assert(rowView != null); if (StringUtils.isNotBlank(img.getTitle())) { ((TextView) rowView.findViewById(R.id.title)).setText(Html.fromHtml(img.getTitle())); @@ -93,66 +115,58 @@ public class ImagesList { descView.setVisibility(View.VISIBLE); } - new AsyncImgLoader(rowView, img, offline).execute(); + final ImageView imageView = (ImageView) inflater.inflate(R.layout.image_item, null); + assert(imageView != null); + subscriptions.add(AndroidObservable.fromActivity(activity, imgGetter.fetchDrawable(img.getUrl())) + .subscribe(new Action1<BitmapDrawable>() { + @Override + public void call(final BitmapDrawable image) { + display(imageView, image, img, rowView); + } + })); + rowView.addView(imageView); imagesView.addView(rowView); } + + return subscriptions; } - private class AsyncImgLoader extends AsyncTask<Void, Void, BitmapDrawable> { + private void display(final ImageView imageView, final BitmapDrawable image, final Image img, final LinearLayout view) { + if (image != null) { + bitmaps.add(image.getBitmap()); - final private LinearLayout view; - final private Image img; - final boolean offline; + final Rect bounds = image.getBounds(); - public AsyncImgLoader(final LinearLayout view, final Image img, final boolean offline) { - this.view = view; - this.img = img; - this.offline = offline; - } + imageView.setImageResource(R.drawable.image_not_loaded); + imageView.setClickable(true); + imageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View arg0) { + viewImageInStandardApp(image); + } + }); + activity.registerForContextMenu(imageView); + imageView.setImageDrawable(image); + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + imageView.setLayoutParams(new LinearLayout.LayoutParams(bounds.width(), bounds.height())); - @Override - protected BitmapDrawable doInBackground(Void... params) { - final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? StoredList.STANDARD_LIST_ID : StoredList.TEMPORARY_LIST_ID, false); - return imgGetter.getDrawable(img.getUrl()); - } + view.findViewById(R.id.progress_bar).setVisibility(View.GONE); - @Override - protected void onPostExecute(final BitmapDrawable image) { - if (image != null) { - bitmaps.add(image.getBitmap()); - final ImageView imageView = (ImageView) inflater.inflate(R.layout.image_item, null); - - final Rect bounds = image.getBounds(); - - imageView.setImageResource(R.drawable.image_not_loaded); - imageView.setClickable(true); - imageView.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View arg0) { - viewImageInStandardApp(image); - } - }); - activity.registerForContextMenu(imageView); - imageView.setImageDrawable(image); - imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); - imageView.setLayoutParams(new LayoutParams(bounds.width(), bounds.height())); - - view.findViewById(R.id.progress_bar).setVisibility(View.GONE); - view.addView(imageView); - - imageView.setId(image.hashCode()); - images.put(imageView.getId(), img); - } + imageView.setId(image.hashCode()); + images.put(imageView.getId(), img); + + view.invalidate(); } } - public void removeAllViews() { - imagesView.removeAllViews(); + private void removeAllViews() { for (final Bitmap b : bitmaps) { b.recycle(); } bitmaps.clear(); + images.clear(); + + imagesView.removeAllViews(); } public void onCreateContextMenu(ContextMenu menu, View v) { |
