aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/cgeocaches.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/cgeocaches.java')
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java231
1 files changed, 144 insertions, 87 deletions
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index 57fdb9c..901743c 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -3,6 +3,7 @@ package cgeo.geocaching;
import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.activity.AbstractListActivity;
import cgeo.geocaching.activity.ActivityMixin;
+import cgeo.geocaching.activity.FilteredActivity;
import cgeo.geocaching.activity.Progress;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
import cgeo.geocaching.apps.cachelist.CacheListAppFactory;
@@ -28,6 +29,8 @@ import cgeo.geocaching.sorting.EventDateComparator;
import cgeo.geocaching.sorting.VisitComparator;
import cgeo.geocaching.ui.CacheListAdapter;
import cgeo.geocaching.ui.LoggingUI;
+import cgeo.geocaching.ui.WeakReferenceHandler;
+import cgeo.geocaching.utils.DateUtils;
import cgeo.geocaching.utils.GeoDirHandler;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.RunnableWithArgument;
@@ -60,11 +63,12 @@ import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-public class cgeocaches extends AbstractListActivity {
+public class cgeocaches extends AbstractListActivity implements FilteredActivity {
private static final String EXTRAS_USERNAME = "username";
private static final String EXTRAS_ADDRESS = "address";
@@ -98,6 +102,7 @@ public class cgeocaches extends AbstractListActivity {
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_DELETE_EVENTS = 75;
private static final int MSG_DONE = -1;
private static final int MSG_RESTART_GEO_AND_DIR = -2;
@@ -156,57 +161,42 @@ public class cgeocaches extends AbstractListActivity {
*/
private MenuItem navigationMenu;
- private Handler loadCachesHandler = new Handler() {
-
- @Override
- public void handleMessage(Message msg) {
- try {
- setAdapter();
-
- updateTitle();
-
- setDateComparatorForEventList();
+ public void handleCachesLoaded() {
+ try {
+ setAdapter();
- showFooterMoreCaches();
+ updateTitle();
- if (search != null && search.getError() == StatusCode.UNAPPROVED_LICENSE) {
- AlertDialog.Builder dialog = new AlertDialog.Builder(cgeocaches.this);
- dialog.setTitle(res.getString(R.string.license));
- dialog.setMessage(res.getString(R.string.err_license));
- dialog.setCancelable(true);
- dialog.setNegativeButton(res.getString(R.string.license_dismiss), new DialogInterface.OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int id) {
- Cookies.clearCookies();
- dialog.cancel();
- }
- });
- dialog.setPositiveButton(res.getString(R.string.license_show), new DialogInterface.OnClickListener() {
+ setDateComparatorForEventList();
- @Override
- public void onClick(DialogInterface dialog, int id) {
- Cookies.clearCookies();
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/software/agreement.aspx?ID=0")));
- }
- });
+ showFooterMoreCaches();
- AlertDialog alert = dialog.create();
- alert.show();
- } else if (search != null && search.getError() != null) {
- showToast(res.getString(R.string.err_download_fail) + ' ' + search.getError().getErrorString(res) + '.');
+ if (search != null && search.getError() == StatusCode.UNAPPROVED_LICENSE) {
+ AlertDialog.Builder dialog = new AlertDialog.Builder(this);
+ dialog.setTitle(res.getString(R.string.license));
+ dialog.setMessage(res.getString(R.string.err_license));
+ dialog.setCancelable(true);
+ dialog.setNegativeButton(res.getString(R.string.license_dismiss), new DialogInterface.OnClickListener() {
- hideLoading();
- showProgress(false);
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ Cookies.clearCookies();
+ dialog.cancel();
+ }
+ });
+ dialog.setPositiveButton(res.getString(R.string.license_show), new DialogInterface.OnClickListener() {
- finish();
- return;
- }
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ Cookies.clearCookies();
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/software/agreement.aspx?ID=0")));
+ }
+ });
- setAdapterCurrentCoordinates(false);
- } catch (Exception e) {
- showToast(res.getString(R.string.err_detail_cache_find_any));
- Log.e("cgeocaches.loadCachesHandler: " + e.toString());
+ AlertDialog alert = dialog.create();
+ alert.show();
+ } else if (search != null && search.getError() != null) {
+ showToast(res.getString(R.string.err_download_fail) + ' ' + search.getError().getErrorString(res) + '.');
hideLoading();
showProgress(false);
@@ -215,18 +205,48 @@ public class cgeocaches extends AbstractListActivity {
return;
}
- try {
- hideLoading();
- showProgress(false);
- } catch (Exception e2) {
- Log.e("cgeocaches.loadCachesHandler.2: " + e2.toString());
- }
+ setAdapterCurrentCoordinates(false);
+ } catch (Exception e) {
+ showToast(res.getString(R.string.err_detail_cache_find_any));
+ Log.e("cgeocaches.loadCachesHandler: " + e.toString());
- if (adapter != null) {
- adapter.setSelectMode(false);
+ hideLoading();
+ showProgress(false);
+
+ finish();
+ return;
+ }
+
+ try {
+ hideLoading();
+ showProgress(false);
+ } catch (Exception e2) {
+ Log.e("cgeocaches.loadCachesHandler.2: " + e2.toString());
+ }
+
+ if (adapter != null) {
+ adapter.setSelectMode(false);
+ }
+ }
+
+ private Handler loadCachesHandler = new LoadCachesHandler(this);
+
+ private static class LoadCachesHandler extends WeakReferenceHandler<cgeocaches> {
+
+ protected LoadCachesHandler(cgeocaches activity) {
+ super(activity);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ final cgeocaches activity = getActivity();
+ if (activity == null) {
+ return;
}
+ activity.handleCachesLoaded();
}
- };
+ }
+
private Handler loadNextPageHandler = new Handler() {
@Override
@@ -479,7 +499,7 @@ public class cgeocaches extends AbstractListActivity {
listId = StoredList.STANDARD_LIST_ID;
title = res.getString(R.string.stored_caches_button);
} else {
- final StoredList list = app.getList(listId);
+ final StoredList list = cgData.getList(listId);
// list.id may be different if listId was not valid
listId = list.id;
title = list.title;
@@ -642,7 +662,7 @@ 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, Settings.getCacheType(), listId);
+ SearchResult newSearch = cgData.getBatchOfStoredCaches(coords, Settings.getCacheType(), listId);
if (newSearch != null && newSearch.getTotal() != search.getTotal()) {
refreshCurrentList();
}
@@ -691,6 +711,7 @@ public class cgeocaches extends AbstractListActivity {
subMenu.add(0, MENU_DROP_CACHES_AND_LIST, 0, res.getString(R.string.caches_drop_all_and_list));
subMenu.add(0, MENU_REFRESH_STORED, 0, res.getString(R.string.cache_offline_refresh)); // download details for all caches
subMenu.add(0, MENU_MOVE_TO_LIST, 0, res.getString(R.string.cache_menu_move_list));
+ subMenu.add(0, MENU_DELETE_EVENTS, 0, res.getString(R.string.caches_delete_events));
//TODO: add submenu/AlertDialog and use R.string.gpx_import_title
subMenu.add(0, MENU_IMPORT_GPX, 0, res.getString(R.string.gpx_import_title));
@@ -753,6 +774,7 @@ public class cgeocaches extends AbstractListActivity {
setVisible(menu, MENU_REFRESH_STORED, !isEmpty && (isConcrete || type != CacheListType.OFFLINE));
setVisible(menu, MENU_DROP_CACHES, !isEmpty);
setVisible(menu, MENU_DROP_CACHES_AND_LIST, isConcrete && !isEmpty);
+ setVisible(menu, MENU_DELETE_EVENTS, isConcrete && !isEmpty && containsEvents());
setVisible(menu, MENU_MOVE_TO_LIST, !isEmpty);
setVisible(menu, MENU_EXPORT, !isEmpty);
setVisible(menu, MENU_REMOVE_FROM_HISTORY, !isEmpty);
@@ -784,7 +806,7 @@ public class cgeocaches extends AbstractListActivity {
item.setVisible(isNonDefaultList);
}
- final boolean multipleLists = app.getLists().size() >= 2;
+ final boolean multipleLists = cgData.getLists().size() >= 2;
item = menu.findItem(MENU_SWITCH_LIST);
if (item != null) {
item.setVisible(multipleLists);
@@ -803,6 +825,15 @@ public class cgeocaches extends AbstractListActivity {
return true;
}
+ private boolean containsEvents() {
+ for (cgCache cache : adapter.getCheckedOrAllCaches()) {
+ if (cache.isEventCache()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void setMenuItemLabel(final Menu menu, final int menuId, final int resIdSelection, final int resId) {
final MenuItem menuItem = menu.findItem(menuId);
if (menuItem == null) {
@@ -864,20 +895,7 @@ public class cgeocaches extends AbstractListActivity {
invalidateOptionsMenuCompatible();
return false;
case MENU_FILTER:
- new FilterUserInterface(this).selectFilter(new RunnableWithArgument<IFilter>() {
- @Override
- public void run(IFilter selectedFilter) {
- if (selectedFilter != null) {
- setFilter(selectedFilter);
- }
- else {
- // clear filter
- if (adapter != null) {
- setFilter(null);
- }
- }
- }
- });
+ showFilterMenu(null);
return true;
case MENU_SORT:
new ComparatorUserInterface(this).selectComparator(adapter.getCacheComparator(), new RunnableWithArgument<CacheComparator>() {
@@ -901,9 +919,48 @@ public class cgeocaches extends AbstractListActivity {
moveCachesToOtherList();
invalidateOptionsMenuCompatible();
return true;
+ case MENU_DELETE_EVENTS:
+ deletePastEvents();
+ invalidateOptionsMenuCompatible();
+ return true;
+ default:
+ return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, search);
+ }
+ }
+
+ public void deletePastEvents() {
+ progress.show(this, null, res.getString(R.string.caches_drop_progress), true, dropDetailsHandler.obtainMessage(MSG_CANCEL));
+ final List<cgCache> deletion = new ArrayList<cgCache>();
+ for (cgCache cache : adapter.getCheckedOrAllCaches()) {
+ if (cache.isEventCache()) {
+ final Date eventDate = cache.getHiddenDate();
+ if (DateUtils.daysSince(eventDate.getTime()) > 0) {
+ deletion.add(cache);
+ }
+ }
}
+ new DropDetailsThread(dropDetailsHandler, deletion).start();
+ }
- return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, search);
+ /**
+ * called from the filter bar view
+ */
+ @Override
+ public void showFilterMenu(final View view) {
+ new FilterUserInterface(this).selectFilter(new RunnableWithArgument<IFilter>() {
+ @Override
+ public void run(IFilter selectedFilter) {
+ if (selectedFilter != null) {
+ setFilter(selectedFilter);
+ }
+ else {
+ // clear filter
+ if (adapter != null) {
+ setFilter(null);
+ }
+ }
+ }
+ });
}
private void setComparator(final CacheComparator comparator) {
@@ -944,7 +1001,7 @@ public class cgeocaches extends AbstractListActivity {
}
if (cache.isOffline()) {
menu.add(0, MENU_DROP_CACHE, 0, res.getString(R.string.cache_offline_drop));
- final List<StoredList> cacheLists = app.getLists();
+ final List<StoredList> cacheLists = cgData.getLists();
if (cacheLists.size() > 1) {
menu.add(0, MENU_MOVE_TO_LIST, 0, res.getString(R.string.cache_menu_move_list));
}
@@ -960,7 +1017,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void run(Integer newListId) {
- app.moveToList(adapter.getCheckedOrAllCaches(), newListId);
+ cgData.moveToList(adapter.getCheckedOrAllCaches(), newListId);
adapter.setSelectMode(false);
refreshCurrentList();
@@ -1003,7 +1060,7 @@ public class cgeocaches extends AbstractListActivity {
break;
case MENU_CACHE_DETAILS:
final Intent cachesIntent = new Intent(this, CacheDetailActivity.class);
- cachesIntent.putExtra("geocode", cache.getGeocode().toUpperCase());
+ cachesIntent.putExtra("geocode", cache.getGeocode());
cachesIntent.putExtra("name", cache.getName());
startActivity(cachesIntent);
break;
@@ -1021,7 +1078,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void run(Integer newListId) {
- app.moveToList(Collections.singletonList(cache), newListId);
+ cgData.moveToList(Collections.singletonList(cache), newListId);
adapter.setSelectMode(false);
refreshCurrentList();
}
@@ -1269,7 +1326,7 @@ public class cgeocaches extends AbstractListActivity {
public void dropSelected() {
progress.show(this, null, res.getString(R.string.caches_drop_progress), true, dropDetailsHandler.obtainMessage(MSG_CANCEL));
- new DropDetailsThread(dropDetailsHandler).start();
+ new DropDetailsThread(dropDetailsHandler, adapter.getCheckedOrAllCaches()).start();
}
private class LoadByOfflineThread extends Thread {
@@ -1283,7 +1340,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void run() {
- search = cgeoapplication.getInstance().getBatchOfStoredCaches(true, coords, Settings.getCacheType(), listId);
+ search = cgData.getBatchOfStoredCaches(coords, Settings.getCacheType(), listId);
replaceCacheListFromSearch();
loadCachesHandler.sendMessage(Message.obtain());
}
@@ -1292,7 +1349,7 @@ public class cgeocaches extends AbstractListActivity {
private class LoadByHistoryThread extends Thread {
@Override
public void run() {
- search = cgeoapplication.getInstance().getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL);
+ search = cgData.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL);
replaceCacheListFromSearch();
loadCachesHandler.sendMessage(Message.obtain());
}
@@ -1501,13 +1558,13 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void run() {
- int ret = MSG_DONE;
removeGeoAndDir();
int delay = -1;
int times = 0;
+ int ret = MSG_DONE;
while (!needToStop && times < 3 * 60 / 5) // maximum: 3 minutes, every 5 seconds
{
//download new code
@@ -1573,15 +1630,15 @@ public class cgeocaches extends AbstractListActivity {
final private Handler handler;
final private List<cgCache> selected;
- public DropDetailsThread(Handler handlerIn) {
+ public DropDetailsThread(Handler handlerIn, List<cgCache> selectedIn) {
handler = handlerIn;
- selected = adapter.getCheckedOrAllCaches();
+ selected = selectedIn;
}
@Override
public void run() {
removeGeoAndDir();
- app.markDropped(selected);
+ cgData.markDropped(selected);
handler.sendEmptyMessage(MSG_DONE);
startGeoAndDir();
@@ -1600,7 +1657,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void run() {
- app.clearVisitDate(selected);
+ cgData.clearVisitDate(selected);
handler.sendEmptyMessage(MSG_DONE);
}
}
@@ -1650,7 +1707,7 @@ public class cgeocaches extends AbstractListActivity {
return;
}
- StoredList list = app.getList(id);
+ StoredList list = cgData.getList(id);
if (list == null) {
return;
}
@@ -1693,7 +1750,7 @@ public class cgeocaches extends AbstractListActivity {
@Override
public void run() {
final List<cgCache> caches = adapter.getCheckedCaches();
- app.moveToList(caches, listId);
+ cgData.moveToList(caches, listId);
handler.sendEmptyMessage(listId);
}
}
@@ -1725,7 +1782,7 @@ public class cgeocaches extends AbstractListActivity {
}
private void removeListInternal() {
- if (app.removeList(listId)) {
+ if (cgData.removeList(listId)) {
showToast(res.getString(R.string.list_dialog_remove_ok));
switchListById(StoredList.STANDARD_LIST_ID);
} else {