aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java270
-rw-r--r--main/src/cgeo/geocaching/LogEntry.java6
-rw-r--r--main/src/cgeo/geocaching/NavigateAnyPointActivity.java2
-rw-r--r--main/src/cgeo/geocaching/PersonalNote.java14
-rw-r--r--main/src/cgeo/geocaching/SearchActivity.java4
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java24
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java51
-rw-r--r--main/src/cgeo/geocaching/cgData.java30
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java5
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConnector.java2
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java1
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java16
-rw-r--r--main/src/cgeo/geocaching/connector/gc/Tile.java4
-rw-r--r--main/src/cgeo/geocaching/files/LocalStorage.java7
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java24
-rw-r--r--main/src/cgeo/geocaching/network/Network.java14
-rw-r--r--main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java1
-rw-r--r--main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java7
-rw-r--r--main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java7
-rw-r--r--main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java16
-rw-r--r--main/src/cgeo/geocaching/settings/Settings.java14
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java94
-rw-r--r--main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java86
-rw-r--r--main/src/cgeo/geocaching/utils/SimpleHandler.java65
24 files changed, 510 insertions, 254 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index a5ace9e..ac9b156 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -4,6 +4,7 @@ import butterknife.InjectView;
import butterknife.Views;
import cgeo.calendar.ICalendar;
+import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.activity.AbstractViewPagerActivity;
import cgeo.geocaching.activity.Progress;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
@@ -45,6 +46,8 @@ import cgeo.geocaching.utils.ImageUtils;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.MatcherWrapper;
import cgeo.geocaching.utils.RunnableWithArgument;
+import cgeo.geocaching.utils.SimpleCancellableHandler;
+import cgeo.geocaching.utils.SimpleHandler;
import cgeo.geocaching.utils.TextUtils;
import cgeo.geocaching.utils.TranslationUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
@@ -105,6 +108,7 @@ import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TextView.BufferType;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
@@ -149,6 +153,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
private Geocache cache;
private final Progress progress = new Progress();
+
private SearchResult search;
private EditNoteDialogListener editNoteDialogListener;
@@ -178,12 +183,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// some views that must be available from everywhere // TODO: Reference can block GC?
private TextView cacheDistanceView;
- private final Handler cacheChangeNotificationHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- notifyDataSetChanged();
- }
- };
protected ImagesList imagesList;
@Override
@@ -278,7 +277,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- final LoadCacheHandler loadCacheHandler = new LoadCacheHandler();
+ final LoadCacheHandler loadCacheHandler = new LoadCacheHandler(this, progress);
try {
String title = res.getString(R.string.cache);
@@ -609,44 +608,56 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return true;
}
- private class LoadCacheHandler extends CancellableHandler {
+ private final static class LoadCacheHandler extends SimpleCancellableHandler {
+
+ public LoadCacheHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
@Override
public void handleRegularMessage(final Message msg) {
if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
updateStatusMsg((String) msg.obj);
} else {
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity == null) {
+ return;
+ }
+ SearchResult search = activity.getSearch();
if (search == null) {
- showToast(res.getString(R.string.err_dwld_details_failed));
-
- progress.dismiss();
- finish();
+ showToast(R.string.err_dwld_details_failed);
+ dismissProgress();
+ finishActivity();
return;
}
if (search.getError() != null) {
- showToast(res.getString(R.string.err_dwld_details_failed) + " " + search.getError().getErrorString(res) + ".");
-
- progress.dismiss();
- finish();
+ activity.showToast(activity.getResources().getString(R.string.err_dwld_details_failed) + " " + search.getError().getErrorString(activity.getResources()) + ".");
+ dismissProgress();
+ finishActivity();
return;
}
- updateStatusMsg(res.getString(R.string.cache_dialog_loading_details_status_render));
+ updateStatusMsg(activity.getResources().getString(R.string.cache_dialog_loading_details_status_render));
// Data loaded, we're ready to show it!
- notifyDataSetChanged();
+ activity.notifyDataSetChanged();
}
}
private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(R.string.cache_dialog_loading_details)
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity == null) {
+ return;
+ }
+ setProgressMessage(activity.getResources().getString(R.string.cache_dialog_loading_details)
+ "\n\n"
+ msg);
}
@Override
public void handleCancel(final Object extra) {
- finish();
+ finishActivity();
}
}
@@ -666,7 +677,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
// allow cache to notify CacheDetailActivity when it changes so it can be reloaded
- cache.setChangeNotificationHandler(cacheChangeNotificationHandler);
+ cache.setChangeNotificationHandler(new ChangeNotificationHandler(this, progress));
// action bar: title and icon
if (StringUtils.isNotBlank(cache.getName())) {
@@ -1183,49 +1194,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return view;
}
- private class StoreCacheHandler extends CancellableHandler {
- @Override
- public void handleRegularMessage(Message msg) {
- if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
- updateStatusMsg((String) msg.obj);
- } else {
- storeThread = null;
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
-
- private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(R.string.cache_dialog_offline_save_message)
- + "\n\n"
- + msg);
- }
- }
-
- private class RefreshCacheHandler extends CancellableHandler {
- @Override
- public void handleRegularMessage(Message msg) {
- if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
- updateStatusMsg((String) msg.obj);
- } else {
- refreshThread = null;
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
-
- private void updateStatusMsg(final String msg) {
- progress.setMessage(res.getString(R.string.cache_dialog_refresh_message)
- + "\n\n"
- + msg);
- }
- }
-
- private class DropCacheHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- CacheDetailActivity.this.notifyDataSetChanged();
- }
- }
-
private class StoreCacheClickListener implements View.OnClickListener {
@Override
public void onClick(View arg0) {
@@ -1249,7 +1217,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
protected void storeCache(int listId) {
- final StoreCacheHandler storeCacheHandler = new StoreCacheHandler();
+ final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(CacheDetailActivity.this, progress);
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());
@@ -1275,7 +1243,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- final RefreshCacheHandler refreshCacheHandler = new RefreshCacheHandler();
+ final RefreshCacheHandler refreshCacheHandler = new RefreshCacheHandler(CacheDetailActivity.this, progress);
progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_refresh_title), res.getString(R.string.cache_dialog_refresh_message), true, refreshCacheHandler.cancelMessage());
@@ -1300,6 +1268,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
cache.store(listId, handler);
+ storeThread = null;
}
}
@@ -1313,7 +1282,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
cache.refresh(cache.getListId(), handler);
-
+ refreshThread = null;
handler.sendEmptyMessage(0);
}
}
@@ -1326,24 +1295,22 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
- final DropCacheHandler dropCacheHandler = new DropCacheHandler();
-
progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_offline_drop_title), res.getString(R.string.cache_dialog_offline_drop_message), true, null);
- new DropCacheThread(dropCacheHandler).start();
+ new DropCacheThread(new ChangeNotificationHandler(CacheDetailActivity.this, progress)).start();
}
}
private class DropCacheThread extends Thread {
+ private Handler handler;
- private Handler handler = null;
-
- public DropCacheThread(Handler handlerIn) {
- handler = handlerIn;
+ public DropCacheThread(Handler handler) {
+ super();
+ this.handler = handler;
}
@Override
public void run() {
- cache.drop(handler);
+ cache.drop(this.handler);
}
}
@@ -1375,7 +1342,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_watchlist_add_title,
R.string.cache_dialog_watchlist_add_message,
- new WatchlistAddThread(new WatchlistHandler()));
+ new WatchlistAddThread(new WatchlistHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1387,7 +1354,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_watchlist_remove_title,
R.string.cache_dialog_watchlist_remove_message,
- new WatchlistRemoveThread(new WatchlistHandler()));
+ new WatchlistRemoveThread(new WatchlistHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1401,6 +1368,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(ConnectorFactory.getConnector(cache).addToWatchlist(cache) ? 1 : -1);
}
}
@@ -1415,6 +1383,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(ConnectorFactory.getConnector(cache).removeFromWatchlist(cache) ? 1 : -1);
}
}
@@ -1429,6 +1398,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(GCConnector.addToFavorites(cache) ? 1 : -1);
}
}
@@ -1443,22 +1413,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void run() {
+ watchlistThread = null;
handler.sendEmptyMessage(GCConnector.removeFromFavorites(cache) ? 1 : -1);
}
}
- private class FavoriteUpdateHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- progress.dismiss();
- if (msg.what == -1) {
- showToast(res.getString(R.string.err_favorite_failed));
- } else {
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
- }
-
/**
* Listener for "add to favorites" button
*/
@@ -1467,7 +1426,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_favorite_add_title,
R.string.cache_dialog_favorite_add_message,
- new FavoriteAddThread(new FavoriteUpdateHandler()));
+ new FavoriteAddThread(new FavoriteUpdateHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1479,7 +1438,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void onClick(View arg0) {
doExecute(R.string.cache_dialog_favorite_remove_title,
R.string.cache_dialog_favorite_remove_message,
- new FavoriteRemoveThread(new FavoriteUpdateHandler()));
+ new FavoriteRemoveThread(new FavoriteUpdateHandler(CacheDetailActivity.this, progress)));
}
}
@@ -1607,22 +1566,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
- /**
- * Handler, called when watchlist add or remove is done
- */
- private class WatchlistHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- watchlistThread = null;
- progress.dismiss();
- if (msg.what == -1) {
- showToast(res.getString(R.string.err_watchlist_failed));
- } else {
- CacheDetailActivity.this.notifyDataSetChanged(); // reload cache details
- }
- }
- }
-
private class PreviewMapTask extends AsyncTask<Void, Void, BitmapDrawable> {
@Override
protected BitmapDrawable doInBackground(Void... parameters) {
@@ -1805,7 +1748,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
Thread currentThread;
private void uploadPersonalNote() {
- final SimpleHandler myHandler = new SimpleHandler();
+ final SimpleCancellableHandler myHandler = new SimpleCancellableHandler(CacheDetailActivity.this, progress);
Message cancelMessage = myHandler.cancelMessage(res.getString(R.string.cache_personal_note_upload_cancelled));
progress.show(CacheDetailActivity.this, res.getString(R.string.cache_personal_note_uploading), res.getString(R.string.cache_personal_note_uploading), true, cancelMessage);
@@ -2311,24 +2254,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
}
- public class SimpleHandler extends CancellableHandler {
- public static final String SUCCESS_TEXT = "success_message";
-
- @Override
- public void handleRegularMessage(final Message msg) {
- if (msg.getData() != null && msg.getData().getString(SUCCESS_TEXT) != null) {
- showToast(msg.getData().getString(SUCCESS_TEXT));
- }
- progress.dismiss();
- }
-
- @Override
- public void handleCancel(final Object extra) {
- showToast((String) extra);
- progress.dismiss();
- }
- }
-
private class UploadPersonalNoteThread extends Thread {
private Geocache cache = null;
private CancellableHandler handler = null;
@@ -2346,7 +2271,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
Message msg = Message.obtain();
Bundle bundle = new Bundle();
- bundle.putString(SimpleHandler.SUCCESS_TEXT, res.getString(R.string.cache_personal_note_upload_done));
+ bundle.putString(SimpleCancellableHandler.SUCCESS_TEXT, res.getString(R.string.cache_personal_note_upload_done));
msg.setData(bundle);
handler.sendMessage(msg);
}
@@ -2460,4 +2385,95 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return cache;
}
+ public SearchResult getSearch() {
+ return search;
+ }
+
+ private static final class StoreCacheHandler extends SimpleCancellableHandler {
+
+ public StoreCacheHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleRegularMessage(Message msg) {
+ if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
+ updateStatusMsg(R.string.cache_dialog_offline_save_message, (String) msg.obj);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ private static final class RefreshCacheHandler extends SimpleCancellableHandler {
+
+ public RefreshCacheHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleRegularMessage(Message msg) {
+ if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
+ updateStatusMsg(R.string.cache_dialog_refresh_message, (String) msg.obj);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ private static final class ChangeNotificationHandler extends SimpleHandler {
+
+ public ChangeNotificationHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+
+ private static final class FavoriteUpdateHandler extends SimpleHandler {
+
+ public FavoriteUpdateHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == -1) {
+ dismissProgress();
+ showToast(R.string.err_favorite_failed);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ /**
+ * Handler, called when watchlist add or remove is done
+ */
+ private static final class WatchlistHandler extends SimpleHandler {
+
+ public WatchlistHandler(CacheDetailActivity activity, Progress progress) {
+ super(activity, progress);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == -1) {
+ dismissProgress();
+ showToast(R.string.err_watchlist_failed);
+ } else {
+ notifyDatasetChanged(activityRef);
+ }
+ }
+ }
+
+ private static void notifyDatasetChanged(WeakReference<AbstractActivity> activityRef) {
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity != null) {
+ activity.notifyDataSetChanged();
+ }
+ }
}
diff --git a/main/src/cgeo/geocaching/LogEntry.java b/main/src/cgeo/geocaching/LogEntry.java
index 790becd..0121424 100644
--- a/main/src/cgeo/geocaching/LogEntry.java
+++ b/main/src/cgeo/geocaching/LogEntry.java
@@ -38,7 +38,7 @@ public final class LogEntry {
this(Settings.getUsername(), dateInMilliSeconds, type, text);
}
- public LogEntry(final String author, long dateInMilliSeconds, final LogType type, final String text) {
+ public LogEntry(final String author, final long dateInMilliSeconds, final LogType type, final String text) {
this.author = author;
this.date = dateInMilliSeconds;
this.type = type;
@@ -51,7 +51,7 @@ public final class LogEntry {
}
@Override
- public boolean equals(Object obj) {
+ public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
@@ -109,7 +109,7 @@ public final class LogEntry {
public String getDisplayText() {
if (Settings.getPlainLogs()) {
MatcherWrapper matcher = new MatcherWrapper(PATTERN_REMOVE_COLORS, log);
- return matcher.replaceAll("");
+ return matcher.replaceAll(StringUtils.EMPTY);
}
return log;
}
diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
index e7ffc3b..be4ef05 100644
--- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
+++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java
@@ -62,7 +62,7 @@ public class NavigateAnyPointActivity extends AbstractActivity {
private int contextMenuItemPosition;
- private String distanceUnit = "";
+ private String distanceUnit = StringUtils.EMPTY;
protected static class ViewHolder extends AbstractViewHolder {
@InjectView(R.id.simple_way_point_longitude) protected TextView longitude;
diff --git a/main/src/cgeo/geocaching/PersonalNote.java b/main/src/cgeo/geocaching/PersonalNote.java
index 3413307..82e88f7 100644
--- a/main/src/cgeo/geocaching/PersonalNote.java
+++ b/main/src/cgeo/geocaching/PersonalNote.java
@@ -4,8 +4,7 @@ import org.apache.commons.lang3.StringUtils;
public class PersonalNote {
- private static final String MERGED_PREFIX = "merged:\n";
- private static final String SEPARATOR = "--\n";
+ private static final String SEPARATOR = "\n--\n";
private String cgeoNote;
private String providerNote;
private boolean isOffline;
@@ -15,23 +14,18 @@ public class PersonalNote {
}
public PersonalNote(final Geocache cache) {
+ this.isOffline = cache.isOffline();
final String personalNote = cache.getPersonalNote();
- if (!StringUtils.startsWith(personalNote, MERGED_PREFIX)) {
- this.providerNote = personalNote;
+ if (StringUtils.isEmpty(personalNote)) {
return;
}
final String[] notes = StringUtils.splitByWholeSeparator(personalNote, SEPARATOR);
- if (notes.length > 0) {
- notes[0] = StringUtils.removeStart(notes[0], MERGED_PREFIX);
- notes[0] = StringUtils.removeEnd(notes[0], "\n");
- }
if (notes.length > 1) {
this.cgeoNote = notes[0];
this.providerNote = notes[1];
} else {
this.providerNote = notes[0];
}
- this.isOffline = cache.isOffline();
}
public final PersonalNote mergeWith(final PersonalNote other) {
@@ -95,7 +89,7 @@ public class PersonalNote {
public final String toString() {
final StringBuilder builder = new StringBuilder();
if (cgeoNote != null) {
- builder.append(MERGED_PREFIX).append(cgeoNote).append("\n").append(SEPARATOR);
+ builder.append(cgeoNote).append(SEPARATOR);
}
builder.append(providerNote);
return builder.toString();
diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java
index b1a58a4..6285cda 100644
--- a/main/src/cgeo/geocaching/SearchActivity.java
+++ b/main/src/cgeo/geocaching/SearchActivity.java
@@ -127,9 +127,7 @@ public class SearchActivity extends AbstractActivity {
final IConnector connector = ConnectorFactory.getConnector(geocode);
if (connector instanceof ISearchByGeocode) {
- final Intent cachesIntent = new Intent(this, CacheDetailActivity.class);
- cachesIntent.putExtra(Intents.EXTRA_GEOCODE, geocode.toUpperCase(Locale.US));
- startActivity(cachesIntent);
+ CacheDetailActivity.startActivity(this, geocode.toUpperCase(Locale.US));
return true;
}
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index 4658262..2268df9 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -33,7 +33,7 @@ public class StaticMapsActivity extends AbstractActivity {
private static final String EXTRAS_GEOCODE = "geocode";
@Extra(EXTRAS_DOWNLOAD) boolean download = false;
- @Extra(EXTRAS_WAYPOINT) Integer waypoint_id = null;
+ @Extra(EXTRAS_WAYPOINT) Integer waypointId = null;
@Extra(EXTRAS_GEOCODE) String geocode = null;
private final List<Bitmap> maps = new ArrayList<Bitmap>();
@@ -43,7 +43,7 @@ public class StaticMapsActivity extends AbstractActivity {
private final Handler loadMapsHandler = new Handler() {
@Override
- public void handleMessage(Message msg) {
+ public void handleMessage(final Message msg) {
if (waitDialog != null) {
waitDialog.dismiss();
}
@@ -92,7 +92,7 @@ public class StaticMapsActivity extends AbstractActivity {
}
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.staticmaps_activity);
if (geocode == null) {
@@ -107,12 +107,6 @@ public class StaticMapsActivity extends AbstractActivity {
(new LoadMapsThread()).start();
}
- @Override
- public void onResume() {
- super.onResume();
-
- }
-
private class LoadMapsThread extends Thread {
@Override
@@ -120,11 +114,11 @@ public class StaticMapsActivity extends AbstractActivity {
try {
// try downloading 2 times
for (int trials = 0; trials < 2; trials++) {
- for (int level = 1; level <= 5; level++) {
+ for (int level = 1; level <= StaticMapsProvider.MAPS_LEVEL_MAX; level++) {
try {
- if (waypoint_id != null) {
+ if (waypointId != null) {
final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
- final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, cache.getWaypointById(waypoint_id), level);
+ final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, cache.getWaypointById(waypointId), level);
if (image != null) {
maps.add(image);
}
@@ -158,12 +152,12 @@ public class StaticMapsActivity extends AbstractActivity {
private boolean downloadStaticMaps() {
final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
- if (waypoint_id == null) {
+ if (waypointId == null) {
showToast(res.getString(R.string.info_storing_static_maps));
StaticMapsProvider.storeCacheStaticMap(cache, true);
return cache.hasStaticMap();
}
- final Waypoint waypoint = cache.getWaypointById(waypoint_id);
+ final Waypoint waypoint = cache.getWaypointById(waypointId);
if (waypoint != null) {
showToast(res.getString(R.string.info_storing_static_maps));
// refresh always removes old waypoint files
@@ -178,7 +172,7 @@ public class StaticMapsActivity extends AbstractActivity {
public static void startActivity(final Context activity, final String geocode, final boolean download, final Waypoint waypoint) {
StaticMapsActivity_.IntentBuilder_ builder = StaticMapsActivity_.intent(activity).geocode(geocode).download(download);
if (waypoint != null) {
- builder.waypoint_id(waypoint.getId());
+ builder.waypointId(waypoint.getId());
}
builder.start();
}
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index 041e703..2555b80 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -24,7 +24,8 @@ import android.view.WindowManager;
import java.io.File;
import java.util.concurrent.TimeUnit;
-public class StaticMapsProvider {
+public final class StaticMapsProvider {
+ static final int MAPS_LEVEL_MAX = 5;
private static final String PREFIX_PREVIEW = "preview";
private static final String GOOGLE_STATICMAP_URL = "http://maps.google.com/maps/api/staticmap";
private static final String SATELLITE = "satellite";
@@ -32,16 +33,22 @@ public class StaticMapsProvider {
private static final String WAYPOINT_PREFIX = "wp";
private static final String MAP_FILENAME_PREFIX = "map_";
private static final String MARKERS_URL = "http://status.cgeo.org/assets/markers/";
- /** We assume there is no real usable image with less than 1k */
+
+ /** We assume there is no real usable image with less than 1k. */
private static final int MIN_MAP_IMAGE_BYTES = 1000;
+
/** ThreadPool restricting this to 1 Thread. **/
- private static final BlockingThreadPool pool = new BlockingThreadPool(1, Thread.MIN_PRIORITY);
+ private static final BlockingThreadPool POOL = new BlockingThreadPool(1, Thread.MIN_PRIORITY);
+
+ private StaticMapsProvider() {
+ // utility class
+ }
- private static File getMapFile(final String geocode, String prefix, final boolean createDirs) {
+ private static File getMapFile(final String geocode, final String prefix, final boolean createDirs) {
return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix, false, createDirs);
}
- private static void downloadDifferentZooms(final String geocode, String markerUrl, String prefix, String latlonMap, int edge, final Parameters waypoints) {
+ private static void downloadDifferentZooms(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge, final Parameters waypoints) {
downloadMap(geocode, 20, SATELLITE, markerUrl, prefix + '1', "", latlonMap, edge, edge, waypoints);
downloadMap(geocode, 18, SATELLITE, markerUrl, prefix + '2', "", latlonMap, edge, edge, waypoints);
downloadMap(geocode, 16, ROADMAP, markerUrl, prefix + '3', "", latlonMap, edge, edge, waypoints);
@@ -49,7 +56,7 @@ public class StaticMapsProvider {
downloadMap(geocode, 11, ROADMAP, markerUrl, prefix + '5', "", latlonMap, edge, edge, waypoints);
}
- private static void downloadMap(String geocode, int zoom, String mapType, String markerUrl, String prefix, String shadow, String latlonMap, int width, int height, final Parameters waypoints) {
+ private static void downloadMap(final String geocode, final int zoom, final String mapType, final String markerUrl, final String prefix, final String shadow, final String latlonMap, final int width, final int height, final Parameters waypoints) {
final Parameters params = new Parameters(
"center", latlonMap,
"zoom", String.valueOf(zoom),
@@ -80,7 +87,7 @@ public class StaticMapsProvider {
}
}
- public static void downloadMaps(Geocache cache) {
+ public static void downloadMaps(final Geocache cache) {
if ((!Settings.isStoreOfflineMaps() && !Settings.isStoreOfflineWpMaps()) || StringUtils.isBlank(cache.getGeocode())) {
return;
}
@@ -110,19 +117,19 @@ public class StaticMapsProvider {
* @param edge
* The boundings
*/
- private static void refreshAllWpStaticMaps(Geocache cache, int edge) {
+ private static void refreshAllWpStaticMaps(final Geocache cache, final int edge) {
LocalStorage.deleteFilesWithPrefix(cache.getGeocode(), MAP_FILENAME_PREFIX + WAYPOINT_PREFIX);
for (Waypoint waypoint : cache.getWaypoints()) {
storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, false);
}
}
- public static void storeWaypointStaticMap(Geocache cache, Waypoint waypoint, boolean waitForResult) {
+ public static void storeWaypointStaticMap(final Geocache cache, final Waypoint waypoint, final boolean waitForResult) {
int edge = StaticMapsProvider.guessMaxDisplaySide();
storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, waitForResult);
}
- private static void storeWaypointStaticMap(final String geocode, int edge, Waypoint waypoint, final boolean waitForResult) {
+ private static void storeWaypointStaticMap(final String geocode, final int edge, final Waypoint waypoint, final boolean waitForResult) {
if (geocode == null) {
Log.e("storeWaypointStaticMap - missing input parameter geocode");
return;
@@ -142,7 +149,7 @@ public class StaticMapsProvider {
}
}
- public static void storeCacheStaticMap(Geocache cache, final boolean waitForResult) {
+ public static void storeCacheStaticMap(final Geocache cache, final boolean waitForResult) {
int edge = guessMaxDisplaySide();
storeCacheStaticMap(cache, edge, waitForResult);
}
@@ -179,7 +186,7 @@ public class StaticMapsProvider {
}
private static void downloadMaps(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge,
- final Parameters waypoints, boolean waitForResult) {
+ final Parameters waypoints, final boolean waitForResult) {
if (waitForResult) {
downloadDifferentZooms(geocode, markerUrl, prefix, latlonMap, edge, waypoints);
}
@@ -191,7 +198,7 @@ public class StaticMapsProvider {
}
};
try {
- pool.add(currentTask, 20, TimeUnit.SECONDS);
+ POOL.add(currentTask, 20, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Log.e("StaticMapsProvider.downloadMaps error adding task", e);
}
@@ -215,13 +222,13 @@ public class StaticMapsProvider {
return MARKERS_URL + "marker_waypoint_" + type + ".png";
}
- public static void removeWpStaticMaps(Waypoint waypoint, final String geocode) {
+ public static void removeWpStaticMaps(final Waypoint waypoint, final String geocode) {
if (waypoint == null) {
return;
}
int waypointId = waypoint.getId();
int waypointMapHash = waypoint.getStaticMapsHashcode();
- for (int level = 1; level <= 5; level++) {
+ for (int level = 1; level <= MAPS_LEVEL_MAX; level++) {
try {
StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + '_' + level, false).delete();
} catch (Exception e) {
@@ -244,7 +251,7 @@ public class StaticMapsProvider {
if (StringUtils.isBlank(geocode)) {
return false;
}
- for (int level = 1; level <= 5; level++) {
+ for (int level = 1; level <= MAPS_LEVEL_MAX; level++) {
File mapFile = StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false);
if (mapFile.exists()) {
return true;
@@ -260,10 +267,10 @@ public class StaticMapsProvider {
* @param waypoint
* @return <code>true</code> if at least one map file exists; <code>false</code> otherwise
*/
- public static boolean hasStaticMapForWaypoint(String geocode, Waypoint waypoint) {
+ public static boolean hasStaticMapForWaypoint(final String geocode, final Waypoint waypoint) {
int waypointId = waypoint.getId();
int waypointMapHash = waypoint.getStaticMapsHashcode();
- for (int level = 1; level <= 5; level++) {
+ for (int level = 1; level <= MAPS_LEVEL_MAX; level++) {
File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false);
if (mapFile.exists()) {
return true;
@@ -279,10 +286,10 @@ public class StaticMapsProvider {
* @param waypoint
* @return <code>true</code> if all map files exist; <code>false</code> otherwise
*/
- public static boolean hasAllStaticMapsForWaypoint(String geocode, Waypoint waypoint) {
+ public static boolean hasAllStaticMapsForWaypoint(final String geocode, final Waypoint waypoint) {
int waypointId = waypoint.getId();
int waypointMapHash = waypoint.getStaticMapsHashcode();
- for (int level = 1; level <= 5; level++) {
+ for (int level = 1; level <= MAPS_LEVEL_MAX; level++) {
File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false);
boolean mapExists = mapFile.exists();
if (!mapExists) {
@@ -296,13 +303,13 @@ public class StaticMapsProvider {
return decodeFile(StaticMapsProvider.getMapFile(geocode, PREFIX_PREVIEW, false));
}
- public static Bitmap getWaypointMap(final String geocode, Waypoint waypoint, int level) {
+ public static Bitmap getWaypointMap(final String geocode, final Waypoint waypoint, final int level) {
int waypointId = waypoint.getId();
int waypointMapHash = waypoint.getStaticMapsHashcode();
return decodeFile(StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false));
}
- public static Bitmap getCacheMap(final String geocode, int level) {
+ public static Bitmap getCacheMap(final String geocode, final int level) {
return decodeFile(StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false));
}
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index ead698d..87710fb 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -1102,7 +1102,6 @@ public class cgData {
//try to update record else insert fresh..
database.beginTransaction();
- boolean result = false;
try {
saveAttributesWithoutTransaction(cache);
saveOriginalWaypointsWithoutTransaction(cache);
@@ -1118,14 +1117,14 @@ public class cgData {
database.insert(dbTableCaches, null, values);
}
database.setTransactionSuccessful();
- result = true;
+ return true;
} catch (Exception e) {
Log.e("SaveCache", e);
} finally {
database.endTransaction();
}
- return result;
+ return false;
}
private static void saveAttributesWithoutTransaction(final Geocache cache) {
@@ -1172,17 +1171,16 @@ public class cgData {
init();
database.beginTransaction();
- boolean result = false;
try {
saveOriginalWaypointsWithoutTransaction(cache);
database.setTransactionSuccessful();
- result = true;
+ return true;
} catch (Exception e) {
Log.e("saveWaypoints", e);
} finally {
database.endTransaction();
}
- return result;
+ return false;
}
private static void saveOriginalWaypointsWithoutTransaction(final Geocache cache) {
@@ -1376,7 +1374,7 @@ public class cgData {
}
}
- public static boolean saveTrackable(final Trackable trackable) {
+ public static void saveTrackable(final Trackable trackable) {
init();
database.beginTransaction();
@@ -1386,8 +1384,6 @@ public class cgData {
} finally {
database.endTransaction();
}
-
- return true;
}
private static void saveInventoryWithoutTransaction(final String geocode, final List<Trackable> trackables) {
@@ -1842,18 +1838,17 @@ public class cgData {
init();
database.beginTransaction();
- boolean success = true;
try {
database.delete(dbTableSearchDestionationHistory, null, null);
database.setTransactionSuccessful();
+ return true;
} catch (Exception e) {
- success = false;
Log.e("Unable to clear searched destinations", e);
} finally {
database.endTransaction();
}
- return success;
+ return false;
}
public static List<LogEntry> loadLogs(String geocode) {
@@ -2693,18 +2688,17 @@ public class cgData {
init();
database.beginTransaction();
- boolean result = false;
try {
database.delete(dbTableSearchDestionationHistory, "_id = " + destination.getId(), null);
database.setTransactionSuccessful();
- result = true;
+ return true;
} catch (Exception e) {
Log.e("Unable to remove searched destination", e);
} finally {
database.endTransaction();
}
- return result;
+ return false;
}
/**
@@ -3007,14 +3001,14 @@ public class cgData {
if (connector.canHandle(geocode)) {
Geocache geocache = cacheCache.getCacheFromCache(geocode);
if (geocache.getZoomLevel() <= maxZoom) {
- boolean bFound = false;
+ boolean found = false;
for (Tile tile : tiles) {
if (tile.containsPoint(geocache)) {
- bFound = true;
+ found = true;
break;
}
}
- if (bFound) {
+ if (found) {
missingFromSearch.add(geocode);
}
}
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index e388078..5d7841d 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -907,10 +907,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
NavigationAppFactory.showNavigationMenu(this, cache, null, null);
break;
case MENU_CACHE_DETAILS:
- final Intent cachesIntent = new Intent(this, CacheDetailActivity.class);
- cachesIntent.putExtra(Intents.EXTRA_GEOCODE, cache.getGeocode());
- cachesIntent.putExtra(Intents.EXTRA_NAME, cache.getName());
- startActivity(cachesIntent);
+ CacheDetailActivity.startActivity(this, cache.getGeocode(), cache.getName());
break;
case MENU_DROP_CACHE:
cache.drop(new Handler() {
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
index 44d6e8f..e6fff79 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
@@ -309,7 +309,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode,
// invoke settings activity to insert login details
if (status == StatusCode.NO_LOGIN_INFO_STORED && fromActivity != null) {
- SettingsActivity.startWithServicesPage(fromActivity);
+ SettingsActivity.jumpToServicesPage(fromActivity);
}
}
return status == StatusCode.NO_ERROR;
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
index d908b47..c2aeffd 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
@@ -127,6 +127,7 @@ public final class GCConstants {
public final static Pattern PATTERN_SEARCH_TOTALCOUNT = Pattern.compile("<span>Total Records\\D*(\\d+)<");
public final static Pattern PATTERN_SEARCH_RECAPTCHA = Pattern.compile("<script[^>]*src=\"[^\"]*/recaptcha/api/challenge\\?k=([^\"]+)\"[^>]*>");
public final static Pattern PATTERN_SEARCH_RECAPTCHACHALLENGE = Pattern.compile("challenge : '([^']+)'");
+ public final static Pattern PATTERN_SEARCH_HIDDEN_DATE = Pattern.compile("<span class=\"small\">([\\d-/]{6,10})</span>");
/**
* Patterns for waypoints
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index 9ecb51b..e32f72d 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -5,7 +5,6 @@ import cgeo.geocaching.Image;
import cgeo.geocaching.LogEntry;
import cgeo.geocaching.R;
import cgeo.geocaching.SearchResult;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.Trackable;
import cgeo.geocaching.TrackableLog;
import cgeo.geocaching.Waypoint;
@@ -27,6 +26,7 @@ import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.loaders.RecaptchaReceiver;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.DirectionImage;
import cgeo.geocaching.utils.CancellableHandler;
import cgeo.geocaching.utils.Log;
@@ -53,6 +53,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
import java.util.EnumSet;
import java.util.GregorianCalendar;
import java.util.List;
@@ -199,6 +200,19 @@ public abstract class GCParser {
final String container = TextUtils.getMatch(row, GCConstants.PATTERN_SEARCH_CONTAINER, false, 1, null, false);
cache.setSize(CacheSize.getById(container));
+ // date hidden, makes sorting event caches easier
+ final String dateHidden = TextUtils.getMatch(row, GCConstants.PATTERN_SEARCH_HIDDEN_DATE, false, 1, null, false);
+ if (StringUtils.isNotBlank(dateHidden)) {
+ try {
+ Date date = Login.parseGcCustomDate(dateHidden);
+ if (date != null) {
+ cache.setHidden(date);
+ }
+ } catch (ParseException e) {
+ Log.e("Error parsing event date from search");
+ }
+ }
+
// cache inventory
final MatcherWrapper matcherTbs = new MatcherWrapper(GCConstants.PATTERN_SEARCH_TRACKABLES, row);
String inventoryPre = null;
diff --git a/main/src/cgeo/geocaching/connector/gc/Tile.java b/main/src/cgeo/geocaching/connector/gc/Tile.java
index ec90036..3177f2c 100644
--- a/main/src/cgeo/geocaching/connector/gc/Tile.java
+++ b/main/src/cgeo/geocaching/connector/gc/Tile.java
@@ -324,6 +324,10 @@ public class Tile {
public static void add(final Tile tile) {
tileCache.put(tile.hashCode(), tile);
}
+
+ public static void clear() {
+ tileCache.clear();
+ }
}
}
diff --git a/main/src/cgeo/geocaching/files/LocalStorage.java b/main/src/cgeo/geocaching/files/LocalStorage.java
index 0f3e0e1..ec09433 100644
--- a/main/src/cgeo/geocaching/files/LocalStorage.java
+++ b/main/src/cgeo/geocaching/files/LocalStorage.java
@@ -31,6 +31,9 @@ import java.io.OutputStream;
*/
public class LocalStorage {
+ public static final String HEADER_LAST_MODIFIED = "last-modified";
+ public static final String HEADER_ETAG = "etag";
+
/** Name of the local private directory used to hold cached information */
public final static String cache = ".cgeo";
@@ -177,8 +180,8 @@ public class LocalStorage {
try {
final boolean saved = saveToFile(response.getEntity().getContent(), targetFile);
- saveHeader("etag", saved ? response : null, targetFile);
- saveHeader("last-modified", saved ? response : null, targetFile);
+ saveHeader(HEADER_ETAG, saved ? response : null, targetFile);
+ saveHeader(HEADER_LAST_MODIFIED, saved ? response : null, targetFile);
return saved;
} catch (IOException e) {
Log.e("LocalStorage.saveEntityToFile", e);
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index 007f707..f892622 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -13,6 +13,7 @@ import cgeo.geocaching.cgeocaches;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.gc.Login;
+import cgeo.geocaching.connector.gc.Tile;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy;
import cgeo.geocaching.enumerations.LoadFlags;
@@ -182,7 +183,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
/** Live mode enabled for map. **/
private boolean isLiveEnabled;
// other things
- private boolean liveChanged = false; // previous state for loadTimer
+ private boolean markersInvalidated = false; // previous state for loadTimer
private boolean centered = false; // if map is already centered
private boolean alreadyCentered = false; // -""- for setting my location
private static Set<String> dirtyCaches = null;
@@ -571,6 +572,13 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
item.setTitle(res.getString(R.string.map_live_enable));
}
+ item = menu.findItem(R.id.menu_mycaches_mode); // own & found caches
+ if (Settings.isExcludeMyCaches()) {
+ item.setTitle(res.getString(R.string.map_mycaches_show));
+ } else {
+ item.setTitle(res.getString(R.string.map_mycaches_hide));
+ }
+
final Set<String> geocodesInViewport = getGeocodesForCachesInViewport();
menu.findItem(R.id.menu_store_caches).setEnabled(!isLoading() && CollectionUtils.isNotEmpty(geocodesInViewport) && new SearchResult(geocodesInViewport).hasUnsavedCaches());
@@ -622,7 +630,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
if (mapMode == MapMode.LIVE) {
Settings.setLiveMap(isLiveEnabled);
}
- liveChanged = true;
+ markersInvalidated = true;
lastSearchResult = null;
searchIntent = null;
ActivityMixin.invalidateOptionsMenu(activity);
@@ -670,6 +678,14 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
mapView.repaintRequired(overlayCaches);
ActivityMixin.invalidateOptionsMenu(activity);
return true;
+ case R.id.menu_mycaches_mode:
+ Settings.setExcludeMine(!Settings.isExcludeMyCaches());
+ markersInvalidated = true;
+ ActivityMixin.invalidateOptionsMenu(activity);
+ if (!Settings.isExcludeMyCaches()) {
+ Tile.Cache.clear();
+ }
+ return true;
case R.id.menu_theme_mode:
selectMapTheme();
return true;
@@ -1018,7 +1034,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// check if map moved or zoomed
//TODO Portree Use Rectangle inside with bigger search window. That will stop reloading on every move
- final boolean moved = liveChanged || (isLiveEnabled && !downloaded) || (viewport == null) || zoomNow != zoom ||
+ final boolean moved = markersInvalidated || (isLiveEnabled && !downloaded) || (viewport == null) || zoomNow != zoom ||
(mapMoved(viewport, viewportNow) && (cachesCnt <= 0 || CollectionUtils.isEmpty(caches) || !viewport.includes(viewportNow)));
// update title on any change
@@ -1029,7 +1045,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
// save new values
if (moved) {
- liveChanged = false;
+ markersInvalidated = false;
long currentTime = System.currentTimeMillis();
diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java
index 14a9513..2d2ab0b 100644
--- a/main/src/cgeo/geocaching/network/Network.java
+++ b/main/src/cgeo/geocaching/network/Network.java
@@ -1,9 +1,9 @@
package cgeo.geocaching.network;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.files.LocalStorage;
-import cgeo.geocaching.utils.TextUtils;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.TextUtils;
import ch.boye.httpclientandroidlib.Header;
import ch.boye.httpclientandroidlib.HeaderElement;
@@ -317,12 +317,14 @@ public abstract class Network {
return null;
}
- final String etag = LocalStorage.getSavedHeader(cacheFile, "etag");
+ final String etag = LocalStorage.getSavedHeader(cacheFile, LocalStorage.HEADER_ETAG);
if (etag != null) {
+ // The ETag is a more robust check than a timestamp. If we have an ETag, it is enough
+ // to identify the right version of the resource.
return new Parameters("If-None-Match", etag);
}
- final String lastModified = LocalStorage.getSavedHeader(cacheFile, "last-modified");
+ final String lastModified = LocalStorage.getSavedHeader(cacheFile, LocalStorage.HEADER_LAST_MODIFIED);
if (lastModified != null) {
return new Parameters("If-Modified-Since", lastModified);
}
@@ -476,10 +478,10 @@ public abstract class Network {
/**
* Checks if the device has network connection.
- *
+ *
* @param context
* context of the application, cannot be null
- *
+ *
* @return <code>true</code> if the device is connected to the network.
*/
public static boolean isNetworkConnected(Context context) {
diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
index 751443e..8dc8b03 100644
--- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
+++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
@@ -82,6 +82,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity {
pinEntryButton.setVisibility(View.GONE);
+ setResult(RESULT_OK);
finish();
} else {
showToast(getErrAuthProcess());
diff --git a/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java b/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java
index 4ef3086..28807eb 100644
--- a/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java
+++ b/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java
@@ -25,16 +25,21 @@ public class AuthorizeOcDePreference extends Preference {
@Override
protected View onCreateView(ViewGroup parent) {
+ final SettingsActivity activity = (SettingsActivity) getContext();
+
setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent authIntent = new Intent(preference.getContext(),
OCAuthorizationActivity.class);
- preference.getContext().startActivity(authIntent);
+ activity.startActivityForResult(authIntent,
+ SettingsActivity.OAUTH_OCDE_REQUEST);
return false; // no shared preference has to be changed
}
});
+
+ activity.setOCDEAuthTitle();
return super.onCreateView(parent);
}
}
diff --git a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java
index 1a6d908..ed3e159 100644
--- a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java
+++ b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java
@@ -25,16 +25,21 @@ public class AuthorizeTwitterPreference extends Preference {
@Override
protected View onCreateView(ViewGroup parent) {
+ final SettingsActivity activity = (SettingsActivity) getContext();
+
setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent authIntent = new Intent(preference.getContext(),
TwitterAuthorizationActivity.class);
- preference.getContext().startActivity(authIntent);
+ activity.startActivityForResult(authIntent,
+ SettingsActivity.OAUTH_TWITTER_REQUEST);
return false; // no shared preference has to be changed
}
});
+
+ activity.setTwitterAuthTitle();
return super.onCreateView(parent);
}
}
diff --git a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
index 877a6c7..3ecd1b2 100644
--- a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
+++ b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
@@ -1,6 +1,5 @@
package cgeo.geocaching.settings;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.R;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.connector.gc.Login;
@@ -12,7 +11,6 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import android.annotation.SuppressLint;
-import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.Resources;
@@ -48,7 +46,7 @@ public class CheckGcCredentialsPreference extends Preference {
private class GcLoginCheck implements OnPreferenceClickListener {
private Resources res;
- private Activity activity;
+ private SettingsActivity activity;
private ProgressDialog loginDialog;
@SuppressLint("HandlerLeak")
@@ -76,17 +74,19 @@ public class CheckGcCredentialsPreference extends Preference {
} catch (Exception e) {
ActivityMixin.showToast(activity, R.string.err_login_failed);
Log.e("SettingsActivity.logInHandler", e);
- }
-
- if (loginDialog != null && loginDialog.isShowing()) {
- loginDialog.dismiss();
+ } finally {
+ if (loginDialog != null && loginDialog.isShowing()) {
+ loginDialog.dismiss();
+ }
+ // enable/disable basic member preferences
+ activity.initBasicMemberPreferences();
}
}
};
@Override
public boolean onPreferenceClick(Preference preference) {
- this.activity = (Activity) CheckGcCredentialsPreference.this.getContext();
+ this.activity = (SettingsActivity) CheckGcCredentialsPreference.this.getContext();
this.res = activity.getResources();
ImmutablePair<String, String> credentials = Settings.getGcLogin();
diff --git a/main/src/cgeo/geocaching/settings/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java
index 08f30af..aabb13a 100644
--- a/main/src/cgeo/geocaching/settings/Settings.java
+++ b/main/src/cgeo/geocaching/settings/Settings.java
@@ -316,6 +316,11 @@ public final class Settings {
return getString(R.string.pref_ocde_tokensecret, "");
}
+ public static boolean hasOCDEAuthorization() {
+ return StringUtils.isNotBlank(getOCDETokenPublic())
+ && StringUtils.isNotBlank(getOCDETokenSecret());
+ }
+
public static void setOCDETokens(final String tokenPublic,
final String tokenSecret, boolean enableOcDe) {
putString(R.string.pref_ocde_tokenpublic, tokenPublic);
@@ -735,6 +740,11 @@ public final class Settings {
}
+ public static boolean hasTwitterAuthorization() {
+ return StringUtils.isNotBlank(getTokenPublic())
+ && StringUtils.isNotBlank(getTokenSecret());
+ }
+
public static void setTwitterTokens(final String tokenPublic,
final String tokenSecret, boolean enableTwitter) {
putString(R.string.pref_twitter_token_public, tokenPublic);
@@ -753,7 +763,7 @@ public final class Settings {
}
public static ImmutablePair<String, String> getTempToken() {
- String tokenPublic = getString(R.string.pref_twitter_token_public, null);
+ String tokenPublic = getString(R.string.pref_temp_twitter_token_public, null);
String tokenSecret = getString(R.string.pref_temp_twitter_token_secret, null);
return new ImmutablePair<String, String>(tokenPublic, tokenSecret);
}
@@ -934,7 +944,7 @@ public final class Settings {
putBoolean(R.string.pref_excludedisabled, exclude);
}
- static void setExcludeMine(final boolean exclude) {
+ public static void setExcludeMine(final boolean exclude) {
putBoolean(R.string.pref_excludemine, exclude);
}
diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java
index 299290a..4b1c92b 100644
--- a/main/src/cgeo/geocaching/settings/SettingsActivity.java
+++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java
@@ -38,7 +38,9 @@ import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
+import android.widget.BaseAdapter;
import android.widget.EditText;
+import android.widget.ListAdapter;
import java.io.File;
import java.util.ArrayList;
@@ -62,6 +64,8 @@ public class SettingsActivity extends PreferenceActivity {
private static final int INTENT_GOTO_SERVICES = 1;
private static final int DIR_CHOOSER_MAPS_DIRECTORY_REQUEST = 4;
+ static final int OAUTH_OCDE_REQUEST = 5;
+ static final int OAUTH_TWITTER_REQUEST = 6;
private EditText signatureText;
@@ -99,8 +103,8 @@ public class SettingsActivity extends PreferenceActivity {
int gotoPage = intent.getIntExtra(INTENT_GOTO, 0);
if (gotoPage == INTENT_GOTO_SERVICES) {
// start with services screen
- PreferenceScreen main = (PreferenceScreen) SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_main_screen));
- int index = SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_services_screen)).getOrder();
+ PreferenceScreen main = (PreferenceScreen) getPreference(R.string.pref_fakekey_main_screen);
+ int index = getPreference(R.string.pref_fakekey_services_screen).getOrder();
main.onItemClick(null, null, index, 0);
}
}
@@ -128,7 +132,7 @@ public class SettingsActivity extends PreferenceActivity {
R.string.pref_mapDirectory, R.string.pref_defaultNavigationTool,
R.string.pref_defaultNavigationTool2, R.string.pref_webDeviceName,
R.string.pref_fakekey_preference_backup_info, }) {
- bindSummaryToStringValue(this, getKey(k));
+ bindSummaryToStringValue(k);
}
}
@@ -136,6 +140,10 @@ public class SettingsActivity extends PreferenceActivity {
return cgeoapplication.getInstance().getString(prefKeyId);
}
+ private Preference getPreference(final int keyId) {
+ return SettingsActivity.findPreference(this, getKey(keyId));
+ }
+
// workaround, because OnContextItemSelected nor onMenuItemSelected is never called
OnMenuItemClickListener TEMPLATE_CLICK = new OnMenuItemClickListener() {
@Override
@@ -149,7 +157,7 @@ public class SettingsActivity extends PreferenceActivity {
}
};
- // workaround, because OnContextItemSelected nor onMenuItemSelected is never called
+ // workaround, because OnContextItemSelected and onMenuItemSelected are never called
void setSignatureTextView(final EditText view) {
this.signatureText = view;
}
@@ -178,7 +186,7 @@ public class SettingsActivity extends PreferenceActivity {
* Fill the choice list for map sources.
*/
private void initMapSourcePreference() {
- ListPreference pref = (ListPreference) SettingsActivity.findPreference(this, getKey(R.string.pref_mapsource));
+ ListPreference pref = (ListPreference) getPreference(R.string.pref_mapsource);
List<MapSource> mapSources = MapProviderFactory.getMapSources();
CharSequence[] entries = new CharSequence[mapSources.size()];
@@ -205,10 +213,10 @@ public class SettingsActivity extends PreferenceActivity {
values[i] = String.valueOf(apps.get(i).id);
}
- ListPreference pref = (ListPreference) SettingsActivity.findPreference(this, getKey(R.string.pref_defaultNavigationTool));
+ ListPreference pref = (ListPreference) getPreference(R.string.pref_defaultNavigationTool);
pref.setEntries(entries);
pref.setEntryValues(values);
- pref = (ListPreference) SettingsActivity.findPreference(this, getKey(R.string.pref_defaultNavigationTool2));
+ pref = (ListPreference) getPreference(R.string.pref_defaultNavigationTool2);
pref.setEntries(entries);
pref.setEntryValues(values);
}
@@ -216,7 +224,7 @@ public class SettingsActivity extends PreferenceActivity {
private void initDirChoosers() {
for (final DirChooserType dct : DirChooserType.values()) {
- SettingsActivity.findPreference(this, getKey(dct.keyId)).setOnPreferenceClickListener(
+ getPreference(dct.keyId).setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
@@ -226,7 +234,7 @@ public class SettingsActivity extends PreferenceActivity {
});
}
- SettingsActivity.findPreference(this, getKey(R.string.pref_mapDirectory)).setOnPreferenceClickListener(
+ getPreference(R.string.pref_mapDirectory).setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
@@ -271,7 +279,7 @@ public class SettingsActivity extends PreferenceActivity {
private void setChosenDirectory(final DirChooserType dct, final Intent data) {
final String directory = new File(data.getData().getPath()).getAbsolutePath();
if (StringUtils.isNotBlank(directory)) {
- Preference p = SettingsActivity.findPreference(this, getKey(dct.keyId));
+ Preference p = getPreference(dct.keyId);
if (p == null) {
return;
}
@@ -281,7 +289,7 @@ public class SettingsActivity extends PreferenceActivity {
}
public void initBackupButtons() {
- Preference backup = SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_preference_backup));
+ Preference backup = getPreference(R.string.pref_fakekey_preference_backup);
backup.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
@@ -312,7 +320,7 @@ public class SettingsActivity extends PreferenceActivity {
? context.getString(R.string.init_backup_success)
+ "\n" + backupFileName
: context.getString(R.string.init_backup_failed));
- VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.findPreference(SettingsActivity.this, getKey(R.string.pref_fakekey_preference_backup_info)), "");
+ VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.this.getPreference(R.string.pref_fakekey_preference_backup_info), "");
}
});
}
@@ -321,7 +329,7 @@ public class SettingsActivity extends PreferenceActivity {
}
});
- Preference restore = SettingsActivity.findPreference(this, getKey(R.string.pref_fakekey_preference_restore));
+ Preference restore = getPreference(R.string.pref_fakekey_preference_restore);
restore.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
@@ -333,7 +341,7 @@ public class SettingsActivity extends PreferenceActivity {
}
private void initDbLocationPreference() {
- Preference p = SettingsActivity.findPreference(this, getKey(R.string.pref_dbonsdcard));
+ Preference p = getPreference(R.string.pref_dbonsdcard);
p.setPersistent(false);
p.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
@@ -347,7 +355,7 @@ public class SettingsActivity extends PreferenceActivity {
}
private void initDebugPreference() {
- Preference p = SettingsActivity.findPreference(this, getKey(R.string.pref_debug));
+ Preference p = getPreference(R.string.pref_debug);
p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(final Preference preference, final Object newValue) {
@@ -357,18 +365,47 @@ public class SettingsActivity extends PreferenceActivity {
});
}
- private void initBasicMemberPreferences() {
- SettingsActivity.findPreference(this, getKey(R.string.pref_loaddirectionimg)).setEnabled(
- !Settings.isPremiumMember());
- SettingsActivity.findPreference(this, getKey(R.string.pref_showcaptcha)).setEnabled(
- !Settings.isPremiumMember());
+ void initBasicMemberPreferences() {
+ getPreference(R.string.pref_fakekey_basicmembers_screen)
+ .setEnabled(!Settings.isPremiumMember());
+ getPreference(R.string.pref_loaddirectionimg)
+ .setEnabled(!Settings.isPremiumMember());
+ getPreference(R.string.pref_showcaptcha)
+ .setEnabled(!Settings.isPremiumMember());
+
+ redrawScreen(R.string.pref_fakekey_services_screen);
+ }
+
+ void redrawScreen(int key) {
+ PreferenceScreen screen = (PreferenceScreen) getPreference(key);
+ if (screen == null) {
+ return;
+ }
+ ListAdapter adapter = screen.getRootAdapter();
+ if (adapter instanceof BaseAdapter) {
+ ((BaseAdapter) adapter).notifyDataSetChanged();
+ }
}
private static void initSend2CgeoPreferences() {
Settings.putString(R.string.pref_webDeviceName, Settings.getWebDeviceName());
}
- public static void startWithServicesPage(final Context fromActivity) {
+ void setOCDEAuthTitle() {
+ getPreference(R.string.pref_fakekey_ocde_authorization)
+ .setTitle(getString(Settings.hasOCDEAuthorization()
+ ? R.string.init_reregister_oc_de
+ : R.string.init_register_oc_de));
+ }
+
+ void setTwitterAuthTitle() {
+ getPreference(R.string.pref_fakekey_twitter_authorization)
+ .setTitle(getString(Settings.hasTwitterAuthorization()
+ ? R.string.init_twitter_reauthorize
+ : R.string.init_twitter_authorize));
+ }
+
+ public static void jumpToServicesPage(final Context fromActivity) {
final Intent intent = new Intent(fromActivity, SettingsActivity.class);
intent.putExtra(INTENT_GOTO, INTENT_GOTO_SERVICES);
fromActivity.startActivity(intent);
@@ -398,9 +435,17 @@ public class SettingsActivity extends PreferenceActivity {
}
}
initMapSourcePreference();
- SettingsActivity.findPreference(this, getKey(R.string.pref_mapDirectory)).setSummary(
+ getPreference(R.string.pref_mapDirectory).setSummary(
Settings.getMapFileDirectory());
break;
+ case OAUTH_OCDE_REQUEST:
+ setOCDEAuthTitle();
+ redrawScreen(R.string.pref_fakekey_services_screen);
+ break;
+ case OAUTH_TWITTER_REQUEST:
+ setTwitterAuthTitle();
+ redrawScreen(R.string.pref_fakekey_services_screen);
+ break;
default:
throw new IllegalArgumentException();
}
@@ -478,10 +523,9 @@ public class SettingsActivity extends PreferenceActivity {
*
* @param key
*/
- private static void bindSummaryToStringValue(final PreferenceActivity preferenceActivity, final String key) {
-
- Preference pref = findPreference(preferenceActivity, key);
+ private void bindSummaryToStringValue(final int key) {
+ Preference pref = getPreference(key);
if (pref == null) {
return;
}
diff --git a/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java b/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java
new file mode 100644
index 0000000..94246e0
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java
@@ -0,0 +1,86 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.CacheDetailActivity;
+import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.Progress;
+
+import android.content.res.Resources;
+import android.os.Message;
+
+import java.lang.ref.WeakReference;
+
+public class SimpleCancellableHandler extends CancellableHandler {
+ public static final String SUCCESS_TEXT = "success_message";
+ protected final WeakReference<AbstractActivity> activityRef;
+ protected final WeakReference<Progress> progressDialogRef;
+
+ public SimpleCancellableHandler(final AbstractActivity activity, final Progress progress) {
+ this.activityRef = new WeakReference<AbstractActivity>(activity);
+ this.progressDialogRef = new WeakReference<Progress>(progress);
+ }
+
+ @Override
+ public void handleRegularMessage(final Message msg) {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null && msg.getData() != null && msg.getData().getString(SUCCESS_TEXT) != null) {
+ activity.showToast(msg.getData().getString(SUCCESS_TEXT));
+ }
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ return;
+ }
+
+ @Override
+ public void handleCancel(final Object extra) {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null) {
+ activity.showToast((String) extra);
+ }
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ }
+
+ public final void showToast(int resId) {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null) {
+ Resources res = activity.getResources();
+ activity.showToast(res.getText(resId).toString());
+ }
+ }
+
+ public final void dismissProgress() {
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ }
+
+ protected final void setProgressMessage(final String txt) {
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.setMessage(txt);
+ }
+ }
+
+ protected final void finishActivity() {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null) {
+ activity.finish();
+ }
+
+ }
+
+ protected void updateStatusMsg(final int resId, final String msg) {
+ CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
+ if (activity != null) {
+ setProgressMessage(activity.getResources().getString(resId)
+ + "\n\n"
+ + msg);
+ }
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/utils/SimpleHandler.java b/main/src/cgeo/geocaching/utils/SimpleHandler.java
new file mode 100644
index 0000000..554ded6
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/SimpleHandler.java
@@ -0,0 +1,65 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.activity.Progress;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Message;
+
+import java.lang.ref.WeakReference;
+
+public abstract class SimpleHandler extends Handler {
+ public static final String SUCCESS_TEXT = "success_message";
+ protected final WeakReference<AbstractActivity> activityRef;
+ protected final WeakReference<Progress> progressDialogRef;
+
+ public SimpleHandler(final AbstractActivity activity, final Progress progress) {
+ this.activityRef = new WeakReference<AbstractActivity>(activity);
+ this.progressDialogRef = new WeakReference<Progress>(progress);
+ }
+
+ @Override
+ public void handleMessage(final Message msg) {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null && msg.getData() != null && msg.getData().getString(SUCCESS_TEXT) != null) {
+ activity.showToast(msg.getData().getString(SUCCESS_TEXT));
+ }
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ return;
+ }
+
+ protected final void showToast(final int resId) {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null) {
+ Resources res = activity.getResources();
+ activity.showToast(res.getText(resId).toString());
+ }
+ }
+
+ protected final void dismissProgress() {
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ }
+
+ protected final void setProgressMessage(final String txt) {
+ Progress progressDialog = progressDialogRef.get();
+ if (progressDialog != null) {
+ progressDialog.setMessage(txt);
+ }
+ }
+
+ protected final void finishActivity() {
+ AbstractActivity activity = activityRef.get();
+ if (activity != null) {
+ activity.finish();
+ }
+
+ }
+
+}