diff options
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 86 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CachePopup.java | 24 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Geocache.java | 10 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Settings.java | 16 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/SettingsActivity.java | 11 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/StoredList.java | 16 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeocaches.java | 40 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/CGeoMap.java | 98 |
9 files changed, 241 insertions, 64 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index a3535a6..3e95d72 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -36,6 +36,7 @@ import cgeo.geocaching.utils.HtmlUtils; import cgeo.geocaching.utils.ImageHelper; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; +import cgeo.geocaching.utils.RunnableWithArgument; import cgeo.geocaching.utils.TranslationUtils; import cgeo.geocaching.utils.UnknownTagsHandler; @@ -1241,6 +1242,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc buttonFavPointRemove.setOnClickListener(new FavoriteRemoveClickListener()); updateFavPointBox(); + // list + Button buttonChangeList = (Button) view.findViewById(R.id.change_list); + buttonChangeList.setOnClickListener(new ChangeListClickListener()); + updateListBox(); + // data license IConnector connector = ConnectorFactory.getConnector(cache); if (connector != null) { @@ -1310,6 +1316,21 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc return; } + if (Settings.getChooseList()) { + // let user select list to store cache in + new StoredList.UserInterface(CacheDetailActivity.this).promptForListSelection(R.string.list_title, + new RunnableWithArgument<Integer>() { + @Override + public void run(final Integer selectedListId) { + storeCache(selectedListId); + } + }, true, StoredList.TEMPORARY_LIST_ID); + } else { + storeCache(StoredList.TEMPORARY_LIST_ID); + } + } + + protected void storeCache(int listId) { final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(); progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage()); @@ -1318,7 +1339,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc storeThread.interrupt(); } - storeThread = new StoreCacheThread(storeCacheHandler); + storeThread = new StoreCacheThread(listId, storeCacheHandler); storeThread.start(); } } @@ -1345,15 +1366,17 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } private class StoreCacheThread extends Thread { + final private int listId; final private CancellableHandler handler; - public StoreCacheThread(final CancellableHandler handler) { + public StoreCacheThread(final int listId, final CancellableHandler handler) { + this.listId = listId; this.handler = handler; } @Override public void run() { - cache.store(handler); + cache.store(listId, handler); } } @@ -1538,6 +1561,38 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } /** + * Listener for "change list" button + */ + private class ChangeListClickListener implements View.OnClickListener { + @Override + public void onClick(View view) { + new StoredList.UserInterface(CacheDetailActivity.this).promptForListSelection(R.string.list_title, + new RunnableWithArgument<Integer>() { + @Override + public void run(final Integer selectedListId) { + switchListById(selectedListId); + } + }, true, cache.getListId()); + } + } + + /** + * move cache to another list + * + * @param listId + * the ID of the list + */ + public void switchListById(int listId) { + if (listId < 0) { + return; + } + + Settings.saveLastList(listId); + cgData.moveToList(cache, listId); + updateListBox(); + } + + /** * shows/hides buttons, sets text in watchlist box */ private void updateWatchlistBox() { @@ -1605,6 +1660,31 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } /** + * shows/hides/updates list box + */ + private void updateListBox() { + View box = view.findViewById(R.id.list_box); + + if (cache.isOffline()) { + // show box + box.setVisibility(View.VISIBLE); + + // update text + TextView text = (TextView) view.findViewById(R.id.list_text); + StoredList list = cgData.getList(cache.getListId()); + if (list != null) { + text.setText(res.getString(R.string.cache_list_text) + " " + list.title); + } else { + // this should not happen + text.setText(R.string.cache_list_unknown); + } + } else { + // hide box + box.setVisibility(View.GONE); + } + } + + /** * Handler, called when watchlist add or remove is done */ private class WatchlistHandler extends Handler { diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java index 7441b79..e6d0148 100644 --- a/main/src/cgeo/geocaching/CachePopup.java +++ b/main/src/cgeo/geocaching/CachePopup.java @@ -6,6 +6,7 @@ import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RunnableWithArgument; import org.apache.commons.lang3.StringUtils; @@ -114,22 +115,39 @@ public class CachePopup extends AbstractPopupActivity { return; } + if (Settings.getChooseList()) { + // let user select list to store cache in + new StoredList.UserInterface(CachePopup.this).promptForListSelection(R.string.list_title, + new RunnableWithArgument<Integer>() { + @Override + public void run(final Integer selectedListId) { + storeCache(selectedListId); + } + }, true, StoredList.TEMPORARY_LIST_ID); + } else { + storeCache(StoredList.TEMPORARY_LIST_ID); + } + } + + protected void storeCache(final int listId) { final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(); progress.show(CachePopup.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage()); - new StoreCacheThread(storeCacheHandler).start(); + new StoreCacheThread(listId, storeCacheHandler).start(); } } private class StoreCacheThread extends Thread { + final private int listId; final private CancellableHandler handler; - public StoreCacheThread(final CancellableHandler handler) { + public StoreCacheThread(final int listId, final CancellableHandler handler) { + this.listId = listId; this.handler = handler; } @Override public void run() { - cache.store(handler); + cache.store(listId, handler); invalidateOptionsMenuCompatible(); } } diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index eb74d8c..7613665 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -1,8 +1,8 @@ package cgeo.geocaching; +import cgeo.geocaching.cgData.StorageLocation; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.activity.IAbstractActivity; -import cgeo.geocaching.cgData.StorageLocation; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.capability.ISearchByCenter; @@ -1374,7 +1374,13 @@ public class Geocache implements ICache, IWaypoint { } public void store(CancellableHandler handler) { - final int listId = Math.max(getListId(), StoredList.STANDARD_LIST_ID); + store(StoredList.TEMPORARY_LIST_ID, handler); + } + + public void store(int listId, CancellableHandler handler) { + if (listId < StoredList.STANDARD_LIST_ID) { + listId = Math.max(getListId(), StoredList.STANDARD_LIST_ID); + } storeCache(this, null, listId, false, handler); } diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java index 0e5a406..0c157e1 100644 --- a/main/src/cgeo/geocaching/Settings.java +++ b/main/src/cgeo/geocaching/Settings.java @@ -86,6 +86,7 @@ public final class Settings { private static final String KEY_MEMBER_STATUS = "memberstatus"; private static final String KEY_COORD_INPUT_FORMAT = "coordinputformat"; private static final String KEY_LOG_OFFLINE = "log_offline"; + private static final String KEY_CHOOSE_LIST = "choose_list"; private static final String KEY_LOAD_DIRECTION_IMG = "loaddirectionimg"; private static final String KEY_GC_CUSTOM_DATE = "gccustomdate"; private static final String KEY_SHOW_WAYPOINTS_THRESHOLD = "gcshowwaypointsthreshold"; @@ -204,6 +205,7 @@ public final class Settings { e.putString(KEY_MEMBER_STATUS, old.getString(KEY_MEMBER_STATUS, "")); e.putInt(KEY_COORD_INPUT_FORMAT, old.getInt(KEY_COORD_INPUT_FORMAT, 0)); e.putBoolean(KEY_LOG_OFFLINE, old.getBoolean(KEY_LOG_OFFLINE, false)); + e.putBoolean(KEY_CHOOSE_LIST, old.getBoolean(KEY_CHOOSE_LIST, false)); e.putBoolean(KEY_LOAD_DIRECTION_IMG, old.getBoolean(KEY_LOAD_DIRECTION_IMG, true)); e.putString(KEY_GC_CUSTOM_DATE, old.getString(KEY_GC_CUSTOM_DATE, null)); e.putInt(KEY_SHOW_WAYPOINTS_THRESHOLD, old.getInt(KEY_SHOW_WAYPOINTS_THRESHOLD, 0)); @@ -552,6 +554,20 @@ public final class Settings { return sharedPrefs.getBoolean(KEY_LOG_OFFLINE, false); } + static void setChooseList(final boolean choose) { + editSharedSettings(new PrefRunnable() { + + @Override + public void edit(Editor edit) { + edit.putBoolean(KEY_CHOOSE_LIST, choose); + } + }); + } + + public static boolean getChooseList() { + return sharedPrefs.getBoolean(KEY_CHOOSE_LIST, false); + } + static void setLoadDirImg(final boolean value) { editSharedSettings(new PrefRunnable() { diff --git a/main/src/cgeo/geocaching/SettingsActivity.java b/main/src/cgeo/geocaching/SettingsActivity.java index a099c85..3463204 100644 --- a/main/src/cgeo/geocaching/SettingsActivity.java +++ b/main/src/cgeo/geocaching/SettingsActivity.java @@ -521,6 +521,17 @@ public class SettingsActivity extends AbstractActivity { } }); + final CheckBox chooseList = (CheckBox) findViewById(R.id.choose_list); + chooseList.setChecked(Settings.getChooseList()); + chooseList.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + Settings.setChooseList(!Settings.getChooseList()); + chooseList.setChecked(Settings.getChooseList()); + } + }); + final CheckBox plainLogs = (CheckBox) findViewById(R.id.plain_logs); plainLogs.setChecked(Settings.getPlainLogs()); plainLogs.setOnClickListener(new View.OnClickListener() { diff --git a/main/src/cgeo/geocaching/StoredList.java b/main/src/cgeo/geocaching/StoredList.java index b75f25a..5a6f132 100644 --- a/main/src/cgeo/geocaching/StoredList.java +++ b/main/src/cgeo/geocaching/StoredList.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.IAbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.utils.RunnableWithArgument; import org.apache.commons.lang3.StringUtils; @@ -54,11 +54,11 @@ public class StoredList { } public static class UserInterface { - private final IAbstractActivity activity; + private final Activity activity; private final cgeoapplication app; private final Resources res; - public UserInterface(final IAbstractActivity activity) { + public UserInterface(final Activity activity) { this.activity = activity; app = cgeoapplication.getInstance(); res = app.getResources(); @@ -93,7 +93,7 @@ public class StoredList { final CharSequence[] items = new CharSequence[listsTitle.size()]; - AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(res.getString(titleId)); builder.setItems(listsTitle.toArray(items), new DialogInterface.OnClickListener() { @Override @@ -123,20 +123,20 @@ public class StoredList { final int newId = cgData.createList(listName); if (newId >= cgData.customListIdOffset) { - activity.showToast(res.getString(R.string.list_dialog_create_ok)); + ActivityMixin.showToast(activity, res.getString(R.string.list_dialog_create_ok)); if (runAfterwards != null) { runAfterwards.run(newId); } } else { - activity.showToast(res.getString(R.string.list_dialog_create_err)); + ActivityMixin.showToast(activity, res.getString(R.string.list_dialog_create_err)); } } }); } private void handleListNameInput(final String defaultValue, int dialogTitle, int buttonTitle, final RunnableWithArgument<String> runnable) { - final AlertDialog.Builder alert = new AlertDialog.Builder((Activity) activity); - final View view = ((Activity) activity).getLayoutInflater().inflate(R.layout.list_create_dialog, null); + final AlertDialog.Builder alert = new AlertDialog.Builder(activity); + final View view = activity.getLayoutInflater().inflate(R.layout.list_create_dialog, null); final EditText input = (EditText) view.findViewById(R.id.text); input.setText(defaultValue); diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 2a62f0b..13546f3 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -2581,6 +2581,10 @@ public class cgData { return status; } + public static void moveToList(final Geocache cache, final int listId) { + moveToList(Collections.singletonList(cache), listId); + } + public static void moveToList(final List<Geocache> caches, final int listId) { if (listId == StoredList.ALL_LIST_ID) { return; diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 372bb68..cf10fb5 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -828,7 +828,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity invalidateOptionsMenuCompatible(); return true; case MENU_REFRESH_STORED: - refreshStored(); + refreshStored(adapter.getCheckedOrAllCaches()); invalidateOptionsMenuCompatible(); return true; case MENU_DROP_CACHES: @@ -1042,8 +1042,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity }, true, listId); break; case MENU_STORE_CACHE: - //FIXME: this must use the same handler like in the CacheDetailActivity. Will be done by moving the handler into the store method. - cache.store(null); + refreshStored(Collections.singletonList(cache)); break; case MENU_EXPORT: ExportFactory.showExportMenu(Collections.singletonList(cache), this); @@ -1175,8 +1174,27 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity refreshCurrentList(); } - public void refreshStored() { - detailTotal = adapter.getCheckedOrAllCount(); + public void refreshStored(final List<Geocache> caches) { + detailTotal = caches.size(); + if (detailTotal == 0) { + return; + } + + if (Settings.getChooseList() && type != CacheListType.OFFLINE) { + // let user select list to store cache in + new StoredList.UserInterface(this).promptForListSelection(R.string.list_title, + new RunnableWithArgument<Integer>() { + @Override + public void run(final Integer selectedListId) { + refreshStored(caches, selectedListId); + } + }, true, StoredList.TEMPORARY_LIST_ID); + } else { + refreshStored(caches, this.listId); + } + } + + private void refreshStored(final List<Geocache> caches, final int storeListId) { detailProgress = 0; showProgress(false); @@ -1194,7 +1212,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity detailProgressTime = System.currentTimeMillis(); - threadDetails = new LoadDetailsThread(loadDetailsHandler, listId); + threadDetails = new LoadDetailsThread(loadDetailsHandler, caches, storeListId); threadDetails.start(); } @@ -1413,11 +1431,11 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity final private int listIdLD; private volatile boolean needToStop = false; private long last = 0L; - final private List<Geocache> selected; + final private List<Geocache> caches; - public LoadDetailsThread(Handler handlerIn, int listId) { + public LoadDetailsThread(Handler handlerIn, List<Geocache> caches, int listId) { handler = handlerIn; - selected = adapter.getCheckedOrAllCaches(); + this.caches = caches; // in case of online lists, set the list id to the standard list this.listIdLD = Math.max(listId, StoredList.STANDARD_LIST_ID); @@ -1431,8 +1449,8 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity public void run() { removeGeoAndDir(); - final List<Geocache> cachesWithStaticMaps = new ArrayList<Geocache>(selected.size()); - for (Geocache cache : selected) { + final List<Geocache> cachesWithStaticMaps = new ArrayList<Geocache>(this.caches.size()); + for (Geocache cache : this.caches) { if (Settings.isStoreOfflineMaps() && cache.hasStaticMap()) { cachesWithStaticMaps.add(cache); continue; diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 921412b..c917a37 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -36,6 +36,7 @@ import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.LeastRecentlyUsedSet; import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RunnableWithArgument; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -654,42 +655,18 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto return true; } - final LoadDetailsHandler loadDetailsHandler = new LoadDetailsHandler(); - - waitDialog = new ProgressDialog(activity); - waitDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - waitDialog.setCancelable(true); - waitDialog.setCancelMessage(loadDetailsHandler.cancelMessage()); - waitDialog.setMax(detailTotal); - waitDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { - - @Override - public void onCancel(DialogInterface arg0) { - try { - if (loadDetailsThread != null) { - loadDetailsThread.stopIt(); - } - - geoDirUpdate.startDir(); - } catch (Exception e) { - Log.e("cgeocaches.onPrepareOptionsMenu.onCancel", e); - } - } - }); - - float etaTime = detailTotal * 7.0f / 60.0f; - int roundedEta = Math.round(etaTime); - if (etaTime < 0.4) { - waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + res.getString(R.string.caches_eta_ltm)); - } else { - waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + roundedEta + " " + res.getQuantityString(R.plurals.caches_eta_mins, roundedEta)); + if (Settings.getChooseList()) { + // let user select list to store cache in + new StoredList.UserInterface(activity).promptForListSelection(R.string.list_title, + new RunnableWithArgument<Integer>() { + @Override + public void run(final Integer selectedListId) { + storeCaches(geocodes, selectedListId); + } + }, true, StoredList.TEMPORARY_LIST_ID); + } else { + storeCaches(geocodes, StoredList.STANDARD_LIST_ID); } - waitDialog.show(); - - detailProgressTime = System.currentTimeMillis(); - - loadDetailsThread = new LoadDetails(loadDetailsHandler, geocodes); - loadDetailsThread.start(); } return true; case MENU_CIRCLE_MODE: @@ -1345,6 +1322,51 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } /** + * store caches, invoked by "store offline" menu item + * + * @param listId + * the list to store the caches in + */ + private void storeCaches(List<String> geocodes, int listId) { + final LoadDetailsHandler loadDetailsHandler = new LoadDetailsHandler(); + + waitDialog = new ProgressDialog(activity); + waitDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + waitDialog.setCancelable(true); + waitDialog.setCancelMessage(loadDetailsHandler.cancelMessage()); + waitDialog.setMax(detailTotal); + waitDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + + @Override + public void onCancel(DialogInterface arg0) { + try { + if (loadDetailsThread != null) { + loadDetailsThread.stopIt(); + } + + geoDirUpdate.startDir(); + } catch (Exception e) { + Log.e("cgeocaches.onPrepareOptionsMenu.onCancel", e); + } + } + }); + + float etaTime = detailTotal * 7.0f / 60.0f; + int roundedEta = Math.round(etaTime); + if (etaTime < 0.4) { + waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + res.getString(R.string.caches_eta_ltm)); + } else { + waitDialog.setMessage(res.getString(R.string.caches_downloading) + " " + roundedEta + " " + res.getQuantityString(R.plurals.caches_eta_mins, roundedEta)); + } + waitDialog.show(); + + detailProgressTime = System.currentTimeMillis(); + + loadDetailsThread = new LoadDetails(loadDetailsHandler, geocodes, listId); + loadDetailsThread.start(); + } + + /** * Thread to store the caches in the viewport. Started by Activity. */ @@ -1352,11 +1374,13 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto final private CancellableHandler handler; final private List<String> geocodes; + final private int listId; private long last = 0L; - public LoadDetails(final CancellableHandler handler, final List<String> geocodes) { + public LoadDetails(final CancellableHandler handler, final List<String> geocodes, final int listId) { this.handler = handler; this.geocodes = geocodes; + this.listId = listId; } public void stopIt() { @@ -1397,7 +1421,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto break; } - Geocache.storeCache(null, geocode, StoredList.STANDARD_LIST_ID, false, handler); + Geocache.storeCache(null, geocode, listId, false, handler); } } catch (Exception e) { Log.e("cgeocaches.LoadDetails.run", e); |
