aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/AbstractPopupActivity.java1
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java4
-rw-r--r--main/src/cgeo/geocaching/DirectionProvider.java25
-rw-r--r--main/src/cgeo/geocaching/LiveMapInfo.java1
-rw-r--r--main/src/cgeo/geocaching/LogEntry.java12
-rw-r--r--main/src/cgeo/geocaching/LogTrackableActivity.java4
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java34
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java52
-rw-r--r--main/src/cgeo/geocaching/VisitCacheActivity.java7
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java56
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java31
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java17
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java41
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java22
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java13
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java2
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java37
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java39
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java37
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java93
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java2
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java2
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java52
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java2
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java22
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java2
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java15
-rw-r--r--main/src/cgeo/geocaching/cgData.java29
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java208
-rw-r--r--main/src/cgeo/geocaching/compatibility/Compatibility.java16
-rw-r--r--main/src/cgeo/geocaching/filter/FilterUserInterface.java13
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java84
-rw-r--r--main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java117
-rw-r--r--main/src/cgeo/geocaching/sorting/DateComparator.java17
-rw-r--r--main/src/cgeo/geocaching/sorting/FindsComparator.java11
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java20
-rw-r--r--main/src/cgeo/geocaching/ui/CompassMiniView.java3
-rw-r--r--main/src/cgeo/geocaching/ui/CompassView.java40
-rw-r--r--main/src/cgeo/geocaching/ui/Formatter.java23
-rw-r--r--main/src/cgeo/geocaching/utils/AngleUtils.java28
-rw-r--r--main/src/cgeo/geocaching/utils/DateUtils.java18
41 files changed, 677 insertions, 575 deletions
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java
index 588ba2a..bf81d5c 100644
--- a/main/src/cgeo/geocaching/AbstractPopupActivity.java
+++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java
@@ -142,7 +142,6 @@ public abstract class AbstractPopupActivity extends AbstractActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// set layout
- setTheme(R.style.transparent);
setContentView(layout);
setTitle(res.getString(R.string.detail));
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index f5e2f52..bf80e5a 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -46,7 +46,6 @@ 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;
@@ -146,6 +145,7 @@ public class CacheDetailActivity extends AbstractActivity {
if (geo.getAltitude() != 0.0) {
final double diff = cache.getElevation() - geo.getAltitude();
dist.append(diff >= 0 ? " ↗" : " ↘");
+ // TODO: move code related to different units (from the whole project) into utils code
if (Settings.isUseMetricUnits()) {
dist.append(Math.abs((int) diff));
dist.append(" m");
@@ -1830,7 +1830,7 @@ public class CacheDetailActivity extends AbstractActivity {
}
private Bitmap decode(final cgCache cache) {
- return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(cache.getGeocode(), "preview", false).getPath());
+ return StaticMapsProvider.getPreviewMap(cache.getGeocode());
}
@Override
diff --git a/main/src/cgeo/geocaching/DirectionProvider.java b/main/src/cgeo/geocaching/DirectionProvider.java
index 2f54b41..14fd283 100644
--- a/main/src/cgeo/geocaching/DirectionProvider.java
+++ b/main/src/cgeo/geocaching/DirectionProvider.java
@@ -14,6 +14,12 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve
private final SensorManager sensorManager;
+ // Previous values signalled to observers to avoid resending the same value when the
+ // device doesn't change orientation. The orientation is usually given with a 1 degree
+ // precision by Android, so it is not uncommon to obtain exactly the same value several
+ // times.
+ private float previous = -1;
+
public DirectionProvider(final Context context) {
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
@@ -46,7 +52,11 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve
@Override
public void onSensorChanged(final SensorEvent event) {
- notifyObservers(event.values[0]);
+ final float direction = event.values[0];
+ if (direction != previous) {
+ notifyObservers(direction);
+ previous = direction;
+ }
}
/**
@@ -57,18 +67,7 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve
* @return the adjusted direction in degrees, in the [0, 360[ range
*/
public static float getDirectionNow(final Activity activity, final float direction) {
- return Compatibility.getDirectionNow(direction, activity) % 360;
- }
-
- /**
- * Return the angle to turn of to go from an angle to the other
- *
- * @param from the origin angle in degrees, in the [0, 360[ range
- * @param to the target angle in degreees, in the [0, 360[ range
- * @return a value in degrees, in the [-180, 180[ range
- */
- public static double difference(final double from, final double to) {
- return (to - from + 360 + 180) % 360 - 180;
+ return Compatibility.getDirectionNow(direction, activity);
}
}
diff --git a/main/src/cgeo/geocaching/LiveMapInfo.java b/main/src/cgeo/geocaching/LiveMapInfo.java
index 822fbf6..2fee940 100644
--- a/main/src/cgeo/geocaching/LiveMapInfo.java
+++ b/main/src/cgeo/geocaching/LiveMapInfo.java
@@ -13,7 +13,6 @@ public class LiveMapInfo extends AbstractActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setTheme(R.style.transparent);
setContentView(R.layout.livemapinfo);
final int showCount = Settings.getLiveMapHintShowCount();
diff --git a/main/src/cgeo/geocaching/LogEntry.java b/main/src/cgeo/geocaching/LogEntry.java
index 31a9703..e03dc66 100644
--- a/main/src/cgeo/geocaching/LogEntry.java
+++ b/main/src/cgeo/geocaching/LogEntry.java
@@ -1,6 +1,7 @@
package cgeo.geocaching;
import cgeo.geocaching.enumerations.LogType;
+import cgeo.geocaching.utils.DateUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -94,15 +95,6 @@ public final class LogEntry {
}
public int daysSinceLog() {
- final Calendar logDate = Calendar.getInstance();
- logDate.setTimeInMillis(date);
- logDate.set(Calendar.SECOND, 0);
- logDate.set(Calendar.MINUTE, 0);
- logDate.set(Calendar.HOUR, 0);
- final Calendar today = Calendar.getInstance();
- today.set(Calendar.SECOND, 0);
- today.set(Calendar.MINUTE, 0);
- today.set(Calendar.HOUR, 0);
- return (int) Math.round((today.getTimeInMillis() - logDate.getTimeInMillis()) / 86400000d);
+ return DateUtils.daysSince(date);
}
}
diff --git a/main/src/cgeo/geocaching/LogTrackableActivity.java b/main/src/cgeo/geocaching/LogTrackableActivity.java
index 2a0d503..578bd62 100644
--- a/main/src/cgeo/geocaching/LogTrackableActivity.java
+++ b/main/src/cgeo/geocaching/LogTrackableActivity.java
@@ -247,8 +247,8 @@ public class LogTrackableActivity extends AbstractActivity implements DateDialog
});
final Button dateButton = (Button) findViewById(R.id.date);
- dateButton.setText(Formatter.formatShortDate(date.getTime().getTime()));
dateButton.setOnClickListener(new DateListener());
+ setDate(date);
if (tweetBox == null) {
tweetBox = (LinearLayout) findViewById(R.id.tweet_box);
@@ -281,7 +281,7 @@ public class LogTrackableActivity extends AbstractActivity implements DateDialog
date = dateIn;
final Button dateButton = (Button) findViewById(R.id.date);
- dateButton.setText(Formatter.formatShortDate(date.getTime().getTime()));
+ dateButton.setText(Formatter.formatShortDateVerbally(date.getTime().getTime()));
}
public void setType(LogType type) {
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index a95f4d2..7ddc4e0 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -135,42 +135,28 @@ public class StaticMapsActivity extends AbstractActivity {
factory = new BitmapFactory();
}
- 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());
- if (image != null) {
- maps.add(image);
- }
- } else {
- final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath());
- if (image != null) {
- maps.add(image);
- }
- }
- } catch (Exception e) {
- Log.e("StaticMapsActivity.LoadMapsThread.run.1: " + e.toString());
- }
- }
-
- if (maps.isEmpty()) {
+ // try downloading 2 times
+ for (int trials = 0; trials < 2; trials++) {
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 = StaticMapsProvider.getWaypointMap(geocode, waypoint_id, level);
if (image != null) {
maps.add(image);
}
} else {
- final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath());
+ final Bitmap image = StaticMapsProvider.getCacheMap(geocode, level);
if (image != null) {
maps.add(image);
}
}
} catch (Exception e) {
- Log.e("StaticMapsActivity.LoadMapsThread.run.2: " + e.toString());
+ Log.e("StaticMapsActivity.LoadMapsThread.run: " + e.toString());
}
}
+ if (!maps.isEmpty()) {
+ break;
+ }
}
loadMapsHandler.sendMessage(Message.obtain());
@@ -201,13 +187,13 @@ public class StaticMapsActivity extends AbstractActivity {
if (waypoint_id == null) {
showToast(res.getString(R.string.info_storing_static_maps));
StaticMapsProvider.storeCacheStaticMap(cache, this, true);
- return StaticMapsProvider.doesExistStaticMapForCache(geocode);
+ return StaticMapsProvider.hasStaticMapForCache(geocode);
}
final cgWaypoint waypoint = cache.getWaypointById(waypoint_id);
if (waypoint != null) {
showToast(res.getString(R.string.info_storing_static_maps));
StaticMapsProvider.storeWaypointStaticMap(cache, this, waypoint, true);
- return StaticMapsProvider.doesExistStaticMapForWaypoint(geocode, waypoint_id);
+ return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint_id);
}
showToast(res.getString(R.string.err_detail_not_load_map_static));
return false;
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index 030efeb..6de1291 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -8,11 +8,14 @@ import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.utils.Log;
import ch.boye.httpclientandroidlib.HttpResponse;
+
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import android.app.Activity;
import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
@@ -21,6 +24,7 @@ import java.io.File;
import java.util.concurrent.TimeUnit;
public class StaticMapsProvider {
+ private static final String PREFIX_PREVIEW = "preview";
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";
@@ -32,7 +36,7 @@ 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 boolean createDirs) {
+ private static File getMapFile(final String geocode, String prefix, final boolean createDirs) {
return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix, false, createDirs);
}
@@ -48,7 +52,7 @@ public class StaticMapsProvider {
final Parameters params = new Parameters(
"center", latlonMap,
"zoom", String.valueOf(zoom),
- "size", width + "x" + height,
+ "size", String.valueOf(width) + 'x' + String.valueOf(height),
"maptype", mapType,
"markers", "icon:" + markerUrl + '|' + shadow + latlonMap,
"sensor", "false");
@@ -80,7 +84,7 @@ public class StaticMapsProvider {
downloadMaps(cache, display);
}
- public static void downloadMaps(cgCache cache, Display display) {
+ private static void downloadMaps(cgCache cache, Display display) {
if ((!Settings.isStoreOfflineMaps() && !Settings.isStoreOfflineWpMaps()) || StringUtils.isBlank(cache.getGeocode())) {
return;
}
@@ -114,7 +118,7 @@ public class StaticMapsProvider {
String wpLatlonMap = waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA);
String wpMarkerUrl = getWpMarkerUrl(waypoint);
// download map images in separate background thread for higher performance
- downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + "_", wpLatlonMap, edge, null, waitForResult);
+ downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + '_', wpLatlonMap, edge, null, waitForResult);
}
public static void storeCacheStaticMap(cgCache cache, Activity activity, final boolean waitForResult) {
@@ -130,7 +134,7 @@ public class StaticMapsProvider {
continue;
}
final String wpMarkerUrl = getWpMarkerUrl(waypoint);
- waypoints.put("markers", "icon:" + wpMarkerUrl + "|" + waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA));
+ waypoints.put("markers", "icon:" + wpMarkerUrl + '|' + waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA));
}
// download map images in separate background thread for higher performance
final String cacheMarkerUrl = getCacheMarkerUrl(cache);
@@ -145,7 +149,7 @@ public class StaticMapsProvider {
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);
+ downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, PREFIX_PREVIEW, "shadow:false|", latlonMap, width, height, null);
}
private static int guessMaxDisplaySide(Display display) {
@@ -182,14 +186,15 @@ public class StaticMapsProvider {
}
private static String getCacheMarkerUrl(final cgCache cache) {
- String type = cache.getType().id;
+ StringBuilder url = new StringBuilder(MARKERS_URL);
+ url.append("marker_cache_").append(cache.getType().id);
if (cache.isFound()) {
- type += "_found";
+ url.append("_found");
} else if (cache.isDisabled()) {
- type += "_disabled";
+ url.append("_disabled");
}
-
- return MARKERS_URL + "marker_cache_" + type + ".png";
+ url.append(".png");
+ return url.toString();
}
private static String getWpMarkerUrl(final cgWaypoint waypoint) {
@@ -198,11 +203,12 @@ public class StaticMapsProvider {
}
public static void removeWpStaticMaps(int wp_id, final String geocode) {
+ if (wp_id <= 0) {
+ return;
+ }
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());
}
@@ -215,9 +221,9 @@ public class StaticMapsProvider {
* @param geocode
* @return <code>true</code> if at least one mapfile exists; <code>false</code> otherwise
*/
- public static boolean doesExistStaticMapForCache(String geocode) {
+ public static boolean hasStaticMapForCache(String geocode) {
for (int level = 1; level <= 5; level++) {
- File mapFile = StaticMapsProvider.getMapFile(geocode, "" + level, false);
+ File mapFile = StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false);
if (mapFile != null && mapFile.exists()) {
return true;
}
@@ -232,7 +238,7 @@ public class StaticMapsProvider {
* @param waypointId
* @return <code>true</code> if at least one mapfile exists; <code>false</code> otherwise
*/
- public static boolean doesExistStaticMapForWaypoint(String geocode, int waypointId) {
+ public static boolean hasStaticMapForWaypoint(String geocode, int waypointId) {
for (int level = 1; level <= 5; level++) {
File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + level, false);
if (mapFile != null && mapFile.exists()) {
@@ -241,4 +247,16 @@ public class StaticMapsProvider {
}
return false;
}
+
+ public static Bitmap getPreviewMap(final String geocode) {
+ return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, PREFIX_PREVIEW, false).getPath());
+ }
+
+ public static Bitmap getWaypointMap(final String geocode, int waypoint_id, int level) {
+ return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypoint_id + "_" + level, false).getPath());
+ }
+
+ public static Bitmap getCacheMap(final String geocode, int level) {
+ return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false).getPath());
+ }
}
diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java
index c211157..e5410e7 100644
--- a/main/src/cgeo/geocaching/VisitCacheActivity.java
+++ b/main/src/cgeo/geocaching/VisitCacheActivity.java
@@ -510,7 +510,7 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D
});
final Button dateButton = (Button) findViewById(R.id.date);
- dateButton.setText(Formatter.formatShortDate(date.getTime().getTime()));
+ setDate(date);
dateButton.setOnClickListener(new DateListener());
final EditText logView = (EditText) findViewById(R.id.log);
@@ -548,7 +548,7 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D
date = dateIn;
final Button dateButton = (Button) findViewById(R.id.date);
- dateButton.setText(Formatter.formatShortDate(date.getTime().getTime()));
+ dateButton.setText(Formatter.formatShortDateVerbally(date.getTime().getTime()));
}
public void setType(LogType type) {
@@ -602,6 +602,7 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D
@Override
public void onClick(View arg0) {
+ //TODO: unify this method and the code in init()
app.clearLogOffline(geocode);
if (alreadyFound) {
@@ -615,8 +616,8 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D
setType(typeSelected);
final Button dateButton = (Button) findViewById(R.id.date);
- dateButton.setText(Formatter.formatShortDate(date.getTime().getTime()));
dateButton.setOnClickListener(new DateListener());
+ setDate(date);
final EditText logView = (EditText) findViewById(R.id.log);
logView.setText("");
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java
index 5817763..ca8c7db 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java
@@ -2,14 +2,14 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
-import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.apps.AbstractApp;
import android.app.Activity;
/**
* navigation app for simple point navigation (no differentiation between cache/waypoint/point)
*/
-abstract class AbstractPointNavigationApp extends AbstractNavigationApp {
+abstract class AbstractPointNavigationApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp {
protected AbstractPointNavigationApp(String name, String intent) {
super(name, intent);
@@ -20,46 +20,22 @@ abstract class AbstractPointNavigationApp extends AbstractNavigationApp {
}
@Override
- public final boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, Geopoint coords) {
- if (cache == null && waypoint == null && coords == null) {
- return false;
- }
-
- try {
- if (isInstalled()) {
- final Geopoint point = getCoordinates(cache, waypoint, coords);
- if (point != null) {
- navigate(activity, point);
- return true;
- }
- }
- } catch (Exception e) {
- // nothing
- }
-
- return false;
+ public void navigate(Activity activity, cgCache cache) {
+ navigate(activity, cache.getCoords());
}
- protected abstract void navigate(Activity activity, Geopoint point);
-
- /**
- * Return the first of the cache coordinates, the waypoint coordinates or the extra coordinates. <code>null</code>
- * entities are skipped.
- *
- * @param cache a cache
- * @param waypoint a waypoint
- * @param coords extra coordinates
- * @return the first non-null coordinates, or null if none are set
- */
- private static Geopoint getCoordinates(final cgCache cache, final cgWaypoint waypoint, final Geopoint coords) {
- if (cache != null && cache.getCoords() != null) {
- return cache.getCoords();
- }
+ @Override
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ navigate(activity, waypoint.getCoords());
+ }
- if (waypoint != null && waypoint.getCoords() != null) {
- return waypoint.getCoords();
- }
+ @Override
+ public boolean isEnabled(cgCache cache) {
+ return cache.getCoords() != null;
+ }
- return coords;
+ @Override
+ public boolean isEnabled(cgWaypoint waypoint) {
+ return waypoint.getCoords() != null;
}
-} \ No newline at end of file
+}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
index ff61404..213e806 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
@@ -8,13 +8,13 @@ import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.activity.ActivityMixin;
-import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.apps.AbstractApp;
import org.apache.commons.lang3.StringUtils;
import android.app.Activity;
-abstract class AbstractStaticMapsApp extends AbstractNavigationApp {
+abstract class AbstractStaticMapsApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp {
public AbstractStaticMapsApp(String name) {
super(name, null);
}
@@ -25,27 +25,23 @@ abstract class AbstractStaticMapsApp extends AbstractNavigationApp {
}
protected static boolean hasStaticMap(cgCache cache) {
- if (cache != null) {
- String geocode = cache.getGeocode();
- if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) {
- return StaticMapsProvider.doesExistStaticMapForCache(geocode);
- }
+ String geocode = cache.getGeocode();
+ if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) {
+ return StaticMapsProvider.hasStaticMapForCache(geocode);
}
return false;
}
protected static boolean hasStaticMap(cgWaypoint waypoint) {
- if (waypoint != null) {
- String geocode = waypoint.getGeocode();
- int id = waypoint.getId();
- if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) {
- return StaticMapsProvider.doesExistStaticMapForWaypoint(geocode, id);
- }
+ String geocode = waypoint.getGeocode();
+ int id = waypoint.getId();
+ if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) {
+ return StaticMapsProvider.hasStaticMapForWaypoint(geocode, id);
}
return false;
}
- protected static boolean invoke(final Activity activity, final cgCache cache, final cgWaypoint waypoint, final boolean download) {
+ protected static boolean invokeStaticMaps(final Activity activity, final cgCache cache, final cgWaypoint waypoint, final boolean download) {
final ILogable logable = cache != null && cache.getListId() != 0 ? cache : waypoint;
final String geocode = logable.getGeocode().toUpperCase();
if (geocode == null) {
@@ -56,11 +52,4 @@ abstract class AbstractStaticMapsApp extends AbstractNavigationApp {
StaticMapsActivity.startActivity(activity, geocode, download, waypoint);
return true;
}
-
-
- @Override
- public boolean isEnabled(Geopoint geopoint) {
- return false;
- }
-
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java
new file mode 100644
index 0000000..e47150f
--- /dev/null
+++ b/main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java
@@ -0,0 +1,17 @@
+package cgeo.geocaching.apps.cache.navi;
+
+import cgeo.geocaching.cgCache;
+import cgeo.geocaching.apps.App;
+
+import android.app.Activity;
+
+/**
+ * interface for navigation to a cache
+ *
+ */
+public interface CacheNavigationApp extends App {
+ void navigate(final Activity activity, final cgCache cache);
+
+ @Override
+ boolean isEnabled(final cgCache cache);
+} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java b/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java
index 1576617..da3d5f9 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java
@@ -4,11 +4,12 @@ import cgeo.geocaching.R;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
import cgeo.geocaching.cgeonavigate;
+import cgeo.geocaching.apps.AbstractApp;
import cgeo.geocaching.geopoint.Geopoint;
import android.app.Activity;
-class CompassApp extends AbstractNavigationApp {
+class CompassApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp {
CompassApp() {
super(getString(R.string.compass_title), null);
@@ -20,22 +21,28 @@ class CompassApp extends AbstractNavigationApp {
}
@Override
- public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) {
-
- if (cache != null && cache.getGeocode() != null) {
- cgeonavigate.startActivity(activity, cache.getGeocode(), cache.getName(), cache.getCoords(), null);
- return true;
- }
- if (waypoint != null && waypoint.getCoords() != null) {
- cgeonavigate.startActivity(activity, waypoint.getPrefix() + "/" + waypoint.getLookup(), waypoint.getName(), waypoint.getCoords(), null);
- return true;
- }
- if (coords != null) {
- cgeonavigate.startActivity(activity, getString(R.string.navigation_direct_navigation), getString(R.string.navigation_target), coords, null);
- return true;
- }
- // search is not handled here
- return false;
+ public void navigate(Activity activity, Geopoint coords) {
+ cgeonavigate.startActivity(activity, getString(R.string.navigation_direct_navigation), getString(R.string.navigation_target), coords, null);
+ }
+
+ @Override
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ cgeonavigate.startActivity(activity, waypoint.getPrefix() + "/" + waypoint.getLookup(), waypoint.getName(), waypoint.getCoords(), null);
+ }
+
+ @Override
+ public boolean isEnabled(cgWaypoint waypoint) {
+ return waypoint.getCoords() != null;
+ }
+
+ @Override
+ public void navigate(Activity activity, cgCache cache) {
+ cgeonavigate.startActivity(activity, cache.getGeocode(), cache.getName(), cache.getCoords(), null);
+ }
+
+ @Override
+ public boolean isEnabled(cgCache cache) {
+ return cache.getGeocode() != null;
}
} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java
index 1625ef7..f093937 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java
@@ -3,7 +3,6 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.R;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
-import cgeo.geocaching.geopoint.Geopoint;
import android.app.Activity;
@@ -14,23 +13,22 @@ class DownloadStaticMapsApp extends AbstractStaticMapsApp {
}
@Override
- public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) {
- return invoke(activity, cache, waypoint, true);
- }
-
- @Override
public boolean isEnabled(cgCache cache) {
- if (cache == null) {
- return false;
- }
return !hasStaticMap(cache);
}
@Override
public boolean isEnabled(cgWaypoint waypoint) {
- if (waypoint == null) {
- return false;
- }
return !hasStaticMap(waypoint);
}
+
+ @Override
+ public void navigate(Activity activity, cgCache cache) {
+ invokeStaticMaps(activity, cache, null, true);
+ }
+
+ @Override
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ invokeStaticMaps(activity, null, waypoint, true);
+ }
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java
new file mode 100644
index 0000000..fe4fd5d
--- /dev/null
+++ b/main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java
@@ -0,0 +1,13 @@
+package cgeo.geocaching.apps.cache.navi;
+
+import cgeo.geocaching.geopoint.Geopoint;
+
+import android.app.Activity;
+
+/**
+ * interface for navigation to a coordinate. This one cannot be enabled/disabled.
+ *
+ */
+public interface GeopointNavigationApp {
+ void navigate(final Activity activity, final Geopoint coords);
+}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java
index 4e6e62b..eac33cc 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java
@@ -21,7 +21,7 @@ class GoogleMapsApp extends AbstractPointNavigationApp {
}
@Override
- protected void navigate(Activity activity, Geopoint point) {
+ public void navigate(Activity activity, Geopoint point) {
// INFO: q parameter works with Google Maps, but breaks cooperation with all other apps
try {
activity.startActivity(new Intent(Intent.ACTION_VIEW,
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java
index 31d99e9..7258e11 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java
@@ -3,8 +3,6 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.IGeoData;
import cgeo.geocaching.R;
import cgeo.geocaching.Settings;
-import cgeo.geocaching.cgCache;
-import cgeo.geocaching.cgWaypoint;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.geopoint.Geopoint;
@@ -14,7 +12,7 @@ import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
-class GoogleNavigationApp extends AbstractNavigationApp {
+class GoogleNavigationApp extends AbstractPointNavigationApp {
GoogleNavigationApp() {
super(getString(R.string.cache_menu_tbt), null);
@@ -25,33 +23,8 @@ class GoogleNavigationApp extends AbstractNavigationApp {
return true;
}
- @Override
- public boolean invoke(final Activity activity, final cgCache cache, final cgWaypoint waypoint, final Geopoint coords) {
- if (activity == null) {
- return false;
- }
-
+ private static boolean navigateToCoordinates(Activity activity, final Geopoint coords) {
IGeoData geo = cgeoapplication.getInstance().currentGeo();
- boolean navigationResult = false;
- if (coords != null) {
- navigationResult = navigateToCoordinates(geo, activity, coords);
- }
- else if (waypoint != null) {
- navigationResult = navigateToCoordinates(geo, activity, waypoint.getCoords());
- }
- else if (cache != null) {
- navigationResult = navigateToCoordinates(geo, activity, cache.getCoords());
- }
-
- if (!navigationResult) {
- ActivityMixin.showToast(activity, getString(R.string.err_navigation_no));
- return false;
- }
-
- return true;
- }
-
- private static boolean navigateToCoordinates(IGeoData geo, Activity activity, final Geopoint coords) {
final Geopoint coordsNow = geo == null ? null : geo.getCoords();
// Google Navigation
@@ -89,4 +62,10 @@ class GoogleNavigationApp extends AbstractNavigationApp {
return false;
}
+ @Override
+ public void navigate(Activity activity, Geopoint coords) {
+ if (!navigateToCoordinates(activity, coords)) {
+ ActivityMixin.showToast(activity, getString(R.string.err_navigation_no));
+ }
+ }
} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java b/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java
index f1e03ed..8185f40 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java
@@ -3,37 +3,46 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.R;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
+import cgeo.geocaching.apps.AbstractApp;
import cgeo.geocaching.enumerations.WaypointType;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.maps.CGeoMap;
import android.app.Activity;
-class InternalMap extends AbstractNavigationApp {
+class InternalMap extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp {
InternalMap() {
super(getString(R.string.cache_menu_map), null);
}
@Override
- public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) {
- if (cache != null) {
- CGeoMap.startActivityGeoCode(activity, cache.getGeocode());
- // may need some code from CGeoMap.startActivitySearch(activity, search, cache != null ? cache.getGeocode() : null, true);
- }
- else if (waypoint != null) {
- CGeoMap.startActivityCoords(activity, waypoint.getCoords(), waypoint.getWaypointType(), waypoint.getName());
- }
- else if (coords != null) {
- CGeoMap.startActivityCoords(activity, coords, WaypointType.WAYPOINT, null);
- }
-
+ public boolean isInstalled() {
return true;
}
@Override
- public boolean isInstalled() {
- return true;
+ public void navigate(Activity activity, Geopoint coords) {
+ CGeoMap.startActivityCoords(activity, coords, WaypointType.WAYPOINT, null);
}
+ @Override
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ CGeoMap.startActivityCoords(activity, waypoint.getCoords(), waypoint.getWaypointType(), waypoint.getName());
+ }
+
+ @Override
+ public boolean isEnabled(cgWaypoint waypoint) {
+ return waypoint.getCoords() != null;
+ }
+
+ @Override
+ public void navigate(Activity activity, cgCache cache) {
+ CGeoMap.startActivityGeoCode(activity, cache.getGeocode());
+ }
+
+ @Override
+ public boolean isEnabled(cgCache cache) {
+ return cache.getCoords() != null;
+ }
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java b/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java
index d71a474..a20f2ce 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java
@@ -3,45 +3,30 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
import cgeo.geocaching.apps.AbstractLocusApp;
-import cgeo.geocaching.geopoint.Geopoint;
import android.app.Activity;
-import java.util.ArrayList;
+import java.util.Collections;
-class LocusApp extends AbstractLocusApp implements NavigationApp {
+class LocusApp extends AbstractLocusApp implements CacheNavigationApp, WaypointNavigationApp {
+
+ @Override
+ public boolean isEnabled(cgWaypoint waypoint) {
+ return waypoint.getCoords() != null;
+ }
/**
* Show a single cache with waypoints or a single waypoint in Locus.
* This method constructs a list of cache and waypoints only.
*
- * @see AbstractLocusApp#showInLocus
*/
@Override
- public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) {
-
- final ArrayList<Object> points = new ArrayList<Object>();
-
- // add cache if present
- if (cache != null && cache.getCoords() != null) {
- points.add(cache);
- }
-
- // add waypoint if present
- if (waypoint != null && waypoint.getCoords() != null) {
- points.add(waypoint);
- }
-
- return showInLocus(points, true, false, activity);
- }
-
- @Override
- public boolean isEnabled(cgWaypoint waypoint) {
- return waypoint != null;
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ showInLocus(Collections.singletonList(waypoint), true, false, activity);
}
@Override
- public boolean isEnabled(Geopoint geopoint) {
- return geopoint != null;
+ public void navigate(Activity activity, cgCache cache) {
+ showInLocus(Collections.singletonList(cache), true, false, activity);
}
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
index 95f6408..8219320 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java
@@ -7,8 +7,8 @@ import cgeo.geocaching.cgWaypoint;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.apps.AbstractAppFactory;
+import cgeo.geocaching.apps.App;
import cgeo.geocaching.geopoint.Geopoint;
-import cgeo.geocaching.utils.Log;
import android.app.Activity;
import android.app.AlertDialog;
@@ -48,7 +48,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
/** The external navigon app */
NAVIGON(new NavigonApp(), 10);
- NavigationAppsEnum(NavigationApp app, int id) {
+ NavigationAppsEnum(App app, int id) {
this.app = app;
this.id = id;
}
@@ -56,7 +56,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
/**
* The app instance to use
*/
- public final NavigationApp app;
+ public final App app;
/**
* The id - used in c:geo settings
*/
@@ -119,7 +119,17 @@ public final class NavigationAppFactory extends AbstractAppFactory {
for (NavigationAppsEnum navApp : getInstalledNavigationApps()) {
if ((showInternalMap || !(navApp.app instanceof InternalMap)) &&
(showDefaultNavigation || defaultNavigationTool != navApp.id)) {
- if (navApp.app.isEnabled(cache) || navApp.app.isEnabled(waypoint) || navApp.app.isEnabled(destination)) {
+ boolean add = false;
+ if (cache != null && navApp.app instanceof CacheNavigationApp && ((CacheNavigationApp) navApp.app).isEnabled(cache)) {
+ add = true;
+ }
+ if (waypoint != null && navApp.app instanceof WaypointNavigationApp && ((WaypointNavigationApp) navApp.app).isEnabled(waypoint)) {
+ add = true;
+ }
+ if (destination != null && navApp.app instanceof GeopointNavigationApp) {
+ add = true;
+ }
+ if (add) {
items.add(navApp);
}
}
@@ -134,7 +144,18 @@ public final class NavigationAppFactory extends AbstractAppFactory {
@Override
public void onClick(DialogInterface dialog, int item) {
NavigationAppsEnum selectedItem = adapter.getItem(item);
- selectedItem.app.invoke(activity, cache, waypoint, destination);
+ if (cache != null) {
+ CacheNavigationApp cacheApp = (CacheNavigationApp) selectedItem.app;
+ cacheApp.navigate(activity, cache);
+ }
+ else if (waypoint != null) {
+ WaypointNavigationApp waypointApp = (WaypointNavigationApp) selectedItem.app;
+ waypointApp.navigate(activity, waypoint);
+ }
+ else {
+ GeopointNavigationApp geopointApp = (GeopointNavigationApp) selectedItem.app;
+ geopointApp.navigate(activity, destination);
+ }
}
});
final AlertDialog alert = builder.create();
@@ -174,16 +195,22 @@ public final class NavigationAppFactory extends AbstractAppFactory {
*/
public static void addMenuItems(final Menu menu, final cgCache cache) {
for (NavigationAppsEnum navApp : getInstalledNavigationApps()) {
- if (navApp.app.isEnabled(cache)) {
- menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName());
+ if (navApp.app instanceof CacheNavigationApp) {
+ CacheNavigationApp cacheApp = (CacheNavigationApp) navApp.app;
+ if (cacheApp.isEnabled(cache)) {
+ menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName());
+ }
}
}
}
public static void addMenuItems(final Menu menu, final cgWaypoint waypoint) {
for (NavigationAppsEnum navApp : getInstalledNavigationApps()) {
- if (navApp.app.isEnabled(waypoint)) {
- menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName());
+ if (navApp.app instanceof WaypointNavigationApp) {
+ WaypointNavigationApp waypointApp = (WaypointNavigationApp) navApp.app;
+ if (waypointApp.isEnabled(waypoint)) {
+ menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName());
+ }
}
}
}
@@ -197,29 +224,37 @@ public final class NavigationAppFactory extends AbstractAppFactory {
* @return
*/
public static boolean onMenuItemSelected(final MenuItem item, Activity activity, cgCache cache) {
- return invokeApp(activity, cache, null, null, getAppFromMenuItem(item));
+ navigateCache(activity, cache, getAppFromMenuItem(item));
+ return true;
+ }
+
+ private static void navigateCache(Activity activity, cgCache cache, App app) {
+ if (app instanceof CacheNavigationApp) {
+ CacheNavigationApp cacheApp = (CacheNavigationApp) app;
+ cacheApp.navigate(activity, cache);
+ }
}
public static boolean onMenuItemSelected(final MenuItem item, Activity activity, cgWaypoint waypoint) {
- return invokeApp(activity, null, waypoint, null, getAppFromMenuItem(item));
+ navigateWaypoint(activity, waypoint, getAppFromMenuItem(item));
+ return true;
}
- private static boolean invokeApp(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint destination, final NavigationApp app) {
- if (app == null) {
- return false;
+ private static void navigateWaypoint(Activity activity, cgWaypoint waypoint, App app) {
+ if (app instanceof WaypointNavigationApp) {
+ WaypointNavigationApp waypointApp = (WaypointNavigationApp) app;
+ waypointApp.navigate(activity, waypoint);
}
- if (cache == null && waypoint == null && destination == null) {
- return false;
- }
- try {
- return app.invoke(activity, cache, waypoint, destination);
- } catch (Exception e) {
- Log.e("NavigationAppFactory.onMenuItemSelected: " + e.toString());
+ }
+
+ private static void navigateGeopoint(Activity activity, Geopoint destination, App app) {
+ if (app instanceof GeopointNavigationApp) {
+ GeopointNavigationApp geopointApp = (GeopointNavigationApp) app;
+ geopointApp.navigate(activity, destination);
}
- return false;
}
- private static NavigationApp getAppFromMenuItem(MenuItem item) {
+ private static App getAppFromMenuItem(MenuItem item) {
final int id = item.getItemId();
for (NavigationAppsEnum navApp : NavigationAppsEnum.values()) {
if (MENU_ITEM_OFFSET + navApp.id == id) {
@@ -243,10 +278,10 @@ public final class NavigationAppFactory extends AbstractAppFactory {
return;
}
- invokeApp(activity, cache, null, null, getDefaultNavigationApplication(defaultNavigation));
+ navigateCache(activity, cache, getDefaultNavigationApplication(defaultNavigation));
}
- private static NavigationApp getDefaultNavigationApplication(int defaultNavigation) {
+ private static App getDefaultNavigationApplication(int defaultNavigation) {
if (defaultNavigation == 2) {
return getNavigationAppFromSetting(Settings.getDefaultNavigationTool2());
}
@@ -264,7 +299,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
ActivityMixin.showToast(activity, cgeoapplication.getInstance().getString(R.string.err_location_unknown));
return;
}
- invokeApp(activity, null, waypoint, null, getDefaultNavigationApplication(defaultNavigation));
+ navigateWaypoint(activity, waypoint, getDefaultNavigationApplication(defaultNavigation));
}
/**
@@ -279,7 +314,7 @@ public final class NavigationAppFactory extends AbstractAppFactory {
return;
}
- invokeApp(activity, null, null, destination, getDefaultNavigationApplication(defaultNavigation));
+ navigateGeopoint(activity, destination, getDefaultNavigationApplication(defaultNavigation));
}
/**
@@ -287,11 +322,11 @@ public final class NavigationAppFactory extends AbstractAppFactory {
*
* @return never <code>null</code>
*/
- public static NavigationApp getDefaultNavigationApplication() {
+ public static App getDefaultNavigationApplication() {
return getNavigationAppFromSetting(Settings.getDefaultNavigationTool());
}
- private static NavigationApp getNavigationAppFromSetting(final int defaultNavigationTool) {
+ private static App getNavigationAppFromSetting(final int defaultNavigationTool) {
final List<NavigationAppsEnum> installedNavigationApps = getInstalledNavigationApps();
for (NavigationAppsEnum navigationApp : installedNavigationApps) {
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java
index 69f63dc..7ea86fb 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java
@@ -16,7 +16,7 @@ class NavigonApp extends AbstractPointNavigationApp {
}
@Override
- protected void navigate(Activity activity, Geopoint point) {
+ public void navigate(Activity activity, Geopoint point) {
final Intent intent = new Intent(INTENT);
/*
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java
index 27ec2fa..24ef81b 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java
@@ -15,7 +15,7 @@ class OruxMapsApp extends AbstractPointNavigationApp {
}
@Override
- protected void navigate(Activity activity, Geopoint point) {
+ public void navigate(Activity activity, Geopoint point) {
final Intent intent = new Intent(INTENT);
intent.putExtra("latitude", point.getLatitude());//latitude, wgs84 datum
intent.putExtra("longitude", point.getLongitude());//longitude, wgs84 datum
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java
index 8044cc6..a481813 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java
@@ -3,6 +3,7 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.R;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
+import cgeo.geocaching.apps.AbstractApp;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.GeopointFormatter.Format;
@@ -11,7 +12,7 @@ import android.content.Intent;
import java.util.ArrayList;
-class RMapsApp extends AbstractNavigationApp {
+class RMapsApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp {
private static final String INTENT = "com.robert.maps.action.SHOW_POINTS";
@@ -20,29 +21,30 @@ class RMapsApp extends AbstractNavigationApp {
}
@Override
- public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) {
- try {
- final ArrayList<String> locations = new ArrayList<String>();
- if (cache != null && cache.getCoords() != null) {
- locations.add(cache.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA)
- + ";" + cache.getGeocode()
- + ";" + cache.getName());
- } else if (waypoint != null && waypoint.getCoords() != null) {
- locations.add(waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA)
- + ";" + waypoint.getLookup()
- + ";" + waypoint.getName());
- }
-
- if (!locations.isEmpty()) {
- final Intent intent = new Intent(INTENT);
- intent.putStringArrayListExtra("locations", locations);
- activity.startActivity(intent);
- return true;
- }
- } catch (Exception e) {
- // nothing
- }
-
- return false;
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ navigate(activity, waypoint.getCoords(), waypoint.getLookup(), waypoint.getName());
+ }
+
+ private static void navigate(Activity activity, Geopoint coords, String code, String name) {
+ final ArrayList<String> locations = new ArrayList<String>();
+ locations.add(coords.format(Format.LAT_LON_DECDEGREE_COMMA) + ";" + code + ";" + name);
+ final Intent intent = new Intent(INTENT);
+ intent.putStringArrayListExtra("locations", locations);
+ activity.startActivity(intent);
+ }
+
+ @Override
+ public boolean isEnabled(cgWaypoint waypoint) {
+ return waypoint.getCoords() != null;
+ }
+
+ @Override
+ public void navigate(Activity activity, cgCache cache) {
+ navigate(activity, cache.getCoords(), cache.getGeocode(), cache.getName());
+ }
+
+ @Override
+ public void navigate(Activity activity, Geopoint coords) {
+ navigate(activity, coords, "", "");
}
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java b/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java
index 3374691..b01539c 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java
@@ -16,7 +16,7 @@ class RadarApp extends AbstractPointNavigationApp {
}
@Override
- protected void navigate(Activity activity, Geopoint point) {
+ public void navigate(Activity activity, Geopoint point) {
final Intent radarIntent = new Intent(INTENT);
radarIntent.putExtra("latitude", (float) point.getLatitude());
radarIntent.putExtra("longitude", (float) point.getLongitude());
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java b/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java
index d805656..6be027f 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java
@@ -3,7 +3,6 @@ package cgeo.geocaching.apps.cache.navi;
import cgeo.geocaching.R;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgWaypoint;
-import cgeo.geocaching.geopoint.Geopoint;
import android.app.Activity;
@@ -14,23 +13,22 @@ class StaticMapApp extends AbstractStaticMapsApp {
}
@Override
- public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) {
- return invoke(activity, cache, waypoint, false);
- }
-
- @Override
public boolean isEnabled(cgCache cache) {
- if (cache == null) {
- return false;
- }
return hasStaticMap(cache);
}
@Override
public boolean isEnabled(cgWaypoint waypoint) {
- if (waypoint == null) {
- return false;
- }
return hasStaticMap(waypoint);
}
+
+ @Override
+ public void navigate(Activity activity, cgCache cache) {
+ invokeStaticMaps(activity, cache, null, false);
+ }
+
+ @Override
+ public void navigate(Activity activity, cgWaypoint waypoint) {
+ invokeStaticMaps(activity, null, waypoint, false);
+ }
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java b/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java
index 41f958d..012b94f 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java
@@ -22,7 +22,7 @@ class StreetviewApp extends AbstractPointNavigationApp {
}
@Override
- protected void navigate(Activity activity, Geopoint point) {
+ public void navigate(Activity activity, Geopoint point) {
try {
activity.startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("google.streetview:cbll=" + point.getLatitude() + "," + point.getLongitude())));
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java
new file mode 100644
index 0000000..7d3a706
--- /dev/null
+++ b/main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java
@@ -0,0 +1,15 @@
+package cgeo.geocaching.apps.cache.navi;
+
+import cgeo.geocaching.cgWaypoint;
+
+import android.app.Activity;
+
+/**
+ * interface for navigation to a waypoint
+ *
+ */
+public interface WaypointNavigationApp {
+ void navigate(final Activity activity, final cgWaypoint waypoint);
+
+ boolean isEnabled(final cgWaypoint waypoint);
+}
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 37f8b7d..ec9c406 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -2475,41 +2475,30 @@ public class cgData {
public boolean saveLogOffline(String geocode, Date date, LogType type, String log) {
if (StringUtils.isBlank(geocode)) {
+ Log.e("cgData.saveLogOffline: cannot log a blank geocode");
return false;
}
if (LogType.UNKNOWN == type && StringUtils.isBlank(log)) {
+ Log.e("cgData.saveLogOffline: cannot log an unknown log type and no message");
return false;
}
init();
- boolean status = false;
- ContentValues values = new ContentValues();
+ final ContentValues values = new ContentValues();
values.put("geocode", geocode);
values.put("updated", System.currentTimeMillis());
values.put("type", type.id);
values.put("log", log);
values.put("date", date.getTime());
- try {
- if (hasLogOffline(geocode)) {
- final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode });
-
- if (rows > 0) {
- status = true;
- }
- } else {
- final long id = database.insert(dbTableLogsOffline, null, values);
-
- if (id > 0) {
- status = true;
- }
- }
- } catch (Exception e) {
- Log.e("cgData.saveLogOffline: " + e.toString());
+ if (hasLogOffline(geocode)) {
+ final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode });
+ return rows > 0;
+ } else {
+ final long id = database.insert(dbTableLogsOffline, null, values);
+ return id != -1;
}
-
- return status;
}
public LogEntry loadLogOffline(String geocode) {
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index 08de15e..4951f9f 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -24,27 +24,16 @@ import cgeo.geocaching.network.Cookies;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.sorting.CacheComparator;
-import cgeo.geocaching.sorting.DateComparator;
-import cgeo.geocaching.sorting.DifficultyComparator;
+import cgeo.geocaching.sorting.ComparatorUserInterface;
import cgeo.geocaching.sorting.EventDateComparator;
-import cgeo.geocaching.sorting.FindsComparator;
-import cgeo.geocaching.sorting.GeocodeComparator;
-import cgeo.geocaching.sorting.InventoryComparator;
-import cgeo.geocaching.sorting.NameComparator;
-import cgeo.geocaching.sorting.PopularityComparator;
-import cgeo.geocaching.sorting.RatingComparator;
-import cgeo.geocaching.sorting.SizeComparator;
-import cgeo.geocaching.sorting.StateComparator;
-import cgeo.geocaching.sorting.StorageTimeComparator;
-import cgeo.geocaching.sorting.TerrainComparator;
import cgeo.geocaching.sorting.VisitComparator;
-import cgeo.geocaching.sorting.VoteComparator;
import cgeo.geocaching.ui.CacheListAdapter;
import cgeo.geocaching.utils.GeoDirHandler;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.RunnableWithArgument;
import ch.boye.httpclientandroidlib.HttpResponse;
+
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -71,10 +60,8 @@ import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
public class cgeocaches extends AbstractListActivity {
@@ -93,17 +80,7 @@ public class cgeocaches extends AbstractListActivity {
private static final int MENU_CREATE_LIST = 7;
private static final int MENU_DROP_LIST = 8;
private static final int MENU_INVERT_SELECTION = 9;
- private static final int MENU_SORT_DISTANCE = 10;
- private static final int MENU_SORT_DIFFICULTY = 11;
- private static final int MENU_SORT_TERRAIN = 12;
- private static final int MENU_SORT_SIZE = 13;
- private static final int MENU_SORT_FAVORITES = 14;
- private static final int MENU_SORT_NAME = 15;
- private static final int MENU_SORT_GEOCODE = 16;
private static final int MENU_SWITCH_LIST = 17;
- private static final int MENU_SORT_RATING = 18;
- private static final int MENU_SORT_VOTE = 19;
- private static final int MENU_SORT_INVENTORY = 20;
private static final int MENU_IMPORT_WEB = 21;
private static final int MENU_EXPORT = 22;
private static final int MENU_REMOVE_FROM_HISTORY = 23;
@@ -113,18 +90,14 @@ public class cgeocaches extends AbstractListActivity {
private static final int SUBMENU_SHOW_MAP = 54;
private static final int SUBMENU_MANAGE_LISTS = 55;
private static final int SUBMENU_MANAGE_OFFLINE = 56;
- private static final int SUBMENU_SORT = 57;
+ private static final int MENU_SORT = 57;
private static final int SUBMENU_MANAGE_HISTORY = 60;
- private static final int MENU_SORT_DATE = 61;
- private static final int MENU_SORT_FINDS = 62;
- private static final int MENU_SORT_STATE = 63;
private static final int MENU_RENAME_LIST = 64;
private static final int MENU_DROP_CACHES_AND_LIST = 65;
private static final int MENU_DEFAULT_NAVIGATION = 66;
private static final int MENU_NAVIGATION = 69;
private static final int MENU_STORE_CACHE = 73;
private static final int MENU_FILTER = 74;
- private static final int MENU_SORT_STORAGE = 75;
private static final int MSG_DONE = -1;
private static final int MSG_RESTART_GEO_AND_DIR = -2;
@@ -133,7 +106,6 @@ public class cgeocaches extends AbstractListActivity {
private String action = null;
private CacheListType type = null;
private Geopoint coords = null;
- private CacheType cacheType = Settings.getCacheType();
private SearchResult search = null;
private final List<cgCache> cacheList = new ArrayList<cgCache>();
private CacheListAdapter adapter = null;
@@ -141,7 +113,6 @@ public class cgeocaches extends AbstractListActivity {
private View listFooter = null;
private TextView listFooterText = null;
private final Progress progress = new Progress();
- private Float northHeading = 0f;
private String title = "";
private int detailTotal = 0;
private int detailProgress = 0;
@@ -151,41 +122,31 @@ public class cgeocaches extends AbstractListActivity {
private int listId = StoredList.TEMPORARY_LIST_ID;
private final GeoDirHandler geoDirHandler = new GeoDirHandler() {
- @Override
+ @Override
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.");
+ if (geo.getCoords() != null) {
+ adapter.setActualCoordinates(geo.getCoords());
+ }
+ if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h
+ adapter.setActualHeading(geo.getBearing());
}
}
- @Override
- public void updateDirection(final float direction) {
- if (!Settings.isLiveList()) {
- return;
- }
+ @Override
+ public void updateDirection(final float direction) {
+ if (adapter == null || !Settings.isLiveList()) {
+ return;
+ }
- northHeading = DirectionProvider.getDirectionNow(cgeocaches.this, direction);
- if (northHeading != null && adapter != null && (app.currentGeo().getSpeed() <= 5)) { // use compass when speed is lower than 18 km/h) {
- adapter.setActualHeading(northHeading);
- }
- }
+ if (app.currentGeo().getSpeed() <= 5) { // use compass when speed is lower than 18 km/h) {
+ final float northHeading = DirectionProvider.getDirectionNow(cgeocaches.this, direction);
+ adapter.setActualHeading(northHeading);
+ }
+ }
};
private ContextMenuInfo lastMenuInfo;
@@ -248,11 +209,7 @@ public class cgeocaches extends AbstractListActivity {
return;
}
- final Geopoint coordsNow = app.currentGeo().getCoords();
- if (coordsNow != null) {
- adapter.setActualCoordinates(coordsNow);
- adapter.setActualHeading(northHeading);
- }
+ setAdapterCurrentCoordinates(false);
} catch (Exception e) {
showToast(res.getString(R.string.err_detail_cache_find_any));
Log.e("cgeocaches.loadCachesHandler: " + e.toString());
@@ -307,11 +264,7 @@ public class cgeocaches extends AbstractListActivity {
return;
}
- final Geopoint coordsNow = app.currentGeo().getCoords();
- if (coordsNow != null) {
- adapter.setActualCoordinates(coordsNow);
- adapter.setActualHeading(northHeading);
- }
+ setAdapterCurrentCoordinates(false);
} catch (Exception e) {
showToast(res.getString(R.string.err_detail_cache_find_next));
Log.e("cgeocaches.loadNextPageHandler: " + e.toString());
@@ -364,11 +317,7 @@ public class cgeocaches extends AbstractListActivity {
}
}
- final Geopoint coordsNow = app.currentGeo().getCoords();
- if (coordsNow != null) {
- adapter.setActualCoordinates(coordsNow);
- adapter.setActualHeading(northHeading);
- }
+ setAdapterCurrentCoordinates(false);
showProgress(false);
progress.dismiss();
@@ -487,7 +436,6 @@ public class cgeocaches extends AbstractListActivity {
else {
extras = new Bundle();
}
- cacheType = Settings.getCacheType();
if (isInvokedFromAttachment()) {
type = CacheListType.OFFLINE;
if (coords == null) {
@@ -663,12 +611,7 @@ public class cgeocaches extends AbstractListActivity {
if (adapter != null) {
adapter.setSelectMode(false);
- final Geopoint coordsNow = app.currentGeo().getCoords();
- if (coordsNow != null) {
- adapter.setActualCoordinates(coordsNow);
- adapter.setActualHeading(northHeading);
- adapter.forceSort();
- }
+ setAdapterCurrentCoordinates(true);
}
if (loadCachesHandler != null && search != null) {
@@ -677,13 +620,23 @@ public class cgeocaches extends AbstractListActivity {
// refresh standard list if it has changed (new caches downloaded)
if (type == CacheListType.OFFLINE && listId >= StoredList.STANDARD_LIST_ID && search != null) {
- SearchResult newSearch = cgeoapplication.getInstance().getBatchOfStoredCaches(true, coords, cacheType, listId);
+ SearchResult newSearch = cgeoapplication.getInstance().getBatchOfStoredCaches(true, coords, Settings.getCacheType(), listId);
if (newSearch != null && newSearch.getTotal() != search.getTotal()) {
refreshCurrentList();
}
}
}
+ private void setAdapterCurrentCoordinates(final boolean forceSort) {
+ final Geopoint coordsNow = app.currentGeo().getCoords();
+ if (coordsNow != null) {
+ adapter.setActualCoordinates(coordsNow);
+ if (forceSort) {
+ adapter.forceSort();
+ }
+ }
+ }
+
@Override
public void onDestroy() {
if (adapter != null) {
@@ -705,34 +658,7 @@ public class cgeocaches extends AbstractListActivity {
menu.add(0, MENU_FILTER, 0, res.getString(R.string.caches_filter)).setIcon(R.drawable.ic_menu_filter);
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_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically);
}
menu.add(0, MENU_SWITCH_SELECT_MODE, 0, res.getString(R.string.caches_select_mode)).setIcon(R.drawable.ic_menu_agenda);
@@ -797,7 +723,7 @@ public class cgeocaches extends AbstractListActivity {
MENU_SWITCH_SELECT_MODE,
SUBMENU_MANAGE_HISTORY,
SUBMENU_SHOW_MAP,
- SUBMENU_SORT,
+ MENU_SORT,
MENU_REFRESH_STORED,
MENU_DROP_CACHES,
MENU_DROP_CACHES_AND_LIST,
@@ -916,52 +842,10 @@ public class cgeocaches extends AbstractListActivity {
}
invalidateOptionsMenuCompatible();
return false;
- case MENU_SORT_DISTANCE:
- setComparator(item, null);
- return false;
- case MENU_SORT_DIFFICULTY:
- setComparator(item, new DifficultyComparator());
- return false;
- case MENU_SORT_TERRAIN:
- setComparator(item, new TerrainComparator());
- return false;
- case MENU_SORT_SIZE:
- setComparator(item, new SizeComparator());
- return false;
- case MENU_SORT_FAVORITES:
- setComparator(item, new PopularityComparator());
- return false;
- case MENU_SORT_NAME:
- setComparator(item, new NameComparator());
- return false;
- case MENU_SORT_GEOCODE:
- setComparator(item, new GeocodeComparator());
- return false;
- case MENU_SORT_STORAGE:
- setComparator(item, new StorageTimeComparator());
- return false;
case MENU_SWITCH_LIST:
selectList(null);
invalidateOptionsMenuCompatible();
return false;
- case MENU_SORT_RATING:
- setComparator(item, new RatingComparator());
- return false;
- case MENU_SORT_VOTE:
- setComparator(item, new VoteComparator());
- return false;
- case MENU_SORT_INVENTORY:
- setComparator(item, new InventoryComparator());
- return false;
- case MENU_SORT_DATE:
- setComparator(item, new DateComparator());
- return true;
- case MENU_SORT_FINDS:
- setComparator(item, new FindsComparator(app));
- return true;
- case MENU_SORT_STATE:
- setComparator(item, new StateComparator());
- return true;
case MENU_FILTER:
new FilterUserInterface(this).selectFilter(new RunnableWithArgument<IFilter>() {
@Override
@@ -978,6 +862,14 @@ public class cgeocaches extends AbstractListActivity {
}
});
return true;
+ case MENU_SORT:
+ new ComparatorUserInterface(this).selectComparator(adapter.getCacheComparator(), new RunnableWithArgument<CacheComparator>() {
+ @Override
+ public void run(CacheComparator selectedComparator) {
+ setComparator(selectedComparator);
+ }
+ });
+ return true;
case MENU_IMPORT_WEB:
importWeb();
return false;
@@ -997,12 +889,10 @@ public class cgeocaches extends AbstractListActivity {
return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, search);
}
- private void setComparator(MenuItem item,
- CacheComparator comparator) {
+ private void setComparator(final CacheComparator comparator) {
if (adapter != null) {
adapter.setComparator(comparator);
}
- item.setChecked(true);
}
@Override
@@ -1414,7 +1304,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void runSearch() {
- search = GCParser.searchByCoords(coords, cacheType, Settings.isShowCaptcha());
+ search = GCParser.searchByCoords(coords, Settings.getCacheType(), Settings.isShowCaptcha());
}
}
@@ -1428,7 +1318,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void runSearch() {
- search = GCParser.searchByKeyword(keyword, cacheType, Settings.isShowCaptcha());
+ search = GCParser.searchByKeyword(keyword, Settings.getCacheType(), Settings.isShowCaptcha());
}
}
@@ -1442,7 +1332,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void runSearch() {
- search = GCParser.searchByUsername(username, cacheType, Settings.isShowCaptcha());
+ search = GCParser.searchByUsername(username, Settings.getCacheType(), Settings.isShowCaptcha());
}
}
@@ -1456,7 +1346,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void runSearch() {
- search = GCParser.searchByOwner(username, cacheType, Settings.isShowCaptcha());
+ search = GCParser.searchByOwner(username, Settings.getCacheType(), Settings.isShowCaptcha());
}
}
diff --git a/main/src/cgeo/geocaching/compatibility/Compatibility.java b/main/src/cgeo/geocaching/compatibility/Compatibility.java
index d869c58..0821655 100644
--- a/main/src/cgeo/geocaching/compatibility/Compatibility.java
+++ b/main/src/cgeo/geocaching/compatibility/Compatibility.java
@@ -1,6 +1,7 @@
package cgeo.geocaching.compatibility;
import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.utils.AngleUtils;
import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.reflect.MethodUtils;
@@ -40,23 +41,22 @@ public final class Compatibility {
/**
* Add 90, 180 or 270 degrees to the given rotation.
- * <br/>
- * Note: the result is not normalized and may fall outside your desired range.
*
* @param directionNowPre the direction in degrees before adjustment
* @param activity the activity whose rotation is used to adjust the direction
- * @return the adjusted direction
+ * @return the adjusted direction, in the [0, 360[ range
*/
public static float getDirectionNow(final float directionNowPre, final Activity activity) {
+ float offset = 0;
if (isLevel8) {
try {
final int rotation = level8.getRotation(activity);
if (rotation == Surface.ROTATION_90) {
- return directionNowPre + 90;
+ offset = 90;
} else if (rotation == Surface.ROTATION_180) {
- return directionNowPre + 180;
+ offset = 180;
} else if (rotation == Surface.ROTATION_270) {
- return directionNowPre + 270;
+ offset = 270;
}
} catch (final Exception e) {
// This should never happen: IllegalArgumentException, IllegalAccessException or InvocationTargetException
@@ -66,10 +66,10 @@ public final class Compatibility {
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getOrientation();
if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
- return directionNowPre + 90;
+ offset = 90;
}
}
- return directionNowPre;
+ return AngleUtils.normalize(directionNowPre + offset);
}
public static void dataChanged(final String name) {
diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java
index 002511a..230bc91 100644
--- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java
+++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java
@@ -3,7 +3,6 @@ package cgeo.geocaching.filter;
import cgeo.geocaching.R;
import cgeo.geocaching.Settings;
import cgeo.geocaching.cgeoapplication;
-import cgeo.geocaching.activity.IAbstractActivity;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.RunnableWithArgument;
@@ -35,11 +34,11 @@ public final class FilterUserInterface {
}
}
- private final IAbstractActivity activity;
+ private final Activity activity;
private final ArrayList<FactoryEntry> registry;
private final Resources res;
- public FilterUserInterface(final IAbstractActivity activity) {
+ public FilterUserInterface(final Activity activity) {
this.activity = activity;
this.res = cgeoapplication.getInstance().getResources();
@@ -73,10 +72,10 @@ public final class FilterUserInterface {
}
public void selectFilter(final RunnableWithArgument<IFilter> runAfterwards) {
- final AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity);
+ final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.caches_filter);
- final ArrayAdapter<FactoryEntry> adapter = new ArrayAdapter<FactoryEntry>((Activity) activity, android.R.layout.select_dialog_item, registry);
+ final ArrayAdapter<FactoryEntry> adapter = new ArrayAdapter<FactoryEntry>(activity, android.R.layout.select_dialog_item, registry);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
@@ -107,10 +106,10 @@ public final class FilterUserInterface {
return;
}
- final AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity);
+ final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(menuTitle);
- final ArrayAdapter<IFilter> adapter = new ArrayAdapter<IFilter>((Activity) activity, android.R.layout.select_dialog_item, filters);
+ final ArrayAdapter<IFilter> adapter = new ArrayAdapter<IFilter>(activity, android.R.layout.select_dialog_item, filters);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index 2f99dd5..0fcdb6f 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -83,6 +83,19 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
/** max. number of caches displayed in the Live Map */
public static final int MAX_CACHES = 500;
+ /**Controls the behaviour of the map*/
+ public enum MapMode {
+ /** Live Map where caches are loaded from online */
+ LIVE_ONLINE,
+ /** Live Map where caches are loaded only from database */
+ LIVE_OFFLINE,
+ /** Map around some coordinates */
+ COORDS,
+ /** Map with a single cache (no reload on move) */
+ SINGLE,
+ /** Map with a list of caches (no reload on move) */
+ LIST
+ }
/** Handler Messages */
private static final int HIDE_PROGRESS = 0;
private static final int SHOW_PROGRESS = 1;
@@ -97,6 +110,8 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
private static final String EXTRAS_WPTTYPE = "wpttype";
private static final String EXTRAS_MAPSTATE = "mapstate";
private static final String EXTRAS_SEARCH = "search";
+ private static final String EXTRAS_MAP_MODE = "map_mode";
+
private static final int MENU_SELECT_MAPVIEW = 1;
private static final int MENU_MAP_LIVE = 2;
private static final int MENU_STORE_CACHES = 3;
@@ -171,8 +186,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
private long detailProgressTime = 0L;
// views
private ImageSwitcher myLocSwitch = null;
+
+ /**Controls the map behaviour*/
+ private MapMode mapMode = null;
// other things
- private boolean live = true; // live map (live, dead) or rest (displaying caches on map)
+ // private boolean live = true; // live map (live, dead) or rest (displaying caches on map)
private boolean liveChanged = false; // previous state for loadTimer
private boolean centered = false; // if map is already centered
private boolean alreadyCentered = false; // -""- for setting my location
@@ -203,7 +221,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// set title
final StringBuilder title = new StringBuilder();
- if (live) {
+ if (mapMode == MapMode.LIVE_ONLINE) {
title.append(res.getString(R.string.map_live));
} else {
title.append(mapTitle);
@@ -361,6 +379,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// Get parameters from the intent
final Bundle extras = activity.getIntent().getExtras();
if (extras != null) {
+ mapMode = (MapMode) extras.get(EXTRAS_MAP_MODE);
searchIntent = (SearchResult) extras.getParcelable(EXTRAS_SEARCH);
geocodeIntent = extras.getString(EXTRAS_GEOCODE);
coordsIntent = (Geopoint) extras.getParcelable(EXTRAS_COORDS);
@@ -368,6 +387,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
mapStateIntent = extras.getIntArray(EXTRAS_MAPSTATE);
mapTitle = extras.getString(EXTRAS_MAP_TITLE);
}
+ else {
+ mapMode = Settings.isLiveMap() ? MapMode.LIVE_ONLINE : MapMode.LIVE_OFFLINE;
+ }
if (StringUtils.isBlank(mapTitle)) {
mapTitle = res.getString(R.string.map_map);
}
@@ -426,11 +448,8 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
mapView.getMapController().setZoom(Settings.getMapZoom());
- // live map, if no arguments are given
- live = (searchIntent == null && geocodeIntent == null && coordsIntent == null);
-
if (null == mapStateIntent) {
- followMyLocation = live;
+ followMyLocation = mapMode == MapMode.LIVE_OFFLINE || mapMode == MapMode.LIVE_ONLINE;
} else {
followMyLocation = 1 == mapStateIntent[3];
if ((overlayCaches.getCircles() ? 1 : 0) != mapStateIntent[4]) {
@@ -575,18 +594,16 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
item = menu.findItem(MENU_MAP_LIVE); // live map
- if (live) {
- if (Settings.isLiveMap()) {
- item.setTitle(res.getString(R.string.map_live_disable));
- } else {
- item.setTitle(res.getString(R.string.map_live_enable));
- }
+ if (mapMode == MapMode.LIVE_ONLINE) {
+ item.setTitle(res.getString(R.string.map_live_disable));
+ } else if (mapMode == MapMode.LIVE_OFFLINE) {
+ item.setTitle(res.getString(R.string.map_live_enable));
} else {
item.setEnabled(false);
item.setTitle(res.getString(R.string.map_live_enable));
}
- menu.findItem(MENU_STORE_CACHES).setEnabled(live && !isLoading() && CollectionUtils.isNotEmpty(caches) && app.hasUnsavedCaches(search));
+ menu.findItem(MENU_STORE_CACHES).setEnabled(isLiveMode() && !isLoading() && CollectionUtils.isNotEmpty(caches) && app.hasUnsavedCaches(search));
item = menu.findItem(MENU_CIRCLE_MODE); // show circles
if (overlayCaches != null && overlayCaches.getCircles()) {
@@ -596,9 +613,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
item = menu.findItem(MENU_AS_LIST);
- item.setEnabled(live && CollectionUtils.isNotEmpty(caches));
+ item.setEnabled(isLiveMode() && CollectionUtils.isNotEmpty(caches));
- menu.findItem(SUBMENU_STRATEGY).setEnabled(live);
+ menu.findItem(SUBMENU_STRATEGY).setEnabled(isLiveMode());
} catch (Exception e) {
Log.e("cgeomap.onPrepareOptionsMenu: " + e.toString());
}
@@ -606,6 +623,10 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
return true;
}
+ private boolean isLiveMode() {
+ return mapMode == MapMode.LIVE_OFFLINE || mapMode == MapMode.LIVE_ONLINE;
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int id = item.getItemId();
@@ -616,13 +637,14 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
return true;
case MENU_MAP_LIVE:
Settings.setLiveMap(!Settings.isLiveMap());
+ mapMode = Settings.isLiveMap() ? MapMode.LIVE_ONLINE : MapMode.LIVE_OFFLINE;
liveChanged = true;
search = null;
searchIntent = null;
ActivityMixin.invalidateOptionsMenu(activity);
return true;
case MENU_STORE_CACHES:
- if (live && !isLoading() && CollectionUtils.isNotEmpty(caches)) {
+ if (isLiveMode() && !isLoading() && CollectionUtils.isNotEmpty(caches)) {
final List<String> geocodes = new ArrayList<String>();
final List<cgCache> cachesProtected = caches.getAsList();
@@ -786,6 +808,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
mapIntent.putExtra(EXTRAS_WPTTYPE, waypointTypeIntent != null ? waypointTypeIntent.id : null);
mapIntent.putExtra(EXTRAS_MAP_TITLE, mapTitle);
+ mapIntent.putExtra(EXTRAS_MAP_MODE, mapMode);
final int[] mapState = currentMapState();
if (mapState != null) {
@@ -941,7 +964,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
if (liveChanged) {
moved = true;
- } else if (live && Settings.isLiveMap() && !downloaded) {
+ } else if (mapMode == MapMode.LIVE_ONLINE && !downloaded) {
moved = true;
} else if (viewport == null) {
moved = true;
@@ -1052,23 +1075,15 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
@Override
public void run() {
- /**
- * True if we are currently showing the live map or a single points through coordsIntent.
- */
- final boolean isLiveMapOrCoords = searchIntent == null && geocodeIntent == null;
-
try {
showProgressHandler.sendEmptyMessage(SHOW_PROGRESS);
loadThreadRun = System.currentTimeMillis();
// stage 1 - pull and render from the DB only for live map
- if (isLiveMapOrCoords) {
- // live map
- if (!live || !Settings.isLiveMap()) {
+ if (mapMode == MapMode.LIVE_ONLINE) {
search = new SearchResult(app.getStoredInViewport(viewport, Settings.getCacheType()));
- } else {
+ } else if (mapMode == MapMode.LIVE_OFFLINE) {
search = new SearchResult(app.getCachedInViewport(viewport, Settings.getCacheType()));
- }
} else {
// map started from another activity
search = new SearchResult(searchIntent);
@@ -1083,7 +1098,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
caches.addAll(cachesFromSearchResult);
}
- if (live) {
+ if (isLiveMode()) {
final boolean excludeMine = Settings.isExcludeMyCaches();
final boolean excludeDisabled = Settings.isExcludeDisabledCaches();
@@ -1098,7 +1113,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
countVisibleCaches();
if (cachesCnt < Settings.getWayPointsThreshold() || geocodeIntent != null) {
waypoints.clear();
- if (isLiveMapOrCoords) {
+ if (isLiveMode() || mapMode == MapMode.COORDS) {
//All visible waypoints
waypoints.addAll(app.getWaypointsInViewport(viewport, Settings.isExcludeMyCaches(), Settings.isExcludeDisabledCaches()));
} else {
@@ -1112,7 +1127,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
//render
displayExecutor.execute(new DisplayRunnable(viewport));
- if (live && Settings.isLiveMap()) {
+ if (mapMode == MapMode.LIVE_ONLINE) {
downloadExecutor.execute(new DownloadRunnable(viewport));
}
} finally {
@@ -1205,7 +1220,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
if (!cachesToDisplay.isEmpty()) {
// Only show waypoints for single view or setting
// when less than showWaypointsthreshold Caches shown
- if (cachesToDisplay.size() == 1 || (cachesCnt < Settings.getWayPointsThreshold())) {
+ if (mapMode == MapMode.SINGLE || (cachesCnt < Settings.getWayPointsThreshold())) {
for (cgWaypoint waypoint : waypointsToDisplay) {
if (waypoint.getCoords() == null) {
@@ -1570,6 +1585,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
public static void startActivitySearch(final Activity fromActivity, final SearchResult search, final String title) {
final Intent mapIntent = newIntent(fromActivity);
mapIntent.putExtra(EXTRAS_SEARCH, search);
+ mapIntent.putExtra(EXTRAS_MAP_MODE, MapMode.LIST);
if (StringUtils.isNotBlank(title)) {
mapIntent.putExtra(CGeoMap.EXTRAS_MAP_TITLE, title);
}
@@ -1577,11 +1593,14 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
public static void startActivityLiveMap(final Activity fromActivity) {
- fromActivity.startActivity(newIntent(fromActivity));
+ final Intent mapIntent = newIntent(fromActivity);
+ mapIntent.putExtra(EXTRAS_MAP_MODE, Settings.isLiveMap() ? MapMode.LIVE_ONLINE : MapMode.LIVE_OFFLINE);
+ fromActivity.startActivity(mapIntent);
}
public static void startActivityCoords(final Activity fromActivity, final Geopoint coords, final WaypointType type, final String title) {
final Intent mapIntent = newIntent(fromActivity);
+ mapIntent.putExtra(EXTRAS_MAP_MODE, MapMode.COORDS);
mapIntent.putExtra(EXTRAS_COORDS, coords);
if (type != null) {
mapIntent.putExtra(EXTRAS_WPTTYPE, type.id);
@@ -1594,6 +1613,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
public static void startActivityGeoCode(final Activity fromActivity, final String geocode) {
final Intent mapIntent = newIntent(fromActivity);
+ mapIntent.putExtra(EXTRAS_MAP_MODE, MapMode.SINGLE);
mapIntent.putExtra(EXTRAS_GEOCODE, geocode);
mapIntent.putExtra(EXTRAS_MAP_TITLE, geocode);
fromActivity.startActivity(mapIntent);
diff --git a/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java
new file mode 100644
index 0000000..247bb3b
--- /dev/null
+++ b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java
@@ -0,0 +1,117 @@
+package cgeo.geocaching.sorting;
+
+import cgeo.geocaching.R;
+import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RunnableWithArgument;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.res.Resources;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+public class ComparatorUserInterface {
+ private final Activity activity;
+ private final ArrayList<ComparatorEntry> registry;
+ private final Resources res;
+
+ private static final class ComparatorEntry {
+ private final String name;
+ private final Class<? extends CacheComparator> cacheComparator;
+
+ public ComparatorEntry(final String name, final Class<? extends CacheComparator> cacheComparator) {
+ this.name = name;
+ this.cacheComparator = cacheComparator;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+
+ public ComparatorUserInterface(final Activity activity) {
+ this.activity = activity;
+ res = activity.getResources();
+
+ registry = new ArrayList<ComparatorUserInterface.ComparatorEntry>(20);
+
+ register(R.string.caches_sort_distance, null);
+ register(R.string.caches_sort_difficulty, DifficultyComparator.class);
+ register(R.string.caches_sort_terrain, TerrainComparator.class);
+ register(R.string.caches_sort_size, SizeComparator.class);
+ register(R.string.caches_sort_favorites, PopularityComparator.class);
+ register(R.string.caches_sort_name, NameComparator.class);
+ register(R.string.caches_sort_gccode, GeocodeComparator.class);
+ register(R.string.caches_sort_rating, RatingComparator.class);
+ register(R.string.caches_sort_vote, VoteComparator.class);
+ register(R.string.caches_sort_inventory, InventoryComparator.class);
+ register(R.string.caches_sort_date, DateComparator.class);
+ register(R.string.caches_sort_finds, FindsComparator.class);
+ register(R.string.caches_sort_state, StateComparator.class);
+ register(R.string.caches_sort_storage, StorageTimeComparator.class);
+
+ // sort the menu labels alphabetically for easier reading
+ Collections.sort(registry, new Comparator<ComparatorEntry>() {
+
+ @Override
+ public int compare(ComparatorEntry lhs, ComparatorEntry rhs) {
+ return lhs.name.compareToIgnoreCase(rhs.name);
+ }
+ });
+ }
+
+ private void register(final int resourceId, Class<? extends CacheComparator> comparatorClass) {
+ registry.add(new ComparatorEntry(res.getString(resourceId), comparatorClass));
+ }
+
+ public void selectComparator(final CacheComparator current, final RunnableWithArgument<CacheComparator> runAfterwards) {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setTitle(R.string.caches_sort_title);
+
+ // adapter doesn't work correctly here, therefore using the string array based method
+ final String[] items = new String[registry.size()];
+ for (int i = 0; i < items.length; i++) {
+ items[i] = registry.get(i).name;
+ }
+ builder.setSingleChoiceItems(items, getCurrentIndex(current), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int itemIndex) {
+ ComparatorEntry entry = registry.get(itemIndex);
+ try {
+ if (entry.cacheComparator == null) {
+ runAfterwards.run(null);
+ }
+ else {
+ CacheComparator comparator = entry.cacheComparator.newInstance();
+ runAfterwards.run(comparator);
+ }
+ } catch (Exception e) {
+ Log.e("selectComparator", e);
+ }
+ dialog.dismiss();
+ }
+ });
+
+ builder.create().show();
+ }
+
+ private int getCurrentIndex(final CacheComparator current) {
+ for (int index = 0; index < registry.size(); index++) {
+ final ComparatorEntry entry = registry.get(index);
+ if (current == null) {
+ if (entry.cacheComparator == null) {
+ return index;
+ }
+ }
+ else if (current.getClass().equals(entry.cacheComparator)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/sorting/DateComparator.java b/main/src/cgeo/geocaching/sorting/DateComparator.java
index 7129905..3136d47 100644
--- a/main/src/cgeo/geocaching/sorting/DateComparator.java
+++ b/main/src/cgeo/geocaching/sorting/DateComparator.java
@@ -1,7 +1,9 @@
package cgeo.geocaching.sorting;
import cgeo.geocaching.cgCache;
+import cgeo.geocaching.cgeoapplication;
+import java.util.ArrayList;
import java.util.Date;
/**
@@ -16,10 +18,19 @@ public class DateComparator extends AbstractCacheComparator {
@Override
protected int compareCaches(cgCache cache1, cgCache cache2) {
- Date date1 = cache1.getHiddenDate();
- Date date2 = cache2.getHiddenDate();
+ final Date date1 = cache1.getHiddenDate();
+ final Date date2 = cache2.getHiddenDate();
if (date1 != null && date2 != null) {
- return date1.compareTo(date2);
+ final int dateDifference = date1.compareTo(date2);
+ // for equal dates, sort by distance
+ if (dateDifference == 0) {
+ final ArrayList<cgCache> list = new ArrayList<cgCache>();
+ list.add(cache1);
+ list.add(cache2);
+ final DistanceComparator distanceComparator = new DistanceComparator(cgeoapplication.getInstance().currentGeo().getCoords(), list);
+ return distanceComparator.compare(cache1, cache2);
+ }
+ return dateDifference;
}
if (date1 != null) {
return -1;
diff --git a/main/src/cgeo/geocaching/sorting/FindsComparator.java b/main/src/cgeo/geocaching/sorting/FindsComparator.java
index ad72ea3..6407b11 100644
--- a/main/src/cgeo/geocaching/sorting/FindsComparator.java
+++ b/main/src/cgeo/geocaching/sorting/FindsComparator.java
@@ -6,11 +6,7 @@ import cgeo.geocaching.enumerations.LogType;
public class FindsComparator extends AbstractCacheComparator {
- private cgeoapplication app;
-
- public FindsComparator(cgeoapplication app) {
- this.app = app;
- }
+ private final cgeoapplication app = cgeoapplication.getInstance();
@Override
protected boolean canCompare(cgCache cache1, cgCache cache2) {
@@ -25,15 +21,14 @@ public class FindsComparator extends AbstractCacheComparator {
}
private int getFindsCount(cgCache cache) {
- int finds = 0;
if (cache.getLogCounts().isEmpty()) {
cache.setLogCounts(app.loadLogCounts(cache.getGeocode()));
}
Integer logged = cache.getLogCounts().get(LogType.FOUND_IT);
if (logged != null) {
- finds = logged;
+ return logged;
}
- return finds;
+ return 0;
}
}
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index bcfdde7..c6d3404 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -14,6 +14,7 @@ import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.sorting.CacheComparator;
import cgeo.geocaching.sorting.DistanceComparator;
import cgeo.geocaching.sorting.VisitComparator;
+import cgeo.geocaching.utils.AngleUtils;
import cgeo.geocaching.utils.Log;
import org.apache.commons.collections.CollectionUtils;
@@ -263,19 +264,15 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
notifyDataSetChanged();
}
- public void setActualCoordinates(final Geopoint coordsIn) {
- if (coordsIn == null) {
- return;
- }
-
- coords = coordsIn;
+ public void setActualCoordinates(final Geopoint coords) {
+ this.coords = coords;
updateSortByDistance();
for (final DistanceView distance : distances) {
- distance.update(coordsIn);
+ distance.update(coords);
}
for (final CompassMiniView compass : compasses) {
- compass.updateCurrentCoords(coordsIn);
+ compass.updateCurrentCoords(coords);
}
}
@@ -304,13 +301,12 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
return cacheComparator == null || cacheComparator instanceof DistanceComparator;
}
- public void setActualHeading(Float directionNow) {
- if (directionNow == null) {
+ public void setActualHeading(final float direction) {
+ if (Math.abs(AngleUtils.difference(azimuth, direction)) < 10) {
return;
}
- azimuth = directionNow;
-
+ azimuth = direction;
for (final CompassMiniView compass : compasses) {
compass.updateAzimuth(azimuth);
}
diff --git a/main/src/cgeo/geocaching/ui/CompassMiniView.java b/main/src/cgeo/geocaching/ui/CompassMiniView.java
index 1c96a09..44fb8e2 100644
--- a/main/src/cgeo/geocaching/ui/CompassMiniView.java
+++ b/main/src/cgeo/geocaching/ui/CompassMiniView.java
@@ -3,6 +3,7 @@ package cgeo.geocaching.ui;
import cgeo.geocaching.R;
import cgeo.geocaching.Settings;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.utils.AngleUtils;
import android.content.Context;
import android.graphics.Bitmap;
@@ -159,7 +160,7 @@ final public class CompassMiniView extends View {
}
private float calculateAzimuthRelative() {
- return (azimuth - heading + 360) % 360;
+ return AngleUtils.normalize(azimuth - heading);
}
@Override
diff --git a/main/src/cgeo/geocaching/ui/CompassView.java b/main/src/cgeo/geocaching/ui/CompassView.java
index 703f96f..b328527 100644
--- a/main/src/cgeo/geocaching/ui/CompassView.java
+++ b/main/src/cgeo/geocaching/ui/CompassView.java
@@ -1,7 +1,7 @@
package cgeo.geocaching.ui;
-import cgeo.geocaching.DirectionProvider;
import cgeo.geocaching.R;
+import cgeo.geocaching.utils.AngleUtils;
import cgeo.geocaching.utils.PeriodicHandler;
import android.content.Context;
@@ -23,19 +23,19 @@ public class CompassView extends View {
/**
* North direction currently SHOWN on compass (not measured)
*/
- private double azimuthShown = 0.0;
+ private float azimuthShown = 0;
/**
* cache direction currently SHOWN on compass (not measured)
*/
- private double cacheHeadingShown = 0.0;
+ private float cacheHeadingShown = 0;
/**
* cache direction measured from device, or 0.0
*/
- private double cacheHeadingMeasured = 0.0;
+ private float cacheHeadingMeasured = 0;
/**
* North direction measured from device, or 0.0
*/
- private double northMeasured = 0.0;
+ private float northMeasured = 0;
private PaintFlagsDrawFilter setfil = null;
private PaintFlagsDrawFilter remfil = null;
private int compassUnderlayWidth = 0;
@@ -103,7 +103,7 @@ public class CompassView extends View {
}
}
- public synchronized void updateNorth(double northHeadingIn, double cacheHeadingIn) {
+ public synchronized void updateNorth(float northHeadingIn, float cacheHeadingIn) {
if (initialDisplay) {
// We will force the compass to move brutally if this is the first
// update since it is visible.
@@ -128,20 +128,20 @@ public class CompassView extends View {
* the actual value
* @return the new value
*/
- static protected double smoothUpdate(double goal, double actual) {
- final double diff = DirectionProvider.difference(actual, goal);
+ static protected float smoothUpdate(float goal, float actual) {
+ final float diff = AngleUtils.difference(actual, goal);
- double offset = 0.0;
+ float offset = 0;
// If the difference is smaller than 1 degree, do nothing as it
// causes the arrow to vibrate. Round away from 0.
if (diff > 1.0) {
- offset = Math.ceil(diff / 10.0); // for larger angles, rotate faster
+ offset = (float) Math.ceil(diff / 10.0); // for larger angles, rotate faster
} else if (diff < 1.0) {
- offset = Math.floor(diff / 10.0);
+ offset = (float) Math.floor(diff / 10.0);
}
- return (actual + offset + 360) % 360;
+ return AngleUtils.normalize(actual + offset);
}
private class RedrawHandler extends PeriodicHandler {
@@ -152,10 +152,10 @@ public class CompassView extends View {
@Override
public void act() {
- final double newAzimuthShown = smoothUpdate(northMeasured, azimuthShown);
- final double newCacheHeadingShown = smoothUpdate(cacheHeadingMeasured, cacheHeadingShown);
- if (Math.abs(DirectionProvider.difference(azimuthShown, newAzimuthShown)) >= 2 ||
- Math.abs(DirectionProvider.difference(cacheHeadingShown, newCacheHeadingShown)) >= 2) {
+ final float newAzimuthShown = smoothUpdate(northMeasured, azimuthShown);
+ final float newCacheHeadingShown = smoothUpdate(cacheHeadingMeasured, cacheHeadingShown);
+ if (Math.abs(AngleUtils.difference(azimuthShown, newAzimuthShown)) >= 2 ||
+ Math.abs(AngleUtils.difference(cacheHeadingShown, newCacheHeadingShown)) >= 2) {
synchronized(CompassView.this) {
azimuthShown = newAzimuthShown;
cacheHeadingShown = newCacheHeadingShown;
@@ -169,16 +169,16 @@ public class CompassView extends View {
@Override
protected void onDraw(Canvas canvas) {
// use local synchronized variables to avoid them being changed from the device during drawing
- double azimuthDrawn;
- double headingDrawn;
+ float azimuthDrawn;
+ float headingDrawn;
synchronized (this) {
azimuthDrawn = azimuthShown;
headingDrawn = cacheHeadingShown;
}
- double azimuthTemp = azimuthDrawn;
- final double azimuthRelative = (azimuthTemp - headingDrawn + 360) % 360;
+ float azimuthTemp = azimuthDrawn;
+ final float azimuthRelative = AngleUtils.normalize(azimuthTemp - headingDrawn);
// compass margins
int canvasCenterX = (compassRoseWidth / 2) + ((getWidth() - compassRoseWidth) / 2);
diff --git a/main/src/cgeo/geocaching/ui/Formatter.java b/main/src/cgeo/geocaching/ui/Formatter.java
index 6ee1a65..33793c1 100644
--- a/main/src/cgeo/geocaching/ui/Formatter.java
+++ b/main/src/cgeo/geocaching/ui/Formatter.java
@@ -1,5 +1,6 @@
package cgeo.geocaching.ui;
+import cgeo.geocaching.R;
import cgeo.geocaching.cgeoapplication;
import android.content.Context;
@@ -64,9 +65,29 @@ public abstract class Formatter {
}
/**
+ * Generate a numeric date string according to system-wide settings (locale, date format)
+ * such as "10/20/2010". Today and yesterday will be presented as strings "today" and "yesterday".
+ *
+ * @param date
+ * milliseconds since the epoch
+ * @return the formatted string
+ */
+ public static String formatShortDateVerbally(long date) {
+ int diff = cgeo.geocaching.utils.DateUtils.daysSince(date);
+ switch (diff) {
+ case 0:
+ return cgeoapplication.getInstance().getString(R.string.log_today);
+ case 1:
+ return cgeoapplication.getInstance().getString(R.string.log_yesterday);
+ default:
+ return formatShortDate(date);
+ }
+ }
+
+ /**
* Generate a numeric date and time string according to system-wide settings (locale,
* date format) such as "7 sept. at 12:35".
- *
+ *
* @param context
* a Context
* @param date
diff --git a/main/src/cgeo/geocaching/utils/AngleUtils.java b/main/src/cgeo/geocaching/utils/AngleUtils.java
new file mode 100644
index 0000000..e2b4a66
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/AngleUtils.java
@@ -0,0 +1,28 @@
+package cgeo.geocaching.utils;
+
+public class AngleUtils {
+
+ private AngleUtils() {
+ // Do not instantiate
+ }
+
+ /**
+ * Return the angle to turn of to go from an angle to the other
+ *
+ * @param from the origin angle in degrees
+ * @param to the target angle in degreees
+ * @return a value in degrees, in the [-180, 180[ range
+ */
+ public static float difference(final float from, final float to) {
+ return normalize(to - from + 180) - 180;
+ }
+
+ /**
+ * Normalize an angle so that it belongs to the [0, 360[ range.
+ * @param angle the angle in degrees
+ * @return the same angle in the [0, 360[ range
+ */
+ public static float normalize(final float angle) {
+ return (angle >= 0 ? angle : (360 - ((-angle) % 360))) % 360;
+ }
+}
diff --git a/main/src/cgeo/geocaching/utils/DateUtils.java b/main/src/cgeo/geocaching/utils/DateUtils.java
new file mode 100644
index 0000000..3004bdb
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/DateUtils.java
@@ -0,0 +1,18 @@
+package cgeo.geocaching.utils;
+
+import java.util.Calendar;
+
+public class DateUtils {
+ public static int daysSince(long date) {
+ final Calendar logDate = Calendar.getInstance();
+ logDate.setTimeInMillis(date);
+ logDate.set(Calendar.SECOND, 0);
+ logDate.set(Calendar.MINUTE, 0);
+ logDate.set(Calendar.HOUR, 0);
+ final Calendar today = Calendar.getInstance();
+ today.set(Calendar.SECOND, 0);
+ today.set(Calendar.MINUTE, 0);
+ today.set(Calendar.HOUR, 0);
+ return (int) Math.round((today.getTimeInMillis() - logDate.getTimeInMillis()) / 86400000d);
+ }
+}