diff options
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 30 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/StaticMapsActivity.java | 8 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/StaticMapsProvider.java | 59 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/network/HtmlImage.java | 30 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/utils/ImageHelper.java | 47 |
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; + } + +} |
