diff options
Diffstat (limited to 'main/src/cgeo/geocaching/ui')
7 files changed, 93 insertions, 59 deletions
diff --git a/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java b/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java index ed5d182..0c67384 100644 --- a/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java +++ b/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java @@ -3,7 +3,6 @@ package cgeo.geocaching.ui; import cgeo.geocaching.activity.AbstractViewPagerActivity.PageViewCreator; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; - import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; diff --git a/main/src/cgeo/geocaching/ui/AnchorAwareLinkMovementMethod.java b/main/src/cgeo/geocaching/ui/AnchorAwareLinkMovementMethod.java index db82e5c..d4c2e10 100644 --- a/main/src/cgeo/geocaching/ui/AnchorAwareLinkMovementMethod.java +++ b/main/src/cgeo/geocaching/ui/AnchorAwareLinkMovementMethod.java @@ -8,7 +8,7 @@ import android.widget.TextView; /** * <code>LinkMovementMethod</code> with built-in suppression of errors for links, where the URL cannot be handled * correctly by Android. - * + * */ public class AnchorAwareLinkMovementMethod extends LinkMovementMethod { diff --git a/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java b/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java index 7fe77c4..5d8ebef 100644 --- a/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java +++ b/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java @@ -39,6 +39,11 @@ public final class CacheDetailsCreator { parentView.removeAllViews(); } + /** + * @param nameId + * @param value + * @return the view containing the displayed string (i.e. the right side one from the pair of "label": "value") + */ public TextView add(final int nameId, final CharSequence value) { final RelativeLayout layout = (RelativeLayout) activity.getLayoutInflater().inflate(R.layout.cache_information_item, null); final TextView nameView = (TextView) layout.findViewById(R.id.name); @@ -188,14 +193,24 @@ public final class CacheDetailsCreator { if (!cache.isEventCache()) { return; } + addHiddenDate(cache); + } + + public TextView addHiddenDate(final @NonNull Geocache cache) { final Date hiddenDate = cache.getHiddenDate(); if (hiddenDate == null) { - return; + return null; } final long time = hiddenDate.getTime(); if (time > 0) { - final String dateString = DateUtils.formatDateTime(CgeoApplication.getInstance().getBaseContext(), time, DateUtils.FORMAT_SHOW_WEEKDAY) + ", " + Formatter.formatFullDate(time); - add(R.string.cache_event, dateString); + String dateString = Formatter.formatFullDate(time); + if (cache.isEventCache()) { + dateString = DateUtils.formatDateTime(CgeoApplication.getInstance().getBaseContext(), time, DateUtils.FORMAT_SHOW_WEEKDAY) + ", " + dateString; + } + final TextView view = add(cache.isEventCache() ? R.string.cache_event : R.string.cache_hidden, dateString); + view.setId(R.id.date); + return view; } + return null; } } diff --git a/main/src/cgeo/geocaching/ui/ImagesList.java b/main/src/cgeo/geocaching/ui/ImagesList.java index 4eaf06d..fb2ac15 100644 --- a/main/src/cgeo/geocaching/ui/ImagesList.java +++ b/main/src/cgeo/geocaching/ui/ImagesList.java @@ -10,6 +10,17 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import rx.Observable; +import rx.Observable.OnSubscribeFunc; +import rx.Observer; +import rx.Scheduler; +import rx.Subscription; +import rx.android.concurrency.AndroidSchedulers; +import rx.concurrency.Schedulers; +import rx.subscriptions.CompositeSubscription; +import rx.subscriptions.Subscriptions; +import rx.util.functions.Action1; + import android.app.Activity; import android.content.Intent; import android.content.res.Resources; @@ -18,7 +29,6 @@ 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; @@ -36,16 +46,19 @@ import java.io.FileOutputStream; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; public class ImagesList { private BitmapDrawable currentDrawable; private Image currentImage; + private CompositeSubscription subscriptions = new CompositeSubscription(); 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; @@ -69,6 +82,9 @@ public class ImagesList { private final String geocode; private LinearLayout imagesView; + private Scheduler downloadScheduler = Schedulers.executor(new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS, + new LinkedBlockingQueue<Runnable>())); + public ImagesList(final Activity activity, final String geocode) { this.activity = activity; this.geocode = geocode; @@ -80,7 +96,8 @@ public class ImagesList { imagesView = (LinearLayout) parentView.findViewById(R.id.spoiler_list); 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 +110,69 @@ public class ImagesList { descView.setVisibility(View.VISIBLE); } - new AsyncImgLoader(rowView, img, offline).execute(); + subscriptions.add(loadImage(img, offline) + .subscribeOn(downloadScheduler) + .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<BitmapDrawable>() { + @Override + public void call(final BitmapDrawable image) { + display(image, img, rowView); + } + })); + imagesView.addView(rowView); } } - private class AsyncImgLoader extends AsyncTask<Void, Void, BitmapDrawable> { + private Observable<BitmapDrawable> loadImage(final Image img, final boolean offline) { + return Observable.create(new OnSubscribeFunc<BitmapDrawable>() { + @Override + public Subscription onSubscribe(final Observer<? super BitmapDrawable> observer) { + final HtmlImage imgGetter = new HtmlImage(geocode, true, offline ? StoredList.STANDARD_LIST_ID : StoredList.TEMPORARY_LIST_ID, false); + observer.onNext(imgGetter.getDrawable(img.getUrl())); + observer.onCompleted(); + return Subscriptions.empty(); + } + }); + } - final private LinearLayout view; - final private Image img; - final boolean offline; + private void display(final BitmapDrawable image, final Image img, final LinearLayout view) { + if (image != null) { + bitmaps.add(image.getBitmap()); + final ImageView imageView = (ImageView) inflater.inflate(R.layout.image_item, null); + assert(imageView != null); - public AsyncImgLoader(final LinearLayout view, final Image img, final boolean offline) { - this.view = view; - this.img = img; - this.offline = offline; - } + final Rect bounds = image.getBounds(); - @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()); - } + 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())); - @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); - } + view.findViewById(R.id.progress_bar).setVisibility(View.GONE); + view.addView(imageView); + + imageView.setId(image.hashCode()); + images.put(imageView.getId(), img); } } public void removeAllViews() { - imagesView.removeAllViews(); for (final Bitmap b : bitmaps) { b.recycle(); } bitmaps.clear(); + + // Stop loading images if some are still in progress + subscriptions.unsubscribe(); + imagesView.removeAllViews(); } public void onCreateContextMenu(ContextMenu menu, View v) { diff --git a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java index 93f50e1..651ff6e 100644 --- a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java +++ b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java @@ -54,7 +54,7 @@ public class CoordinatesInputDialog extends NoTitleDialog { } else if (geo != null && geo.getCoords() != null) { this.gp = geo.getCoords(); } else { - this.gp = new Geopoint(0.0, 0.0); + this.gp = Geopoint.ZERO; } } @@ -396,7 +396,7 @@ public class CoordinatesInputDialog extends NoTitleDialog { if (geo != null && geo.getCoords() != null) { gp = geo.getCoords(); } else { - gp = new Geopoint(0.0, 0.0); + gp = Geopoint.ZERO; } } } diff --git a/main/src/cgeo/geocaching/ui/dialog/Dialogs.java b/main/src/cgeo/geocaching/ui/dialog/Dialogs.java index 865ba70..4f6de39 100644 --- a/main/src/cgeo/geocaching/ui/dialog/Dialogs.java +++ b/main/src/cgeo/geocaching/ui/dialog/Dialogs.java @@ -1,10 +1,10 @@ package cgeo.geocaching.ui.dialog; import cgeo.geocaching.CgeoApplication; -import cgeo.geocaching.utils.RunnableWithArgument; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.Nullable; +import rx.util.functions.Action1; import android.app.Activity; import android.app.AlertDialog; @@ -310,7 +310,7 @@ public final class Dialogs { * @param okayListener * listener to be run on okay */ - public static void input(final Activity context, final int title, final String defaultValue, final int buttonTitle, final RunnableWithArgument<String> okayListener) { + public static void input(final Activity context, final int title, final String defaultValue, final int buttonTitle, final Action1<String> okayListener) { final EditText input = new EditText(context); input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_CLASS_TEXT); input.setText(defaultValue); @@ -322,7 +322,7 @@ public final class Dialogs { @Override public void onClick(DialogInterface dialog, int which) { - okayListener.run(input.getText().toString()); + okayListener.call(input.getText().toString()); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { diff --git a/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java b/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java index 6ad59ec..702b85d 100644 --- a/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java +++ b/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java @@ -1,8 +1,8 @@ package cgeo.geocaching.ui.dialog; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.CgeoApplication; import android.app.Activity; import android.app.AlertDialog; |
