aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/AbstractPopupActivity.java11
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java51
-rw-r--r--main/src/cgeo/geocaching/ICache.java4
-rw-r--r--main/src/cgeo/geocaching/Settings.java3
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java35
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java59
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java12
-rw-r--r--main/src/cgeo/geocaching/cgeo.java11
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java100
-rw-r--r--main/src/cgeo/geocaching/cgeoimages.java2
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java2
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCMap.java28
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java5
-rw-r--r--main/src/cgeo/geocaching/connector/gc/Login.java6
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java8
-rw-r--r--main/src/cgeo/geocaching/maps/CachesOverlay.java59
-rw-r--r--main/src/cgeo/geocaching/network/HtmlImage.java30
-rw-r--r--main/src/cgeo/geocaching/ui/AddressListAdapter.java13
-rw-r--r--main/src/cgeo/geocaching/ui/AddressListView.java8
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java24
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListView.java22
-rw-r--r--main/src/cgeo/geocaching/ui/CompassMiniView.java37
-rw-r--r--main/src/cgeo/geocaching/ui/GPXListAdapter.java11
-rw-r--r--main/src/cgeo/geocaching/ui/GPXListView.java9
-rw-r--r--main/src/cgeo/geocaching/ui/MapfileListAdapter.java12
-rw-r--r--main/src/cgeo/geocaching/utils/ImageHelper.java47
26 files changed, 361 insertions, 248 deletions
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java
index f3b0596..588ba2a 100644
--- a/main/src/cgeo/geocaching/AbstractPopupActivity.java
+++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java
@@ -2,9 +2,7 @@ package cgeo.geocaching;
import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
-import cgeo.geocaching.connector.gc.GCMap;
import cgeo.geocaching.enumerations.CacheSize;
-import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.gcvote.GCVote;
@@ -33,8 +31,6 @@ import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
-import java.util.Collections;
-
public abstract class AbstractPopupActivity extends AbstractActivity {
private static final int MENU_CACHES_AROUND = 5;
@@ -124,10 +120,6 @@ public abstract class AbstractPopupActivity extends AbstractActivity {
return;
}
- if (CacheType.UNKNOWN == cache.getType()) {
- final SearchResult search = GCMap.searchByGeocodes(Collections.singleton(geocode));
- cache = search.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
- }
geocode = cache.getGeocode().toUpperCase();
}
@@ -288,6 +280,9 @@ public abstract class AbstractPopupActivity extends AbstractActivity {
aquireGCVote();
}
+ // favourite count
+ details.add(R.string.cache_favourite, cache.getFavoritePoints() + "Ă—");
+
// more details
final Button buttonMore = (Button) findViewById(R.id.more_details);
buttonMore.setOnClickListener(new OnClickListener() {
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 49f52ba..cbd771c 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -21,7 +21,15 @@ import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.ui.CacheDetailsCreator;
import cgeo.geocaching.ui.DecryptTextClickListener;
import cgeo.geocaching.ui.Formatter;
-import cgeo.geocaching.utils.*;
+import cgeo.geocaching.utils.BaseUtils;
+import cgeo.geocaching.utils.CancellableHandler;
+import cgeo.geocaching.utils.ClipboardUtils;
+import cgeo.geocaching.utils.CryptUtils;
+import cgeo.geocaching.utils.GeoDirHandler;
+import cgeo.geocaching.utils.ImageHelper;
+import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.TranslationUtils;
+import cgeo.geocaching.utils.UnknownTagsHandler;
import com.viewpagerindicator.TitlePageIndicator;
import com.viewpagerindicator.TitleProvider;
@@ -38,6 +46,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;
@@ -58,7 +67,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;
@@ -1680,10 +1688,7 @@ public class CacheDetailActivity extends AbstractActivity {
Button buttonRemove = (Button) view.findViewById(R.id.remove_from_watchlist);
TextView text = (TextView) view.findViewById(R.id.watchlist_text);
- //TODO: We already have cache.isOwn(). Those 2 should be combined.
- boolean userIsOwner = StringUtils.equals(cache.getOwnerReal(), Settings.getUsername());
-
- if (cache.isOnWatchlist() || userIsOwner) {
+ if (cache.isOnWatchlist() || cache.isOwn()) {
buttonAdd.setVisibility(View.GONE);
buttonRemove.setVisibility(View.VISIBLE);
text.setText(R.string.cache_watchlist_on);
@@ -1694,7 +1699,7 @@ public class CacheDetailActivity extends AbstractActivity {
}
// the owner of a cache has it always on his watchlist. Adding causes an error
- if (userIsOwner) {
+ if (cache.isOwn()) {
buttonAdd.setEnabled(false);
buttonAdd.setVisibility(View.GONE);
buttonRemove.setEnabled(false);
@@ -1707,12 +1712,10 @@ public class CacheDetailActivity extends AbstractActivity {
* shows/hides buttons, sets text in watchlist box
*/
private void updateFavPointBox() {
- boolean userIsOwner = StringUtils.equals(cache.getOwnerReal(), Settings.getUsername());
-
LinearLayout layout = (LinearLayout) view.findViewById(R.id.favpoint_box);
boolean supportsFavoritePoints = cache.supportsFavoritePoints();
layout.setVisibility(supportsFavoritePoints ? View.VISIBLE : View.GONE);
- if (!supportsFavoritePoints || userIsOwner || !Settings.isPremiumMember()) {
+ if (!supportsFavoritePoints || cache.isOwn() || !Settings.isPremiumMember()) {
return;
}
Button buttonAdd = (Button) view.findViewById(R.id.add_to_favpoint);
@@ -1798,26 +1801,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/ICache.java b/main/src/cgeo/geocaching/ICache.java
index dccdb85..7cb2ce2 100644
--- a/main/src/cgeo/geocaching/ICache.java
+++ b/main/src/cgeo/geocaching/ICache.java
@@ -23,7 +23,7 @@ public interface ICache extends IBasicCache {
public String getOwner();
/**
- * @return GC username of the owner
+ * @return GC username of the (actual) owner, might differ from the owner. Never empty.
*/
public String getOwnerReal();
@@ -105,7 +105,7 @@ public interface ICache extends IBasicCache {
/**
* immutable list of attributes, never <code>null</code>
- *
+ *
* @return the list of attributes for this cache
*/
public List<String> getAttributes();
diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java
index 82ab132..6e03465 100644
--- a/main/src/cgeo/geocaching/Settings.java
+++ b/main/src/cgeo/geocaching/Settings.java
@@ -1,6 +1,7 @@
package cgeo.geocaching;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum;
+import cgeo.geocaching.connector.gc.GCConstants;
import cgeo.geocaching.connector.gc.Login;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy;
@@ -265,7 +266,7 @@ public final class Settings {
if (memberStatus == null) {
return false;
}
- return "Premium Member".equalsIgnoreCase(memberStatus);
+ return GCConstants.MEMBER_STATUS_PM.equalsIgnoreCase(memberStatus);
}
public static String getMemberStatus() {
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index ec417dd..a95f4d2 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -7,6 +7,8 @@ import cgeo.geocaching.utils.Log;
import org.apache.commons.collections.CollectionUtils;
import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
@@ -23,6 +25,9 @@ import java.util.List;
public class StaticMapsActivity extends AbstractActivity {
+ private static final String EXTRAS_WAYPOINT = "waypoint";
+ private static final String EXTRAS_DOWNLOAD = "download";
+ private static final String EXTRAS_GEOCODE = "geocode";
private static final int MENU_REFRESH = 1;
private final List<Bitmap> maps = new ArrayList<Bitmap>();
private boolean download = false;
@@ -96,10 +101,10 @@ public class StaticMapsActivity extends AbstractActivity {
// try to get data from extras
if (extras != null) {
- download = extras.getBoolean("download", false);
- geocode = extras.getString("geocode");
- if (extras.containsKey("waypoint")) {
- waypoint_id = extras.getInt("waypoint");
+ download = extras.getBoolean(EXTRAS_DOWNLOAD, false);
+ geocode = extras.getString(EXTRAS_GEOCODE);
+ if (extras.containsKey(EXTRAS_WAYPOINT)) {
+ waypoint_id = extras.getInt(EXTRAS_WAYPOINT);
}
}
@@ -133,12 +138,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 +157,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);
}
@@ -207,4 +212,18 @@ public class StaticMapsActivity extends AbstractActivity {
showToast(res.getString(R.string.err_detail_not_load_map_static));
return false;
}
+
+ public static void startActivity(final Context activity, final String geocode, final boolean download, final cgWaypoint waypoint) {
+ final Intent intent = new Intent(activity, StaticMapsActivity.class);
+ // if resuming our app within this activity, finish it and return to the cache activity
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ intent.putExtra(EXTRAS_GEOCODE, geocode);
+ if (download) {
+ intent.putExtra(EXTRAS_DOWNLOAD, true);
+ }
+ if (waypoint != null) {
+ intent.putExtra(EXTRAS_WAYPOINT, waypoint.getId());
+ }
+ activity.startActivity(intent);
+ }
} \ No newline at end of file
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/apps/cache/navi/AbstractStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
index 98be63a..23cb982 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
@@ -13,7 +13,6 @@ import cgeo.geocaching.geopoint.Geopoint;
import org.apache.commons.lang3.StringUtils;
import android.app.Activity;
-import android.content.Intent;
abstract class AbstractStaticMapsApp extends AbstractNavigationApp {
public AbstractStaticMapsApp(String name) {
@@ -54,16 +53,7 @@ abstract class AbstractStaticMapsApp extends AbstractNavigationApp {
return true;
}
- final Intent intent = new Intent(activity, StaticMapsActivity.class);
- intent.putExtra("geocode", geocode);
- if (download) {
- intent.putExtra("download", true);
- }
- if (waypoint != null) {
- intent.putExtra("waypoint", waypoint.getId());
- }
- activity.startActivity(intent);
-
+ StaticMapsActivity.startActivity(activity, geocode, download, waypoint);
return true;
}
diff --git a/main/src/cgeo/geocaching/cgeo.java b/main/src/cgeo/geocaching/cgeo.java
index 8be8d9c..63b4dfc 100644
--- a/main/src/cgeo/geocaching/cgeo.java
+++ b/main/src/cgeo/geocaching/cgeo.java
@@ -301,9 +301,7 @@ public class cgeo extends AbstractActivity {
cgeocaches.startActivityHistory(this);
return true;
case MENU_SCAN:
- Intent intent = new Intent(SCAN_INTENT);
- intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
- startActivityForResult(intent, SCAN_REQUEST_CODE);
+ startScannerApplication();
return true;
default:
break;
@@ -312,6 +310,13 @@ public class cgeo extends AbstractActivity {
return false;
}
+ private void startScannerApplication() {
+ Intent intent = new Intent(SCAN_INTENT);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); // when resuming our app, cancel this activity
+ intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
+ startActivityForResult(intent, SCAN_REQUEST_CODE);
+ }
+
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == SCAN_REQUEST_CODE) {
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index fdc4669..c4d72d3 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -152,28 +152,28 @@ public class cgeocaches extends AbstractListActivity {
private final GeoDirHandler geoDirHandler = new GeoDirHandler() {
@Override
- public void updateGeoData(final IGeoData geo) {
- if (adapter == null) {
- return;
- }
+ public void updateGeoData(final IGeoData geo) {
+ if (adapter == null) {
+ return;
+ }
- try {
- if (geo.getCoords() != null) {
- adapter.setActualCoordinates(geo.getCoords());
- }
-
- if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h
- if (!Settings.isUseCompass()) {
- adapter.setActualHeading(geo.getBearing());
- }
- if (northHeading != null) {
- adapter.setActualHeading(northHeading);
- }
- }
- } catch (Exception e) {
- Log.w("Failed to UpdateLocation location.");
- }
- }
+ try {
+ if (geo.getCoords() != null) {
+ adapter.setActualCoordinates(geo.getCoords());
+ }
+
+ if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h
+ if (!Settings.isUseCompass()) {
+ adapter.setActualHeading(geo.getBearing());
+ }
+ if (northHeading != null) {
+ adapter.setActualHeading(northHeading);
+ }
+ }
+ } catch (Exception e) {
+ Log.w("Failed to UpdateLocation location.");
+ }
+ }
@Override
public void updateDirection(final float direction) {
@@ -694,34 +694,36 @@ public class cgeocaches extends AbstractListActivity {
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_FILTER, 0, res.getString(R.string.caches_filter)).setIcon(R.drawable.ic_menu_filter);
- SubMenu subMenuSort = menu.addSubMenu(0, SUBMENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically);
- subMenuSort.setHeaderTitle(res.getString(R.string.caches_sort_title));
-
- // sort the context menu labels alphabetically for easier reading
- Map<String, Integer> comparators = new HashMap<String, Integer>();
- comparators.put(res.getString(R.string.caches_sort_distance), MENU_SORT_DISTANCE);
- comparators.put(res.getString(R.string.caches_sort_difficulty), MENU_SORT_DIFFICULTY);
- comparators.put(res.getString(R.string.caches_sort_terrain), MENU_SORT_TERRAIN);
- comparators.put(res.getString(R.string.caches_sort_size), MENU_SORT_SIZE);
- comparators.put(res.getString(R.string.caches_sort_favorites), MENU_SORT_FAVORITES);
- comparators.put(res.getString(R.string.caches_sort_name), MENU_SORT_NAME);
- comparators.put(res.getString(R.string.caches_sort_gccode), MENU_SORT_GEOCODE);
- comparators.put(res.getString(R.string.caches_sort_rating), MENU_SORT_RATING);
- comparators.put(res.getString(R.string.caches_sort_vote), MENU_SORT_VOTE);
- comparators.put(res.getString(R.string.caches_sort_inventory), MENU_SORT_INVENTORY);
- comparators.put(res.getString(R.string.caches_sort_date), MENU_SORT_DATE);
- comparators.put(res.getString(R.string.caches_sort_finds), MENU_SORT_FINDS);
- comparators.put(res.getString(R.string.caches_sort_state), MENU_SORT_STATE);
- comparators.put(res.getString(R.string.caches_sort_storage), MENU_SORT_STORAGE);
-
- List<String> sortedLabels = new ArrayList<String>(comparators.keySet());
- Collections.sort(sortedLabels);
- for (String label : sortedLabels) {
- Integer id = comparators.get(label);
- subMenuSort.add(1, id, 0, label).setCheckable(true).setChecked(id == MENU_SORT_DISTANCE);
- }
-
- subMenuSort.setGroupCheckable(1, true, true);
+ if (type != CacheListType.HISTORY) {
+ final SubMenu subMenuSort = menu.addSubMenu(0, SUBMENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically);
+ subMenuSort.setHeaderTitle(res.getString(R.string.caches_sort_title));
+
+ // sort the context menu labels alphabetically for easier reading
+ final Map<String, Integer> comparators = new HashMap<String, Integer>();
+ comparators.put(res.getString(R.string.caches_sort_distance), MENU_SORT_DISTANCE);
+ comparators.put(res.getString(R.string.caches_sort_difficulty), MENU_SORT_DIFFICULTY);
+ comparators.put(res.getString(R.string.caches_sort_terrain), MENU_SORT_TERRAIN);
+ comparators.put(res.getString(R.string.caches_sort_size), MENU_SORT_SIZE);
+ comparators.put(res.getString(R.string.caches_sort_favorites), MENU_SORT_FAVORITES);
+ comparators.put(res.getString(R.string.caches_sort_name), MENU_SORT_NAME);
+ comparators.put(res.getString(R.string.caches_sort_gccode), MENU_SORT_GEOCODE);
+ comparators.put(res.getString(R.string.caches_sort_rating), MENU_SORT_RATING);
+ comparators.put(res.getString(R.string.caches_sort_vote), MENU_SORT_VOTE);
+ comparators.put(res.getString(R.string.caches_sort_inventory), MENU_SORT_INVENTORY);
+ comparators.put(res.getString(R.string.caches_sort_date), MENU_SORT_DATE);
+ comparators.put(res.getString(R.string.caches_sort_finds), MENU_SORT_FINDS);
+ comparators.put(res.getString(R.string.caches_sort_state), MENU_SORT_STATE);
+ comparators.put(res.getString(R.string.caches_sort_storage), MENU_SORT_STORAGE);
+
+ final List<String> sortedLabels = new ArrayList<String>(comparators.keySet());
+ Collections.sort(sortedLabels);
+ for (String label : sortedLabels) {
+ Integer id = comparators.get(label);
+ subMenuSort.add(1, id, 0, label).setCheckable(true).setChecked(id == MENU_SORT_DISTANCE);
+ }
+
+ subMenuSort.setGroupCheckable(1, true, true);
+ }
menu.add(0, MENU_SWITCH_SELECT_MODE, 0, res.getString(R.string.caches_select_mode)).setIcon(R.drawable.ic_menu_agenda);
menu.add(0, MENU_INVERT_SELECTION, 0, res.getString(R.string.caches_select_invert)).setIcon(R.drawable.ic_menu_mark);
diff --git a/main/src/cgeo/geocaching/cgeoimages.java b/main/src/cgeo/geocaching/cgeoimages.java
index 6d4c77a..ba48ba3 100644
--- a/main/src/cgeo/geocaching/cgeoimages.java
+++ b/main/src/cgeo/geocaching/cgeoimages.java
@@ -227,6 +227,8 @@ public class cgeoimages extends AbstractActivity {
private static void startActivity(final Context fromActivity, final String geocode, ArrayList<cgImage> logImages, int imageType) {
final Intent logImgIntent = new Intent(fromActivity, cgeoimages.class);
+ // if resuming our app within this activity, finish it and return to the cache activity
+ logImgIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
logImgIntent.putExtra("geocode", geocode.toUpperCase());
logImgIntent.putExtra("type", imageType);
logImgIntent.putParcelableArrayListExtra("images", logImages);
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
index 8d3a1ae..96991f8 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
@@ -65,6 +65,8 @@ public final class GCConstants {
// Info box top-right
public static final Pattern PATTERN_LOGIN_NAME = Pattern.compile("\"SignedInProfileLink\">([^<]+)</a>");
public static final Pattern PATTERN_MEMBER_STATUS = Pattern.compile("<span id=\"ctl00_litPMLevel\">([^<]+)</span>");
+ public static final String MEMBER_STATUS_RENEW = "<a id=\"ctl00_hlRenew";
+ public static final String MEMBER_STATUS_PM = "Premium Member";
/** Use replaceAll("[,.]","") on the resulting string before converting to an int */
public static final Pattern PATTERN_CACHES_FOUND = Pattern.compile("title=\"Caches Found\"[\\s\\w=\"/.]*/>\\s*([\\d,.]+)");
public static final Pattern PATTERN_AVATAR_IMAGE_PROFILE_PAGE = Pattern.compile("<img src=\"(http://img.geocaching.com/user/avatar/[0-9a-f-]+\\.jpg)\"[^>]*\\salt=\"Avatar\"");
diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java
index 82ffc7f..a8509b8 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCMap.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java
@@ -204,7 +204,16 @@ public class GCMap {
} else {
cache.setType(CacheType.UNKNOWN);
}
- searchResult.addCache(cache);
+ boolean exclude = false;
+ if (Settings.isExcludeMyCaches() && (cache.isFound() || cache.isOwn())) { // workaround for BM
+ exclude = true;
+ }
+ if (Settings.isExcludeDisabledCaches() && cache.isDisabled()) {
+ exclude = true;
+ }
+ if (!exclude) {
+ searchResult.addCache(cache);
+ }
}
Log.d("Retrieved " + searchResult.getCount() + " caches for tile " + tile.toString());
@@ -225,26 +234,25 @@ public class GCMap {
* @return
*/
public static SearchResult searchByViewport(final Viewport viewport, final String[] tokens) {
+ int speed = (int) cgeoapplication.getInstance().currentGeo().getSpeed() * 60 * 60 / 1000; // in km/h
Strategy strategy = Settings.getLiveMapStrategy();
if (strategy == Strategy.AUTO) {
- float speedNow = cgeoapplication.getInstance().currentGeo().getSpeed();
- strategy = speedNow >= 8 ? Strategy.FAST : Strategy.DETAILED; // 8 m/s = 30 km/h
+ strategy = speed >= 30 ? Strategy.FAST : Strategy.DETAILED;
}
- // return searchByViewport(viewport, tokens, strategy);
- // testing purpose
- {
- SearchResult result = searchByViewport(viewport, tokens, strategy);
+ SearchResult result = searchByViewport(viewport, tokens, strategy);
+
+ if (Settings.isDebug()) {
String text = Formatter.SEPARATOR + strategy.getL10n() + Formatter.SEPARATOR;
- int speed = (int) cgeoapplication.getInstance().currentGeo().getSpeed();
if (Settings.isUseMetricUnits()) {
text += speed + " km/h";
} else {
text += speed / IConversion.MILES_TO_KILOMETER + " mph";
}
result.setUrl(result.getUrl() + text);
- return result;
}
+
+ return result;
}
/**
@@ -280,7 +288,7 @@ public class GCMap {
if (tokens != null) {
params.put("k", tokens[0], "st", tokens[1]);
}
- if (Settings.isExcludeMyCaches()) {
+ if (Settings.isExcludeMyCaches()) { // works only for PM
params.put("hf", "1", "hh", "1"); // hide found, hide hidden
}
if (Settings.getCacheType() == CacheType.TRADITIONAL) {
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index dc69043..7ceef8e 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -378,10 +378,7 @@ public abstract class GCParser {
// owner real name
cache.setOwnerReal(URLDecoder.decode(BaseUtils.getMatch(page, GCConstants.PATTERN_OWNERREAL, true, cache.getOwnerReal())));
- final String username = Settings.getUsername();
- if (cache.getOwnerReal() != null && username != null && cache.getOwnerReal().equalsIgnoreCase(username)) {
- cache.setOwn(true);
- }
+ cache.setOwn(StringUtils.equalsIgnoreCase(cache.getOwnerReal(), Settings.getUsername()));
String tableInside = page;
diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java
index 113f581..c342dee 100644
--- a/main/src/cgeo/geocaching/connector/gc/Login.java
+++ b/main/src/cgeo/geocaching/connector/gc/Login.java
@@ -193,6 +193,9 @@ public abstract class Login {
setActualUserName(BaseUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???"));
setActualCachesFound(Integer.parseInt(BaseUtils.getMatch(page, GCConstants.PATTERN_CACHES_FOUND, true, "0").replaceAll("[,.]", "")));
Settings.setMemberStatus(BaseUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, null));
+ if ( page.contains(GCConstants.MEMBER_STATUS_RENEW) ) {
+ Settings.setMemberStatus(GCConstants.MEMBER_STATUS_PM);
+ }
return true;
}
@@ -235,6 +238,9 @@ public abstract class Login {
final String profile = BaseUtils.replaceWhitespace(Network.getResponseData(Network.getRequest("http://www.geocaching.com/my/")));
Settings.setMemberStatus(BaseUtils.getMatch(profile, GCConstants.PATTERN_MEMBER_STATUS, true, null));
+ if (profile.contains(GCConstants.MEMBER_STATUS_RENEW)) {
+ Settings.setMemberStatus(GCConstants.MEMBER_STATUS_PM);
+ }
setActualCachesFound(Integer.parseInt(BaseUtils.getMatch(profile, GCConstants.PATTERN_CACHES_FOUND, true, "-1").replaceAll("[,.]", "")));
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index 3e61e09..eaf5bc8 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -1,7 +1,6 @@
package cgeo.geocaching.maps;
import cgeo.geocaching.DirectionProvider;
-import cgeo.geocaching.utils.GeoDirHandler;
import cgeo.geocaching.IGeoData;
import cgeo.geocaching.IWaypoint;
import cgeo.geocaching.LiveMapInfo;
@@ -36,6 +35,7 @@ import cgeo.geocaching.maps.interfaces.MapViewImpl;
import cgeo.geocaching.maps.interfaces.OnMapDragListener;
import cgeo.geocaching.maps.interfaces.OtherCachersOverlayItemImpl;
import cgeo.geocaching.utils.CancellableHandler;
+import cgeo.geocaching.utils.GeoDirHandler;
import cgeo.geocaching.utils.LeastRecentlyUsedSet;
import cgeo.geocaching.utils.Log;
@@ -219,6 +219,12 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
title.append(']');
}
+ if (Settings.isDebug()) {
+ if (search != null && StringUtils.isNotBlank(search.getUrl())) {
+ title.append("[" + search.getUrl() + "]");
+ }
+ }
+
ActivityMixin.setTitle(activity, title.toString());
break;
case INVALIDATE_MAP:
diff --git a/main/src/cgeo/geocaching/maps/CachesOverlay.java b/main/src/cgeo/geocaching/maps/CachesOverlay.java
index 8cfeac5..4495340 100644
--- a/main/src/cgeo/geocaching/maps/CachesOverlay.java
+++ b/main/src/cgeo/geocaching/maps/CachesOverlay.java
@@ -2,9 +2,15 @@ package cgeo.geocaching.maps;
import cgeo.geocaching.CachePopup;
import cgeo.geocaching.IWaypoint;
+import cgeo.geocaching.R;
import cgeo.geocaching.Settings;
import cgeo.geocaching.WaypointPopup;
+import cgeo.geocaching.cgCache;
+import cgeo.geocaching.cgeoapplication;
+import cgeo.geocaching.activity.Progress;
+import cgeo.geocaching.connector.gc.GCMap;
import cgeo.geocaching.enumerations.CacheType;
+import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.maps.interfaces.CachesOverlayItemImpl;
import cgeo.geocaching.maps.interfaces.GeoPointImpl;
@@ -17,7 +23,6 @@ import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.StringUtils;
-import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.DashPathEffect;
@@ -28,6 +33,7 @@ import android.graphics.Point;
import android.location.Location;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
public class CachesOverlay extends AbstractItemizedOverlay {
@@ -35,7 +41,7 @@ public class CachesOverlay extends AbstractItemizedOverlay {
private List<CachesOverlayItemImpl> items = new ArrayList<CachesOverlayItemImpl>();
private Context context = null;
private boolean displayCircles = false;
- private ProgressDialog waitDialog = null;
+ private Progress progress = new Progress();
private Paint blockedCircle = null;
private PaintFlagsDrawFilter setFilter = null;
private PaintFlagsDrawFilter removeFilter = null;
@@ -201,12 +207,7 @@ public class CachesOverlay extends AbstractItemizedOverlay {
return false;
}
- if (waitDialog == null) {
- waitDialog = new ProgressDialog(context);
- waitDialog.setMessage("loading details…");
- waitDialog.setCancelable(false);
- }
- waitDialog.show();
+ progress.show(context, context.getResources().getString(R.string.map_live), context.getResources().getString(R.string.cache_dialog_loading_details), true, null);
CachesOverlayItemImpl item = null;
@@ -227,21 +228,27 @@ public class CachesOverlay extends AbstractItemizedOverlay {
final IWaypoint coordinate = item.getCoord();
if (StringUtils.isNotBlank(coordinate.getCoordType()) && coordinate.getCoordType().equalsIgnoreCase("cache") && StringUtils.isNotBlank(coordinate.getGeocode())) {
- CGeoMap.markCacheAsDirty(coordinate.getGeocode());
- CachePopup.startActivity(context, coordinate.getGeocode());
+ cgCache cache = cgeoapplication.getInstance().loadCache(coordinate.getGeocode(), LoadFlags.LOAD_CACHE_OR_DB);
+ RequestDetailsThread requestDetailsThread = new RequestDetailsThread(cache);
+ if (!requestDetailsThread.requestRequired()) {
+ // don't show popup if we have enough details
+ progress.dismiss();
+ }
+ requestDetailsThread.start();
+ return true;
} else if (coordinate.getCoordType() != null && coordinate.getCoordType().equalsIgnoreCase("waypoint") && coordinate.getId() > 0) {
CGeoMap.markCacheAsDirty(coordinate.getGeocode());
WaypointPopup.startActivity(context, coordinate.getId(), coordinate.getGeocode());
} else {
- waitDialog.dismiss();
+ progress.dismiss();
return false;
}
- waitDialog.dismiss();
+ progress.dismiss();
} catch (Exception e) {
Log.e("cgMapOverlay.onTap: " + e.toString());
- if (waitDialog != null) {
- waitDialog.dismiss();
+ if (progress != null) {
+ progress.dismiss();
}
}
@@ -269,4 +276,28 @@ public class CachesOverlay extends AbstractItemizedOverlay {
return 0;
}
+
+ private class RequestDetailsThread extends Thread {
+
+ private final cgCache cache;
+
+ public RequestDetailsThread(cgCache cache) {
+ this.cache = cache;
+ }
+
+ public boolean requestRequired() {
+ return CacheType.UNKNOWN == cache.getType() || !cache.isReliableLatLon() || !cache.isOffline();
+ }
+
+ @Override
+ public void run() {
+ if (requestRequired()) {
+ /* final SearchResult search = */GCMap.searchByGeocodes(Collections.singleton(cache.getGeocode()));
+ CGeoMap.markCacheAsDirty(cache.getGeocode());
+ }
+ CachePopup.startActivity(context, cache.getGeocode());
+ progress.dismiss();
+ }
+ }
+
}
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/ui/AddressListAdapter.java b/main/src/cgeo/geocaching/ui/AddressListAdapter.java
index 327b71d..17a9289 100644
--- a/main/src/cgeo/geocaching/ui/AddressListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/AddressListAdapter.java
@@ -24,6 +24,11 @@ public class AddressListAdapter extends ArrayAdapter<Address> {
final private LayoutInflater inflater;
final private Geopoint location;
+ private static final class ViewHolder {
+ TextView label;
+ TextView distance;
+ }
+
public AddressListAdapter(final Context context) {
super(context, 0);
inflater = ((Activity) context).getLayoutInflater();
@@ -34,20 +39,20 @@ public class AddressListAdapter extends ArrayAdapter<Address> {
public View getView(final int position, final View convertView, final ViewGroup parent) {
final Address address = getItem(position);
- // holder pattern implementation
- final AddressListView holder;
View view = convertView;
+ // holder pattern implementation
+ final ViewHolder holder;
if (view == null) {
view = inflater.inflate(R.layout.addresses_item, null);
- holder = new AddressListView();
+ holder = new ViewHolder();
holder.label = (TextView) view.findViewById(R.id.label);
holder.distance = (TextView) view.findViewById(R.id.distance);
view.setTag(holder);
} else {
- holder = (AddressListView) view.getTag();
+ holder = (ViewHolder) view.getTag();
}
view.setOnClickListener(new View.OnClickListener() {
diff --git a/main/src/cgeo/geocaching/ui/AddressListView.java b/main/src/cgeo/geocaching/ui/AddressListView.java
deleted file mode 100644
index 53459ed..0000000
--- a/main/src/cgeo/geocaching/ui/AddressListView.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package cgeo.geocaching.ui;
-
-import android.widget.TextView;
-
-public class AddressListView {
- public TextView label;
- public TextView distance;
-}
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index 391e9ac..12849f8 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -86,6 +86,24 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
}
}
+ /**
+ * view holder for the cache list adapter
+ *
+ */
+ private static class ViewHolder {
+ CheckBox checkbox;
+ ImageView logStatusMark;
+ TextView text;
+ TextView favourite;
+ TextView info;
+ ImageView inventory;
+ RelativeLayout directionLayout;
+ DistanceView distance;
+ CompassMiniView direction;
+ RelativeLayout dirImgLayout;
+ ImageView dirImg;
+ }
+
public CacheListAdapter(final Activity activity, final List<cgCache> list, CacheListType cacheListType) {
super(activity, 0, list);
final IGeoData currentGeo = cgeoapplication.getInstance().currentGeo();
@@ -313,11 +331,11 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
View v = rowView;
- CacheListView holder;
+ final ViewHolder holder;
if (v == null) {
v = inflater.inflate(R.layout.caches_item, null);
- holder = new CacheListView();
+ holder = new ViewHolder();
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);
@@ -332,7 +350,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
v.setTag(holder);
} else {
- holder = (CacheListView) v.getTag();
+ holder = (ViewHolder) v.getTag();
}
final boolean lightSkin = Settings.isLightSkin();
diff --git a/main/src/cgeo/geocaching/ui/CacheListView.java b/main/src/cgeo/geocaching/ui/CacheListView.java
deleted file mode 100644
index 0b89c9c..0000000
--- a/main/src/cgeo/geocaching/ui/CacheListView.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package cgeo.geocaching.ui;
-
-
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-public class CacheListView {
- // layouts & views
- public CheckBox checkbox;
- public ImageView logStatusMark;
- public TextView text;
- public TextView favourite;
- public TextView info;
- public ImageView inventory;
- public RelativeLayout directionLayout;
- public DistanceView distance;
- public CompassMiniView direction;
- public RelativeLayout dirImgLayout;
- public ImageView dirImg;
-}
diff --git a/main/src/cgeo/geocaching/ui/CompassMiniView.java b/main/src/cgeo/geocaching/ui/CompassMiniView.java
index a0aaeaf..a60afa6 100644
--- a/main/src/cgeo/geocaching/ui/CompassMiniView.java
+++ b/main/src/cgeo/geocaching/ui/CompassMiniView.java
@@ -17,6 +17,10 @@ final public class CompassMiniView extends View {
private Geopoint targetCoords = null;
private float azimuth = 0;
private float heading = 0;
+ /**
+ * remember the last state of drawing so we can avoid repainting for very small changes
+ */
+ private float lastDrawingAzimuth;
/**
* lazy initialized bitmap resource depending on selected skin
@@ -45,6 +49,7 @@ final public class CompassMiniView extends View {
private static final int ARROW_BITMAP_SIZE = 21;
private static final PaintFlagsDrawFilter FILTER_SET = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);
private static final PaintFlagsDrawFilter FILTER_REMOVE = new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG, 0);
+ private static final float MINIMUM_ROTATION_DEGREES_FOR_REPAINT = 5;
public CompassMiniView(Context context) {
super(context);
@@ -115,8 +120,15 @@ final public class CompassMiniView extends View {
return;
}
- // compass margins
+ float azimuthRelative = calculateAzimuthRelative();
+
+ // avoid updates on very small changes, which are not visible to the user
+ float change = Math.abs(azimuthRelative - lastDrawingAzimuth);
+ if (change < MINIMUM_ROTATION_DEGREES_FOR_REPAINT) {
+ return;
+ }
+ // compass margins
final int marginLeft = (getWidth() - compassArrowWidth) / 2;
final int marginTop = (getHeight() - compassArrowHeight) / 2;
@@ -127,19 +139,14 @@ final public class CompassMiniView extends View {
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
- float azimuthRelative = azimuth - heading;
- if (azimuthRelative < 0) {
- azimuthRelative += 360;
- } else if (azimuthRelative >= 360) {
- azimuthRelative -= 360;
- }
+ float azimuthRelative = calculateAzimuthRelative();
+ lastDrawingAzimuth = azimuthRelative;
// compass margins
canvas.setDrawFilter(FILTER_SET);
-
- final int canvasCenterX = (compassArrowWidth / 2) + ((getWidth() - compassArrowWidth) / 2);
- final int canvasCenterY = (compassArrowHeight / 2) + ((getHeight() - compassArrowHeight) / 2);
+ final int canvasCenterX = getWidth() / 2;
+ final int canvasCenterY = getHeight() / 2;
final int marginLeft = (getWidth() - compassArrowWidth) / 2;
final int marginTop = (getHeight() - compassArrowHeight) / 2;
@@ -151,6 +158,16 @@ final public class CompassMiniView extends View {
canvas.setDrawFilter(FILTER_REMOVE);
}
+ private float calculateAzimuthRelative() {
+ float azimuthRelative = azimuth - heading;
+ if (azimuthRelative < 0) {
+ azimuthRelative += 360;
+ } else if (azimuthRelative >= 360) {
+ azimuthRelative -= 360;
+ }
+ return azimuthRelative;
+ }
+
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
diff --git a/main/src/cgeo/geocaching/ui/GPXListAdapter.java b/main/src/cgeo/geocaching/ui/GPXListAdapter.java
index 76dc10e..b4ee3a1 100644
--- a/main/src/cgeo/geocaching/ui/GPXListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/GPXListAdapter.java
@@ -19,6 +19,11 @@ public class GPXListAdapter extends ArrayAdapter<File> {
private cgeogpxes activity = null;
private LayoutInflater inflater = null;
+ private static class ViewHolder {
+ TextView filepath;
+ TextView filename;
+ }
+
public GPXListAdapter(cgeogpxes parentIn, List<File> listIn) {
super(parentIn, 0, listIn);
@@ -39,18 +44,18 @@ public class GPXListAdapter extends ArrayAdapter<File> {
final File file = getItem(position);
View v = rowView;
- GPXListView holder;
+ final ViewHolder holder;
if (v == null) {
v = inflater.inflate(R.layout.gpx_item, null);
- holder = new GPXListView();
+ holder = new ViewHolder();
holder.filepath = (TextView) v.findViewById(R.id.filepath);
holder.filename = (TextView) v.findViewById(R.id.filename);
v.setTag(holder);
} else {
- holder = (GPXListView) v.getTag();
+ holder = (ViewHolder) v.getTag();
}
v.setOnClickListener(new View.OnClickListener() {
diff --git a/main/src/cgeo/geocaching/ui/GPXListView.java b/main/src/cgeo/geocaching/ui/GPXListView.java
deleted file mode 100644
index d2d0766..0000000
--- a/main/src/cgeo/geocaching/ui/GPXListView.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package cgeo.geocaching.ui;
-
-import android.widget.TextView;
-
-public class GPXListView {
- // layouts & views
- public TextView filepath;
- public TextView filename;
-}
diff --git a/main/src/cgeo/geocaching/ui/MapfileListAdapter.java b/main/src/cgeo/geocaching/ui/MapfileListAdapter.java
index a14d120..e14bf3d 100644
--- a/main/src/cgeo/geocaching/ui/MapfileListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/MapfileListAdapter.java
@@ -40,18 +40,18 @@ public class MapfileListAdapter extends ArrayAdapter<File> {
File file = getItem(position);
View v = rowView;
- MapfileView holder;
+ ViewHolder holder;
if (v == null) {
v = inflater.inflate(R.layout.mapfile_item, null);
- holder = new MapfileView();
+ holder = new ViewHolder();
holder.filepath = (TextView) v.findViewById(R.id.mapfilepath);
holder.filename = (TextView) v.findViewById(R.id.mapfilename);
v.setTag(holder);
} else {
- holder = (MapfileView) v.getTag();
+ holder = (ViewHolder) v.getTag();
}
File current = new File(parentView.getCurrentMapfile());
@@ -85,8 +85,8 @@ public class MapfileListAdapter extends ArrayAdapter<File> {
}
}
- private static class MapfileView {
- public TextView filepath;
- public TextView filename;
+ private static final class ViewHolder {
+ TextView filepath;
+ TextView filename;
}
}
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;
+ }
+
+}