aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java6
-rw-r--r--main/src/cgeo/geocaching/CacheListAdapter.java6
-rw-r--r--main/src/cgeo/geocaching/cgBase.java11
-rw-r--r--main/src/cgeo/geocaching/cgCache.java5
-rw-r--r--main/src/cgeo/geocaching/cgData.java30
-rw-r--r--main/src/cgeo/geocaching/cgeo.java4
-rw-r--r--main/src/cgeo/geocaching/cgeonavigate.java6
-rw-r--r--main/src/cgeo/geocaching/enumerations/CacheSize.java17
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java8
-rw-r--r--main/src/cgeo/geocaching/sorting/DistanceComparator.java36
-rw-r--r--tests/AndroidManifest.xml3
-rw-r--r--tests/src/cgeo/geocaching/cgBaseTest.java4
12 files changed, 71 insertions, 65 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 0b7c4c3..58c6e92 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -669,10 +669,10 @@ public class CacheDetailActivity extends AbstractActivity {
dist.append(" ↘");
}
if (Settings.isUseMetricUnits()) {
- dist.append(String.format("%.0f", (Math.abs(diff))));
+ dist.append(Math.abs((int) diff));
dist.append(" m");
} else {
- dist.append(String.format("%.0f", (Math.abs(diff) * 3.2808399)));
+ dist.append(Math.abs((int) (diff * 3.2808399)));
dist.append(" ft");
}
}
@@ -1421,7 +1421,7 @@ public class CacheDetailActivity extends AbstractActivity {
}
// favourite count
- addCacheDetail(R.string.cache_favourite, String.format("%d", cache.getFavoritePoints()) + "×");
+ addCacheDetail(R.string.cache_favourite, cache.getFavoritePoints() + "×");
// own rating
if (cache.getMyVote() > 0) {
diff --git a/main/src/cgeo/geocaching/CacheListAdapter.java b/main/src/cgeo/geocaching/CacheListAdapter.java
index eed8799..1b91b15 100644
--- a/main/src/cgeo/geocaching/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/CacheListAdapter.java
@@ -250,7 +250,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
if (coordsIn == null) {
return;
}
- Collections.sort(list, new DistanceComparator(coordsIn));
+ Collections.sort(list, new DistanceComparator(coordsIn, list));
}
else {
Collections.sort(list, cacheComparator);
@@ -267,7 +267,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
coords = coordsIn;
if (CollectionUtils.isNotEmpty(list) && (System.currentTimeMillis() - lastSort) > PAUSE_BETWEEN_LIST_SORT && sort && isSortedByDistance()) {
- Collections.sort(list, new DistanceComparator(coordsIn));
+ Collections.sort(list, new DistanceComparator(coordsIn, list));
notifyDataSetChanged();
lastSort = System.currentTimeMillis();
}
@@ -521,7 +521,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
}
}
- holder.favourite.setText(String.format("%d", cache.getFavoritePoints()));
+ holder.favourite.setText(Integer.toString(cache.getFavoritePoints()));
int favoriteBack;
// set default background, neither vote nor rating may be available
diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java
index c8f7a9c..3656694 100644
--- a/main/src/cgeo/geocaching/cgBase.java
+++ b/main/src/cgeo/geocaching/cgBase.java
@@ -1674,13 +1674,13 @@ public class cgBase {
if (Settings.isUseMetricUnits()) {
if (distanceKilometers > 100) {
- return String.format("%.0f", Double.valueOf(Math.round(distanceKilometers))) + " km";
+ return String.format("%d", Math.round(distanceKilometers)) + " km";
} else if (distanceKilometers > 10) {
return String.format("%.1f", Double.valueOf(Math.round(distanceKilometers * 10.0) / 10.0)) + " km";
} else if (distanceKilometers > 1) {
return String.format("%.2f", Double.valueOf(Math.round(distanceKilometers * 100.0) / 100.0)) + " km";
} else if (distanceKilometers > 0.1) {
- return String.format("%.0f", Double.valueOf(Math.round(distanceKilometers * 1000.0))) + " m";
+ return String.format("%d", Math.round(distanceKilometers * 1000.0)) + " m";
} else if (distanceKilometers > 0.01) {
return String.format("%.1f", Double.valueOf(Math.round(distanceKilometers * 1000.0 * 10.0) / 10.0)) + " m";
} else {
@@ -1689,13 +1689,13 @@ public class cgBase {
} else {
final float miles = distanceKilometers / IConversion.miles2km;
if (distanceKilometers > 100) {
- return String.format("%.0f", Double.valueOf(Math.round(miles))) + " mi";
+ return String.format("%d", Math.round(miles)) + " mi";
} else if (distanceKilometers > 0.5) {
return String.format("%.1f", Double.valueOf(Math.round(miles * 10.0) / 10.0)) + " mi";
} else if (distanceKilometers > 0.1) {
return String.format("%.2f", Double.valueOf(Math.round(miles * 100.0) / 100.0)) + " mi";
} else if (distanceKilometers > 0.05) {
- return String.format("%.0f", Double.valueOf(Math.round(miles * 5280.0))) + " ft";
+ return String.format("%d", Math.round(miles * 5280.0)) + " ft";
} else if (distanceKilometers > 0.01) {
return String.format("%.1f", Double.valueOf(Math.round(miles * 5280 * 10.0) / 10.0)) + " ft";
} else {
@@ -2554,7 +2554,8 @@ public class cgBase {
}
static private String formatTimeSpan(final long before) {
- return String.format(" (%d ms) ", System.currentTimeMillis() - before);
+ // don't use String.format in a pure logging routine, it has very bad performance
+ return " (" + (System.currentTimeMillis() - before) + " ms) ";
}
static public boolean isSuccess(final HttpResponse response) {
diff --git a/main/src/cgeo/geocaching/cgCache.java b/main/src/cgeo/geocaching/cgCache.java
index 5139648..5f27291 100644
--- a/main/src/cgeo/geocaching/cgCache.java
+++ b/main/src/cgeo/geocaching/cgCache.java
@@ -855,7 +855,6 @@ public class cgCache implements ICache {
this.guid = guid;
}
-
public void setName(String name) {
this.name = name;
}
@@ -924,10 +923,6 @@ public class cgCache implements ICache {
this.logCounts = logCounts;
}
- public void setNameForSorting(String nameForSorting) {
- this.nameForSorting = nameForSorting;
- }
-
/*
* (non-Javadoc)
*
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 677b329..0d48493 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -222,7 +222,7 @@ public class cgData {
+ "longitude double "
+ "); ";
- public boolean initialized = false;
+ private boolean initialized = false;
private SQLiteStatement statementDescription;
private SQLiteStatement statementLogCount;
private static boolean newlyCreatedDatabase = false;
@@ -232,6 +232,10 @@ public class cgData {
}
public synchronized void init() {
+ if (initialized) {
+ return;
+ }
+
if (databaseRW == null || !databaseRW.isOpen()) {
try {
if (dbHelper == null) {
@@ -282,6 +286,7 @@ public class cgData {
}
public void closeDb() {
+ initialized = false;
closePreparedStatements();
if (databaseRO != null) {
@@ -1502,19 +1507,6 @@ public class cgData {
return new Geopoint(cursor.getDouble(indexLat), cursor.getDouble(indexLon));
}
- /**
- * Retrieve coordinates from a Cursor
- *
- * @param cursor
- * a Cursor representing a row in the database
- * @return the coordinates, or null if latitude or longitude is null or the coordinates are invalid
- */
- private static Geopoint getCoords(final Cursor cursor) {
- final int indexLat = cursor.getColumnIndex("latitude");
- final int indexLon = cursor.getColumnIndex("longitude");
- return getCoords(cursor, indexLat, indexLon);
- }
-
public boolean saveOwnWaypoint(int id, String geocode, cgWaypoint waypoint) {
init();
@@ -2029,7 +2021,7 @@ public class cgData {
cgCache cache = new cgCache();
if (cacheColumnIndex == null) {
- int[] local_cci = new int[37]; // use a local variable to avoid having the not yet fully initialized array be visible to other threads
+ int[] local_cci = new int[40]; // use a local variable to avoid having the not yet fully initialized array be visible to other threads
local_cci[0] = cursor.getColumnIndex("updated");
local_cci[1] = cursor.getColumnIndex("reason");
local_cci[2] = cursor.getColumnIndex("detailed");
@@ -2068,6 +2060,8 @@ public class cgData {
local_cci[35] = cursor.getColumnIndex("onWatchlist");
local_cci[36] = cursor.getColumnIndex("reliable_latlon");
// local_cci[37] = cursor.getColumnIndex("coordsChanged");
+ local_cci[38] = cursor.getColumnIndex("latitude");
+ local_cci[39] = cursor.getColumnIndex("longitude");
cacheColumnIndex = local_cci;
}
@@ -2106,7 +2100,7 @@ public class cgData {
cache.setTerrain(cursor.getFloat(cacheColumnIndex[19]));
cache.setLatlon(cursor.getString(cacheColumnIndex[20]));
cache.setLocation(cursor.getString(cacheColumnIndex[21]));
- cache.setCoords(getCoords(cursor));
+ cache.setCoords(getCoords(cursor, cacheColumnIndex[38], cacheColumnIndex[39]));
index = cacheColumnIndex[22];
if (cursor.isNull(index)) {
cache.setElevation(null);
@@ -2246,7 +2240,7 @@ public class cgData {
waypoint.setLookup(cursor.getString(cursor.getColumnIndex("lookup")));
waypoint.setName(cursor.getString(cursor.getColumnIndex("name")));
waypoint.setLatlon(cursor.getString(cursor.getColumnIndex("latlon")));
- waypoint.setCoords(getCoords(cursor));
+ waypoint.setCoords(getCoords(cursor, cursor.getColumnIndex("latitude"), cursor.getColumnIndex("longitude")));
waypoint.setNote(cursor.getString(cursor.getColumnIndex("note")));
return waypoint;
@@ -3114,7 +3108,7 @@ public class cgData {
try {
final SQLiteStatement logCount = getStatementLogCount();
synchronized (logCount) {
- statementLogCount.bindString(1, geocode.toUpperCase());
+ statementLogCount.bindString(1, geocode);
return statementLogCount.simpleQueryForLong() > 0;
}
} catch (Exception e) {
diff --git a/main/src/cgeo/geocaching/cgeo.java b/main/src/cgeo/geocaching/cgeo.java
index 42eb667..50d7083 100644
--- a/main/src/cgeo/geocaching/cgeo.java
+++ b/main/src/cgeo/geocaching/cgeo.java
@@ -590,9 +590,9 @@ public class cgeo extends AbstractActivity {
if (geo.accuracyNow >= 0) {
if (Settings.isUseMetricUnits()) {
- navAccuracy.setText("±" + String.format("%.0f", geo.accuracyNow) + " m");
+ navAccuracy.setText("±" + Math.round(geo.accuracyNow) + " m");
} else {
- navAccuracy.setText("±" + String.format("%.0f", (geo.accuracyNow * 3.2808399)) + " ft");
+ navAccuracy.setText("±" + Math.round(geo.accuracyNow * 3.2808399) + " ft");
}
} else {
navAccuracy.setText(null);
diff --git a/main/src/cgeo/geocaching/cgeonavigate.java b/main/src/cgeo/geocaching/cgeonavigate.java
index 0b73ce5..e18956b 100644
--- a/main/src/cgeo/geocaching/cgeonavigate.java
+++ b/main/src/cgeo/geocaching/cgeonavigate.java
@@ -332,7 +332,7 @@ public class cgeonavigate extends AbstractActivity {
cacheHeading = geo.coordsNow.bearingTo(dstCoords);
distanceView.setText(cgBase.getHumanDistance(geo.coordsNow.distanceTo(dstCoords)));
- headingView.setText(String.format("%.0f", cacheHeading) + "°");
+ headingView.setText(Math.round(cacheHeading) + "°");
}
private class update implements UpdateLocationCallback {
@@ -365,9 +365,9 @@ public class cgeonavigate extends AbstractActivity {
if (geo.accuracyNow >= 0) {
if (Settings.isUseMetricUnits()) {
- navAccuracy.setText("±" + String.format("%.0f", geo.accuracyNow) + " m");
+ navAccuracy.setText("±" + Math.round(geo.accuracyNow) + " m");
} else {
- navAccuracy.setText("±" + String.format("%.0f", (geo.accuracyNow * 3.2808399)) + " ft");
+ navAccuracy.setText("±" + Math.round(geo.accuracyNow * 3.2808399) + " ft");
}
} else {
navAccuracy.setText(null);
diff --git a/main/src/cgeo/geocaching/enumerations/CacheSize.java b/main/src/cgeo/geocaching/enumerations/CacheSize.java
index 0ada4c6..c0de75b 100644
--- a/main/src/cgeo/geocaching/enumerations/CacheSize.java
+++ b/main/src/cgeo/geocaching/enumerations/CacheSize.java
@@ -44,11 +44,20 @@ public enum CacheSize {
}
public final static CacheSize getById(final String id) {
- final CacheSize result = id != null ? CacheSize.FIND_BY_ID.get(id.toLowerCase().trim()) : null;
- if (result == null) {
+ if (id == null) {
return UNKNOWN;
}
- return result;
+ // avoid String operations for performance reasons
+ final CacheSize result = CacheSize.FIND_BY_ID.get(id);
+ if (result != null) {
+ return result;
+ }
+ // only if String was not found, normalize it
+ final CacheSize resultNormalized = CacheSize.FIND_BY_ID.get(id.toLowerCase().trim());
+ if (resultNormalized != null) {
+ return resultNormalized;
+ }
+ return UNKNOWN;
}
public final String getL10n() {
@@ -56,7 +65,7 @@ public enum CacheSize {
}
public void setL10n() {
- this.l10n = cgeoapplication.getInstance().getBaseContext().getResources().getString(this.stringId);
+ this.l10n = cgeoapplication.getInstance().getBaseContext().getResources().getString(stringId);
}
}
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index 53b8222..3a813e5 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -230,9 +230,9 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
if (secondsRemaining < 40) {
waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + res.getString(R.string.caches_eta_ltm));
} else if (secondsRemaining < 90) {
- waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + String.format("%d", (secondsRemaining / 60)) + " " + res.getString(R.string.caches_eta_min));
+ waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + (secondsRemaining / 60) + " " + res.getString(R.string.caches_eta_min));
} else {
- waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + String.format("%d", (secondsRemaining / 60)) + " " + res.getString(R.string.caches_eta_mins));
+ waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + (secondsRemaining / 60) + " " + res.getString(R.string.caches_eta_mins));
}
}
} else if (msg.what == FINISHED_LOADING_DETAILS) {
@@ -657,9 +657,9 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
if (etaTime < 0.4) {
waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + res.getString(R.string.caches_eta_ltm));
} else if (etaTime < 1.5) {
- waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + String.format("%.0f", etaTime) + " " + res.getString(R.string.caches_eta_min));
+ waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + Math.round(etaTime) + " " + res.getString(R.string.caches_eta_min));
} else {
- waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + String.format("%.0f", etaTime) + " " + res.getString(R.string.caches_eta_mins));
+ waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + Math.round(etaTime) + " " + res.getString(R.string.caches_eta_mins));
}
waitDialog.show();
diff --git a/main/src/cgeo/geocaching/sorting/DistanceComparator.java b/main/src/cgeo/geocaching/sorting/DistanceComparator.java
index 4aeba33..677b8fd 100644
--- a/main/src/cgeo/geocaching/sorting/DistanceComparator.java
+++ b/main/src/cgeo/geocaching/sorting/DistanceComparator.java
@@ -3,15 +3,24 @@ package cgeo.geocaching.sorting;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.geopoint.Geopoint;
+import java.util.List;
+
/**
* sorts caches by distance to given position
- *
+ *
*/
public class DistanceComparator extends AbstractCacheComparator {
- private final Geopoint coords;
- public DistanceComparator(final Geopoint coords) {
- this.coords = coords;
+ public DistanceComparator(final Geopoint coords, List<cgCache> list) {
+ // calculate all distances to avoid duplicate calculations during sorting
+ for (cgCache cache : list) {
+ if (cache.getCoords() != null) {
+ cache.setDistance(coords.distanceTo(cache.getCoords()));
+ }
+ else {
+ cache.setDistance(null);
+ }
+ }
}
@Override
@@ -21,20 +30,13 @@ public class DistanceComparator extends AbstractCacheComparator {
@Override
protected int compareCaches(final cgCache cache1, final cgCache cache2) {
- if ((cache1.getCoords() == null || cache2.getCoords() == null)
- && cache1.getDistance() != null && cache2.getDistance() != null) {
- return Double.compare(cache1.getDistance(), cache2.getDistance());
- } else {
- if (cache1.getCoords() == null) {
- return 1;
- }
- if (cache2.getCoords() == null) {
- return -1;
- }
-
- return Float.compare(coords.distanceTo(cache1.getCoords()),
- coords.distanceTo(cache2.getCoords()));
+ if (cache1.getCoords() == null) {
+ return 1;
+ }
+ if (cache2.getCoords() == null) {
+ return -1;
}
+ return Float.compare(cache1.getDistance(), cache2.getDistance());
}
}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index dafa260..8d1620f 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -2,7 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cgeo.geocaching.test"
android:versionCode="1"
- android:versionName="1.0">
+ android:versionName="1.0"
+ name="c:geo Tests">
<uses-sdk android:minSdkVersion="3" />
<instrumentation android:targetPackage="cgeo.geocaching" android:name="android.test.InstrumentationTestRunner" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
diff --git a/tests/src/cgeo/geocaching/cgBaseTest.java b/tests/src/cgeo/geocaching/cgBaseTest.java
index 535833e..94f1a9a 100644
--- a/tests/src/cgeo/geocaching/cgBaseTest.java
+++ b/tests/src/cgeo/geocaching/cgBaseTest.java
@@ -79,4 +79,8 @@ public class cgBaseTest extends AndroidTestCase {
}
}
+ public static void testHumanDistance() {
+ assertEquals("?", cgBase.getHumanDistance(null));
+ assertEquals("123 km", cgBase.getHumanDistance(123.456f));
+ }
} \ No newline at end of file