aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-03-27 00:00:06 +0100
committerSamuel Tardieu <sam@rfc1149.net>2014-03-27 00:06:07 +0100
commit4bbf0552602243cf82ad62da41593d430e03bbbc (patch)
treecae53c2cda4257433649e2a40a3daa386d69f704 /main/src
parent797c0684f65059e947992945358aac2f25b58218 (diff)
downloadcgeo-4bbf0552602243cf82ad62da41593d430e03bbbc.zip
cgeo-4bbf0552602243cf82ad62da41593d430e03bbbc.tar.gz
cgeo-4bbf0552602243cf82ad62da41593d430e03bbbc.tar.bz2
Handle history list differently than other lists
History list cannot be sorted. Using the same comparator as other lists will make us lose the chosen sorting order (see #3519).
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/CacheListActivity.java4
-rw-r--r--main/src/cgeo/geocaching/sorting/EventDateComparator.java2
-rw-r--r--main/src/cgeo/geocaching/sorting/VisitComparator.java2
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java53
4 files changed, 30 insertions, 31 deletions
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java
index 7f43d63..510dfbe 100644
--- a/main/src/cgeo/geocaching/CacheListActivity.java
+++ b/main/src/cgeo/geocaching/CacheListActivity.java
@@ -662,7 +662,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
showFilterMenu(null);
return true;
case R.id.menu_sort:
- final CacheComparator oldComparator = CacheListAdapter.getCacheComparator();
+ final CacheComparator oldComparator = adapter.getCacheComparator();
new ComparatorUserInterface(this).selectComparator(oldComparator, new Action1<CacheComparator>() {
@Override
public void call(CacheComparator selectedComparator) {
@@ -1644,7 +1644,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
cacheList.addAll(cachesFromSearchResult);
search = searchIn;
adapter.reFilter();
- adapter.setInitialComparator();
+ adapter.checkEvents();
adapter.forceSort();
adapter.notifyDataSetChanged();
updateTitle();
diff --git a/main/src/cgeo/geocaching/sorting/EventDateComparator.java b/main/src/cgeo/geocaching/sorting/EventDateComparator.java
index e4649c8..197946a 100644
--- a/main/src/cgeo/geocaching/sorting/EventDateComparator.java
+++ b/main/src/cgeo/geocaching/sorting/EventDateComparator.java
@@ -5,4 +5,6 @@ package cgeo.geocaching.sorting;
*/
public class EventDateComparator extends DateComparator {
+ final static public EventDateComparator singleton = new EventDateComparator();
+
}
diff --git a/main/src/cgeo/geocaching/sorting/VisitComparator.java b/main/src/cgeo/geocaching/sorting/VisitComparator.java
index 1589a4c..cee0633 100644
--- a/main/src/cgeo/geocaching/sorting/VisitComparator.java
+++ b/main/src/cgeo/geocaching/sorting/VisitComparator.java
@@ -8,6 +8,8 @@ import cgeo.geocaching.Geocache;
*/
public class VisitComparator extends AbstractCacheComparator {
+ final static public VisitComparator singleton = new VisitComparator();
+
@Override
protected int compareCaches(final Geocache cache1, final Geocache cache2) {
return Long.valueOf(cache2.getVisitedDate()).compareTo(cache1.getVisitedDate());
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index 90d603c..ca4e825 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -70,6 +70,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
final private Resources res;
/** Resulting list of caches */
final private List<Geocache> list;
+ private boolean eventsOnly;
private boolean inverseSort = false;
private static final int SWIPE_MIN_DISTANCE = 60;
@@ -122,9 +123,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
this.res = activity.getResources();
this.list = list;
this.cacheListType = cacheListType;
- if (cacheListType == CacheListType.HISTORY) {
- cacheComparator = new VisitComparator();
- }
+ checkEvents();
final Drawable modifiedCoordinatesMarker = activity.getResources().getDrawable(R.drawable.marker_usermodifiedcoords);
for (final CacheType cacheType : CacheType.values()) {
@@ -170,10 +169,20 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
inverseSort = !inverseSort;
}
- public static CacheComparator getCacheComparator() {
+ public CacheComparator getCacheComparator() {
+ if (isHistory()) {
+ return VisitComparator.singleton;
+ }
+ if (cacheComparator == null && eventsOnly) {
+ return EventDateComparator.singleton;
+ }
return cacheComparator;
}
+ private boolean isHistory() {
+ return cacheListType == CacheListType.HISTORY;
+ }
+
public Geocache findCacheByGeocode(String geocode) {
for (int i = 0; i < getCount(); i++) {
if (getItem(i).getGeocode().equalsIgnoreCase(geocode)) {
@@ -274,7 +283,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
updateSortByDistance();
}
else {
- Collections.sort(list, getPotentialInversion(cacheComparator));
+ Collections.sort(list, getPotentialInversion(getCacheComparator()));
}
notifyDataSetChanged();
@@ -326,8 +335,9 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
return comparator;
}
- private static boolean isSortedByDistance() {
- return cacheComparator == null || cacheComparator instanceof DistanceComparator;
+ private boolean isSortedByDistance() {
+ final CacheComparator comparator = getCacheComparator();
+ return comparator == null || comparator instanceof DistanceComparator;
}
public void setActualHeading(final float direction) {
@@ -481,7 +491,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
}
holder.favorite.setBackgroundResource(favoriteBack);
- if (cacheListType == CacheListType.HISTORY && cache.getVisitedDate() > 0) {
+ if (isHistory() && cache.getVisitedDate() > 0) {
holder.info.setText(Formatter.formatCacheInfoHistory(cache));
} else {
holder.info.setText(Formatter.formatCacheInfoLong(cache, cacheListType));
@@ -644,28 +654,13 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
return list.size();
}
- public void setInitialComparator() {
- // will be called repeatedly when coming back to the list, therefore check first for an already existing sorting
- if (cacheComparator != null) {
- return;
- }
- CacheComparator comparator = null; // a null comparator will automatically sort by distance
- if (cacheListType == CacheListType.HISTORY) {
- comparator = new VisitComparator();
- } else {
- if (CollectionUtils.isNotEmpty(list)) {
- boolean eventsOnly = true;
- for (final Geocache cache : list) {
- if (!cache.isEventCache()) {
- eventsOnly = false;
- break;
- }
- }
- if (eventsOnly) {
- comparator = new EventDateComparator();
- }
+ public void checkEvents() {
+ eventsOnly = true;
+ for (final Geocache cache : list) {
+ if (!cache.isEventCache()) {
+ eventsOnly = false;
+ return;
}
}
- setComparator(comparator);
}
}