aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java30
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java8
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java59
-rw-r--r--main/src/cgeo/geocaching/network/HtmlImage.java30
-rw-r--r--main/src/cgeo/geocaching/utils/ImageHelper.java47
5 files changed, 107 insertions, 67 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 3c1a36d..c9193c4 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -45,6 +45,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
@@ -65,7 +66,6 @@ import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
-import android.util.DisplayMetrics;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
@@ -1800,26 +1800,28 @@ public class CacheDetailActivity extends AbstractActivity {
@Override
protected BitmapDrawable doInBackground(Void... parameters) {
try {
- final String latlonMap = cache.getCoords().format(GeopointFormatter.Format.LAT_LON_DECDEGREE_COMMA);
-
- DisplayMetrics metrics = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(metrics);
-
- final int width = metrics.widthPixels;
- final int height = (int) (110 * metrics.density);
-
- // TODO move this code to StaticMapProvider and use its constant values
- final String markerUrl = "http://cgeo.carnero.cc/_markers/my_location_mdpi.png";
+ // persistent preview from storage
+ Bitmap image = decode(cache);
+
+ if (image == null) {
+ StaticMapsProvider.storeCachePreviewMap(cache);
+ image = decode(cache);
+ if (image == null) {
+ return null;
+ }
+ }
- final HtmlImage mapGetter = new HtmlImage(cache.getGeocode(), false, 0, false);
- final Parameters params = new Parameters("zoom", "15", "size", width + "x" + height, "maptype", "roadmap", "markers", "icon:" + markerUrl + "|shadow:false|" + latlonMap, "sensor", "false");
- return mapGetter.getDrawable("http://maps.google.com/maps/api/staticmap?" + params);
+ return ImageHelper.scaleBitmapToFitDisplay(image);
} catch (Exception e) {
Log.w("CacheDetailActivity.PreviewMapTask", e);
return null;
}
}
+ private Bitmap decode(final cgCache cache) {
+ return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(cache.getGeocode(), "preview", false).getPath());
+ }
+
@Override
protected void onPostExecute(BitmapDrawable image) {
if (image == null) {
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index ec417dd..71ea656 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -133,12 +133,12 @@ public class StaticMapsActivity extends AbstractActivity {
for (int level = 1; level <= 5; level++) {
try {
if (waypoint_id != null) {
- final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_", level, false).getPath());
+ final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_" + level, false).getPath());
if (image != null) {
maps.add(image);
}
} else {
- final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "", level, false).getPath());
+ final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath());
if (image != null) {
maps.add(image);
}
@@ -152,12 +152,12 @@ public class StaticMapsActivity extends AbstractActivity {
for (int level = 1; level <= 5; level++) {
try {
if (waypoint_id != null) {
- final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_", level, false).getPath());
+ final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_" + level, false).getPath());
if (image != null) {
maps.add(image);
}
} else {
- final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "", level, false).getPath());
+ final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath());
if (image != null) {
maps.add(image);
}
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index 7b504b4..dee026d 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -13,6 +13,7 @@ import org.apache.http.HttpResponse;
import android.app.Activity;
import android.content.Context;
+import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
@@ -20,6 +21,9 @@ import java.io.File;
import java.util.concurrent.TimeUnit;
public class StaticMapsProvider {
+ private static final String GOOGLE_STATICMAP_URL = "http://maps.google.com/maps/api/staticmap";
+ private static final String SATELLITE = "satellite";
+ private static final String ROADMAP = "roadmap";
private static final String WAYPOINT_PREFIX = "wp";
private static final String MAP_FILENAME_PREFIX = "map_";
private static final String MARKERS_URL = "http://cgeo.carnero.cc/_markers/";
@@ -28,35 +32,34 @@ public class StaticMapsProvider {
/** ThreadPool restricting this to 1 Thread. **/
private static final BlockingThreadPool pool = new BlockingThreadPool(1, Thread.MIN_PRIORITY);
- public static File getMapFile(final String geocode, String prefix, final int level, final boolean createDirs) {
- return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix + level, false, createDirs);
+ public static File getMapFile(final String geocode, String prefix, final boolean createDirs) {
+ return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix, false, createDirs);
}
private static void downloadDifferentZooms(final String geocode, String markerUrl, String prefix, String latlonMap, int edge, final Parameters waypoints) {
- downloadMap(geocode, 20, "satellite", markerUrl, prefix, 1, latlonMap, edge, waypoints);
- downloadMap(geocode, 18, "satellite", markerUrl, prefix, 2, latlonMap, edge, waypoints);
- downloadMap(geocode, 16, "roadmap", markerUrl, prefix, 3, latlonMap, edge, waypoints);
- downloadMap(geocode, 14, "roadmap", markerUrl, prefix, 4, latlonMap, edge, waypoints);
- downloadMap(geocode, 11, "roadmap", markerUrl, prefix, 5, latlonMap, edge, waypoints);
+ downloadMap(geocode, 20, SATELLITE, markerUrl, prefix + "_1", "", latlonMap, edge, edge, waypoints);
+ downloadMap(geocode, 18, SATELLITE, markerUrl, prefix + "_2", "", latlonMap, edge, edge, waypoints);
+ downloadMap(geocode, 16, ROADMAP, markerUrl, prefix + "_3", "", latlonMap, edge, edge, waypoints);
+ downloadMap(geocode, 14, ROADMAP, markerUrl, prefix + "_4", "", latlonMap, edge, edge, waypoints);
+ downloadMap(geocode, 11, ROADMAP, markerUrl, prefix + "_5", "", latlonMap, edge, edge, waypoints);
}
- private static void downloadMap(String geocode, int zoom, String mapType, String markerUrl, String prefix, int level, String latlonMap, int edge, final Parameters waypoints) {
- final String mapUrl = "http://maps.google.com/maps/api/staticmap";
+ private static void downloadMap(String geocode, int zoom, String mapType, String markerUrl, String prefix, String shadow, String latlonMap, int width, int height, final Parameters waypoints) {
final Parameters params = new Parameters(
"center", latlonMap,
"zoom", String.valueOf(zoom),
- "size", edge + "x" + edge,
+ "size", width + "x" + height,
"maptype", mapType,
- "markers", "icon:" + markerUrl + '|' + latlonMap,
+ "markers", "icon:" + markerUrl + '|' + shadow + latlonMap,
"sensor", "false");
if (waypoints != null) {
params.addAll(waypoints);
}
- final HttpResponse httpResponse = Network.getRequest(mapUrl, params);
+ final HttpResponse httpResponse = Network.getRequest(GOOGLE_STATICMAP_URL, params);
if (httpResponse != null) {
if (httpResponse.getStatusLine().getStatusCode() == 200) {
- final File file = getMapFile(geocode, prefix, level, true);
+ final File file = getMapFile(geocode, prefix, true);
if (LocalStorage.saveEntityToFile(httpResponse, file)) {
// Delete image if it has no contents
final long fileSize = file.length();
@@ -82,9 +85,10 @@ public class StaticMapsProvider {
return;
}
- int edge = guessMinDisplaySide(display);
+ int edge = guessMaxDisplaySide(display);
if (Settings.isStoreOfflineMaps() && cache.getCoords() != null) {
+ storeCachePreviewMap(cache);
storeCacheStaticMap(cache, edge, false);
}
@@ -99,7 +103,7 @@ public class StaticMapsProvider {
}
public static void storeWaypointStaticMap(cgCache cache, Activity activity, cgWaypoint waypoint, boolean waitForResult) {
- int edge = StaticMapsProvider.guessMinDisplaySide(activity);
+ int edge = StaticMapsProvider.guessMaxDisplaySide(activity);
storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, waitForResult);
}
@@ -114,7 +118,7 @@ public class StaticMapsProvider {
}
public static void storeCacheStaticMap(cgCache cache, Activity activity, final boolean waitForResult) {
- int edge = guessMinDisplaySide(activity);
+ int edge = guessMaxDisplaySide(activity);
storeCacheStaticMap(cache, edge, waitForResult);
}
@@ -133,7 +137,18 @@ public class StaticMapsProvider {
downloadMaps(cache.getGeocode(), cacheMarkerUrl, "", latlonMap, edge, waypoints, waitForResult);
}
- private static int guessMinDisplaySide(Display display) {
+ public static void storeCachePreviewMap(final cgCache cache) {
+ final String latlonMap = cache.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA);
+ final String markerUrl = MARKERS_URL + "my_location_mdpi.png";
+ final Display display = ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+ DisplayMetrics metrics = new DisplayMetrics();
+ display.getMetrics(metrics);
+ final int width = metrics.widthPixels;
+ final int height = (int) (110 * metrics.density);
+ downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, "preview", "shadow:false|", latlonMap, width, height, null);
+ }
+
+ private static int guessMaxDisplaySide(Display display) {
final int maxWidth = display.getWidth() - 25;
final int maxHeight = display.getHeight() - 25;
if (maxWidth > maxHeight) {
@@ -142,8 +157,8 @@ public class StaticMapsProvider {
return maxHeight;
}
- private static int guessMinDisplaySide(Activity activity) {
- return guessMinDisplaySide(((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay());
+ private static int guessMaxDisplaySide(Activity activity) {
+ return guessMaxDisplaySide(((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay());
}
private static void downloadMaps(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge,
@@ -186,7 +201,7 @@ public class StaticMapsProvider {
for (int level = 1; level <= 5; level++) {
try {
if (wp_id > 0) {
- StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + "_", level, false).delete();
+ StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + "_" + level, false).delete();
}
} catch (Exception e) {
Log.e("StaticMapsProvider.removeWpStaticMaps: " + e.toString());
@@ -202,7 +217,7 @@ public class StaticMapsProvider {
*/
public static boolean doesExistStaticMapForCache(String geocode) {
for (int level = 1; level <= 5; level++) {
- File mapFile = StaticMapsProvider.getMapFile(geocode, "", level, false);
+ File mapFile = StaticMapsProvider.getMapFile(geocode, "" + level, false);
if (mapFile != null && mapFile.exists()) {
return true;
}
@@ -219,7 +234,7 @@ public class StaticMapsProvider {
*/
public static boolean doesExistStaticMapForWaypoint(String geocode, int waypointId) {
for (int level = 1; level <= 5; level++) {
- File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_", level, false);
+ File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + level, false);
if (mapFile != null && mapFile.exists()) {
return true;
}
diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java
index 51f7ea8..ef13a36 100644
--- a/main/src/cgeo/geocaching/network/HtmlImage.java
+++ b/main/src/cgeo/geocaching/network/HtmlImage.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.StoredList;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.files.LocalStorage;
+import cgeo.geocaching.utils.ImageHelper;
import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.StringUtils;
@@ -14,7 +15,6 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.text.Html;
@@ -121,34 +121,10 @@ public class HtmlImage implements Html.ImageGetter {
}
}
- final int imgWidth = imagePre.getWidth();
- final int imgHeight = imagePre.getHeight();
-
- int width;
- int height;
-
- if (imgWidth > maxWidth || imgHeight > maxHeight) {
- final double ratio = Math.min((double) maxHeight / (double) imgHeight, (double) maxWidth / (double) imgWidth);
- width = (int) Math.ceil(imgWidth * ratio);
- height = (int) Math.ceil(imgHeight * ratio);
-
- try {
- imagePre = Bitmap.createScaledBitmap(imagePre, width, height, true);
- } catch (Exception e) {
- Log.d("HtmlImage.getDrawable: Failed to scale image");
- return null;
- }
- } else {
- width = imgWidth;
- height = imgHeight;
- }
-
- final BitmapDrawable image = new BitmapDrawable(resources, imagePre);
- image.setBounds(new Rect(0, 0, width, height));
-
- return image;
+ return imagePre != null ? ImageHelper.scaleBitmapToFitDisplay(imagePre) : null;
}
+
private Bitmap getTransparent1x1Image() {
return BitmapFactory.decodeResource(resources, R.drawable.image_no_placement);
}
diff --git a/main/src/cgeo/geocaching/utils/ImageHelper.java b/main/src/cgeo/geocaching/utils/ImageHelper.java
new file mode 100644
index 0000000..4c18b06
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/ImageHelper.java
@@ -0,0 +1,47 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.cgeoapplication;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.view.Display;
+import android.view.WindowManager;
+
+public class ImageHelper {
+
+ // Do not let this class be instantiated, this is a utility class.
+ private ImageHelper() {
+ }
+
+ /**
+ * Scales a bitmap to the given bounds
+ *
+ * @param image
+ * The bitmap to scale
+ * @return BitmapDrawable The scaled image
+ */
+ public static BitmapDrawable scaleBitmapToFitDisplay(final Bitmap image) {
+ final cgeoapplication app = cgeoapplication.getInstance();
+ final Display display = ((WindowManager) app.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+ final int maxWidth = display.getWidth() - 25;
+ final int maxHeight = display.getHeight() - 25;
+
+ Bitmap result = image;
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ if (width > maxWidth || height > maxHeight) {
+ final double ratio = Math.min((double) maxHeight / (double) height, (double) maxWidth / (double) width);
+ width = (int) Math.ceil(width * ratio);
+ height = (int) Math.ceil(height * ratio);
+ result = Bitmap.createScaledBitmap(image, width, height, true);
+ }
+
+ final BitmapDrawable resultDrawable = new BitmapDrawable(app.getResources(), result);
+ resultDrawable.setBounds(new Rect(0, 0, width, height));
+ return resultDrawable;
+ }
+
+}