diff options
Diffstat (limited to 'main/src')
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(); + } + + } + +} |
