diff options
-rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 6 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/CacheListAdapter.java | 6 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/cgBase.java | 11 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/cgCache.java | 5 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 30 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/cgeo.java | 4 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/cgeonavigate.java | 6 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/enumerations/CacheSize.java | 17 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/maps/CGeoMap.java | 8 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/sorting/DistanceComparator.java | 36 | ||||
-rw-r--r-- | tests/AndroidManifest.xml | 3 | ||||
-rw-r--r-- | tests/src/cgeo/geocaching/cgBaseTest.java | 4 |
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 |