From a417f690148b09fd9b3fe7ea7e7b64714791fa74 Mon Sep 17 00:00:00 2001 From: Lars Date: Fri, 17 May 2013 23:03:55 +0300 Subject: Release note update --- main/res/values/strings_not_translatable.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/main/res/values/strings_not_translatable.xml b/main/res/values/strings_not_translatable.xml index a3a10e9..1215235 100644 --- a/main/res/values/strings_not_translatable.xml +++ b/main/res/values/strings_not_translatable.xml @@ -87,6 +87,11 @@ \n + Next bugfix release\n + Bugfixing:\n + · Correction for compatability issue with tablet devices\n + \n + \n 2013.05.16\n Bugfixing:\n · Adaption to changes on gc.com (live map)\n -- cgit v1.1 From 37c0049a5525e49d45ff69c671da900a8389816a Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sat, 18 May 2013 21:00:48 +0200 Subject: fix: do not reset the distance in the distance comparator The distance comparator should not override a distance that can have been obtained from the website and that we are unable to recompute locally (because we don't know the cache coordinates for example). Part of work on #2733. --- main/src/cgeo/geocaching/sorting/DistanceComparator.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/main/src/cgeo/geocaching/sorting/DistanceComparator.java b/main/src/cgeo/geocaching/sorting/DistanceComparator.java index 7b0afbb..c34ae96 100644 --- a/main/src/cgeo/geocaching/sorting/DistanceComparator.java +++ b/main/src/cgeo/geocaching/sorting/DistanceComparator.java @@ -27,13 +27,10 @@ public class DistanceComparator extends AbstractCacheComparator { if (cachedDistances) { return; } - for (Geocache cache : list) { + for (final Geocache cache : list) { if (cache.getCoords() != null) { cache.setDistance(coords.distanceTo(cache.getCoords())); } - else { - cache.setDistance(null); - } } cachedDistances = true; } -- cgit v1.1 From 45c57ba2264bfc09d552cd2cc0e905f921fa76b0 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sat, 18 May 2013 20:08:58 +0200 Subject: fix #2733: acquire distance and direction for basic members A recent change in geocaching.com way of presenting the distance and direction information for basic members requires a new parsing. --- main/res/layout/caches_item.xml | 34 ++++++------------ .../cgeo/geocaching/connector/gc/GCConstants.java | 2 +- .../src/cgeo/geocaching/connector/gc/GCParser.java | 9 ++++- main/src/cgeo/geocaching/ui/CacheListAdapter.java | 41 ++++++---------------- main/src/cgeo/geocaching/ui/DirectionImage.java | 3 +- 5 files changed, 32 insertions(+), 57 deletions(-) diff --git a/main/res/layout/caches_item.xml b/main/res/layout/caches_item.xml index e3b861c..8ea0221 100644 --- a/main/res/layout/caches_item.xml +++ b/main/res/layout/caches_item.xml @@ -75,15 +75,13 @@ + android:layout_marginTop="1dip" > - - - - - + cc:skin="?compass" + android:visibility="gone" /> + android:minHeight="28px" + android:minWidth="28px" + android:src="@null" + android:visibility="gone" /> diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index 98b5f1a..c916071 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -117,7 +117,7 @@ public final class GCConstants { public final static Pattern PATTERN_SEARCH_TRACKABLES = Pattern.compile("]*>(.*)"); /** Second group used */ public final static Pattern PATTERN_SEARCH_TRACKABLESINSIDE = Pattern.compile("(\"([^\"]+)\"[^<]*)"); - public final static Pattern PATTERN_SEARCH_DIRECTION = Pattern.compile("]*>"); + public final static Pattern PATTERN_SEARCH_DIRECTION_DISTANCE = Pattern.compile("]*>[^<]*
([^<]+)"); public final static Pattern PATTERN_SEARCH_GEOCODE = Pattern.compile("\\|\\W*(GC[0-9A-Z]+)[^\\|]*\\|"); public final static Pattern PATTERN_SEARCH_ID = Pattern.compile("name=\"CID\"[^v]*value=\"([0-9]+)\""); public final static Pattern PATTERN_SEARCH_FAVORITE = Pattern.compile("([0-9]+)"); diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index da60060..c8a9cc2 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -166,7 +166,14 @@ public abstract class GCParser { // cache direction - image if (Settings.getLoadDirImg()) { - cache.setDirectionImg(Network.decode(BaseUtils.getMatch(row, GCConstants.PATTERN_SEARCH_DIRECTION, true, 1, cache.getDirectionImg(), true))); + final String direction = BaseUtils.getMatch(row, GCConstants.PATTERN_SEARCH_DIRECTION_DISTANCE, false, 1, null, false); + final String distance = BaseUtils.getMatch(row, GCConstants.PATTERN_SEARCH_DIRECTION_DISTANCE, false, 2, null, false); + if (direction != null) { + cache.setDirectionImg(direction); + } + if (distance != null) { + cache.setDistance(DistanceParser.parseDistance(distance, Settings.isUseMetricUnits())); + } } // cache inventory diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index 4965e0b..3e56c74 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -39,7 +39,6 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.TextView; import java.util.ArrayList; @@ -100,10 +99,8 @@ public class CacheListAdapter extends ArrayAdapter { TextView favourite; TextView info; ImageView inventory; - RelativeLayout directionLayout; DistanceView distance; CompassMiniView direction; - RelativeLayout dirImgLayout; ImageView dirImg; } @@ -358,10 +355,8 @@ public class CacheListAdapter extends ArrayAdapter { holder.checkbox = (CheckBox) v.findViewById(R.id.checkbox); holder.logStatusMark = (ImageView) v.findViewById(R.id.log_status_mark); holder.text = (TextView) v.findViewById(R.id.text); - holder.directionLayout = (RelativeLayout) v.findViewById(R.id.direction_layout); holder.distance = (DistanceView) v.findViewById(R.id.distance); holder.direction = (CompassMiniView) v.findViewById(R.id.direction); - holder.dirImgLayout = (RelativeLayout) v.findViewById(R.id.dirimg_layout); holder.dirImg = (ImageView) v.findViewById(R.id.dirimg); holder.inventory = (ImageView) v.findViewById(R.id.inventory); holder.favourite = (TextView) v.findViewById(R.id.favourite); @@ -434,35 +429,23 @@ public class CacheListAdapter extends ArrayAdapter { holder.inventory.setVisibility(View.GONE); } - boolean setDiDi = false; + if (cache.getDistance() != null) { + holder.distance.setDistance(cache.getDistance()); + } if (cache.getCoords() != null) { holder.direction.setVisibility(View.VISIBLE); + holder.dirImg.setVisibility(View.GONE); holder.direction.updateAzimuth(azimuth); if (coords != null) { holder.distance.update(coords); holder.direction.updateCurrentCoords(coords); } - setDiDi = true; - } else { - if (cache.getDistance() != null) { - holder.distance.setDistance(cache.getDistance()); - setDiDi = true; - } - if (cache.getDirection() != null) { - holder.direction.setVisibility(View.VISIBLE); - holder.direction.updateAzimuth(azimuth); - holder.direction.updateHeading(cache.getDirection()); - setDiDi = true; - } - } - - if (setDiDi) { - holder.directionLayout.setVisibility(View.VISIBLE); - holder.dirImgLayout.setVisibility(View.GONE); + } else if (cache.getDirection() != null) { + holder.direction.setVisibility(View.VISIBLE); + holder.dirImg.setVisibility(View.GONE); + holder.direction.updateAzimuth(azimuth); + holder.direction.updateHeading(cache.getDirection()); } else { - holder.directionLayout.setVisibility(View.GONE); - holder.distance.clear(); - final Bitmap dirImgPre = BitmapFactory.decodeFile(DirectionImage.getDirectionFile(cache.getGeocode(), false).getPath()); final Bitmap dirImg; if (dirImgPre != null) { // null happens for invalid caches (not yet released) @@ -487,10 +470,8 @@ public class CacheListAdapter extends ArrayAdapter { } holder.dirImg.setImageBitmap(dirImg); - holder.dirImgLayout.setVisibility(View.VISIBLE); - } else { - holder.dirImg.setImageBitmap(null); - holder.dirImgLayout.setVisibility(View.GONE); + holder.dirImg.setVisibility(View.VISIBLE); + holder.direction.setVisibility(View.GONE); } } diff --git a/main/src/cgeo/geocaching/ui/DirectionImage.java b/main/src/cgeo/geocaching/ui/DirectionImage.java index 675d73b..98b8767 100644 --- a/main/src/cgeo/geocaching/ui/DirectionImage.java +++ b/main/src/cgeo/geocaching/ui/DirectionImage.java @@ -2,7 +2,6 @@ package cgeo.geocaching.ui; import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.network.Network; -import cgeo.geocaching.network.Parameters; import ch.boye.httpclientandroidlib.HttpResponse; import org.apache.commons.lang3.StringUtils; @@ -17,7 +16,7 @@ public class DirectionImage { } final HttpResponse httpResponse = - Network.getRequest("http://www.geocaching.com/ImgGen/seek/CacheDir.ashx", new Parameters("k", code)); + Network.getRequest("http://www.geocaching.com/images/icons/compass/" + code + ".gif"); if (httpResponse != null) { LocalStorage.saveEntityToFile(httpResponse, getDirectionFile(geocode, true)); } -- cgit v1.1 From 4dcdf0c6220ff8c9149f91b251da39b905b71191 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sun, 19 May 2013 17:16:21 +0200 Subject: refactoring: share the name of the shared image directory Part of work on #2733. --- main/src/cgeo/geocaching/network/HtmlImage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java index a409750..38498d6 100644 --- a/main/src/cgeo/geocaching/network/HtmlImage.java +++ b/main/src/cgeo/geocaching/network/HtmlImage.java @@ -44,6 +44,7 @@ public class HtmlImage implements Html.ImageGetter { "trendcounter.com", "hit-counter-download.com" }; + public static final String SHARED = "shared"; final private String geocode; /** @@ -80,7 +81,7 @@ public class HtmlImage implements Html.ImageGetter { } final boolean shared = url.contains("/images/icons/icon_"); - final String pseudoGeocode = shared ? "shared" : geocode; + final String pseudoGeocode = shared ? SHARED : geocode; Bitmap imagePre = loadImageFromStorage(url, pseudoGeocode, shared); -- cgit v1.1 From 7125a7adbaf3cad9687a225032c85a9e7391c603 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sun, 19 May 2013 17:17:09 +0200 Subject: enhancement: share direction images for basic members Use the regular images cache for basic members direction images in cache list. Part of work on #2733. --- .../src/cgeo/geocaching/connector/gc/GCParser.java | 2 +- main/src/cgeo/geocaching/ui/CacheListAdapter.java | 32 ++-------------------- main/src/cgeo/geocaching/ui/DirectionImage.java | 31 ++++++++------------- 3 files changed, 16 insertions(+), 49 deletions(-) diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index c8a9cc2..b4d665b 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -298,7 +298,7 @@ public abstract class GCParser { final Set caches = searchResult.getCachesFromSearchResult(LoadFlags.LOAD_CACHE_OR_DB); for (Geocache cache : caches) { if (cache.getCoords() == null && StringUtils.isNotEmpty(cache.getDirectionImg())) { - DirectionImage.getDrawable(cache.getGeocode(), cache.getDirectionImg()); + DirectionImage.getDrawable(cache.getDirectionImg()); } } } diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index 3e56c74..163d396 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -22,8 +22,6 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; import android.app.Activity; import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.text.Spannable; @@ -446,33 +444,9 @@ public class CacheListAdapter extends ArrayAdapter { holder.direction.updateAzimuth(azimuth); holder.direction.updateHeading(cache.getDirection()); } else { - final Bitmap dirImgPre = BitmapFactory.decodeFile(DirectionImage.getDirectionFile(cache.getGeocode(), false).getPath()); - final Bitmap dirImg; - if (dirImgPre != null) { // null happens for invalid caches (not yet released) - dirImg = dirImgPre.copy(Bitmap.Config.ARGB_8888, true); - dirImgPre.recycle(); - } - else { - dirImg = null; - } - - if (dirImg != null) { - if (!lightSkin) { - final int length = dirImg.getWidth() * dirImg.getHeight(); - final int[] pixels = new int[length]; - dirImg.getPixels(pixels, 0, dirImg.getWidth(), 0, 0, dirImg.getWidth(), dirImg.getHeight()); - for (int i = 0; i < length; i++) { - if (pixels[i] == 0xff000000) { // replace black with white - pixels[i] = 0xffffffff; - } - } - dirImg.setPixels(pixels, 0, dirImg.getWidth(), 0, 0, dirImg.getWidth(), dirImg.getHeight()); - } - - holder.dirImg.setImageBitmap(dirImg); - holder.dirImg.setVisibility(View.VISIBLE); - holder.direction.setVisibility(View.GONE); - } + holder.dirImg.setImageDrawable(DirectionImage.getDrawable(cache.getDirectionImg())); + holder.dirImg.setVisibility(View.VISIBLE); + holder.direction.setVisibility(View.GONE); } holder.favourite.setText(Integer.toString(cache.getFavoritePoints())); diff --git a/main/src/cgeo/geocaching/ui/DirectionImage.java b/main/src/cgeo/geocaching/ui/DirectionImage.java index 98b8767..df7275d 100644 --- a/main/src/cgeo/geocaching/ui/DirectionImage.java +++ b/main/src/cgeo/geocaching/ui/DirectionImage.java @@ -1,29 +1,22 @@ package cgeo.geocaching.ui; -import cgeo.geocaching.files.LocalStorage; -import cgeo.geocaching.network.Network; +import cgeo.geocaching.StoredList; +import cgeo.geocaching.network.HtmlImage; -import ch.boye.httpclientandroidlib.HttpResponse; -import org.apache.commons.lang3.StringUtils; - -import java.io.File; +import android.graphics.drawable.BitmapDrawable; public class DirectionImage { - public static void getDrawable(final String geocode, final String code) { - if (StringUtils.isBlank(geocode) || StringUtils.isBlank(code)) { - return; - } - - final HttpResponse httpResponse = - Network.getRequest("http://www.geocaching.com/images/icons/compass/" + code + ".gif"); - if (httpResponse != null) { - LocalStorage.saveEntityToFile(httpResponse, getDirectionFile(geocode, true)); - } - } + static private HtmlImage htmlImage = new HtmlImage(HtmlImage.SHARED, false, StoredList.STANDARD_LIST_ID, false); - public static File getDirectionFile(final String geocode, final boolean createDirs) { - return LocalStorage.getStorageFile(geocode, "direction.png", false, createDirs); + /** + * Retrieve the direction image corresponding to the direction code. + * + * @param directionCode one of the eight cardinal points + * @return a drawable with the arrow pointing into the right direction + */ + public static BitmapDrawable getDrawable(final String directionCode) { + return htmlImage.getDrawable("http://www.geocaching.com/images/icons/compass/" + directionCode + ".gif"); } } -- cgit v1.1 From a09d414466028179ac4c7737dd0336a6d38bc00d Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sun, 19 May 2013 17:27:08 +0200 Subject: enhancement: make the distance comparator work with approximate distance Part of work on #2733. --- main/src/cgeo/geocaching/sorting/DistanceComparator.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/main/src/cgeo/geocaching/sorting/DistanceComparator.java b/main/src/cgeo/geocaching/sorting/DistanceComparator.java index c34ae96..731e356 100644 --- a/main/src/cgeo/geocaching/sorting/DistanceComparator.java +++ b/main/src/cgeo/geocaching/sorting/DistanceComparator.java @@ -43,16 +43,12 @@ public class DistanceComparator extends AbstractCacheComparator { @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { calculateAllDistances(); - if (cache1.getCoords() == null && cache2.getCoords() == null) { - return 0; + final Float distance1 = cache1.getDistance(); + final Float distance2 = cache2.getDistance(); + if (distance1 == null) { + return distance2 == null ? 0 : 1; } - if (cache1.getCoords() == null) { - return 1; - } - if (cache2.getCoords() == null) { - return -1; - } - return Float.compare(cache1.getDistance(), cache2.getDistance()); + return distance2 == null ? -1 : Float.compare(distance1, distance2); } } -- cgit v1.1