aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/CacheDetailActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/CacheDetailActivity.java')
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java149
1 files changed, 97 insertions, 52 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 0976b35..364e71f 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -18,7 +18,6 @@ import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.connector.gc.GCConstants;
import cgeo.geocaching.enumerations.CacheAttribute;
-import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.enumerations.LoadFlags.SaveFlag;
import cgeo.geocaching.enumerations.WaypointType;
@@ -61,15 +60,16 @@ import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
-import org.eclipse.jdt.annotation.Nullable;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;
+import rx.Subscription;
import rx.android.observables.AndroidObservable;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.subscriptions.CompositeSubscription;
+import rx.subscriptions.Subscriptions;
import android.R.color;
import android.app.AlertDialog;
@@ -84,6 +84,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -171,6 +172,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
*/
private Waypoint selectedWaypoint;
+ private boolean requireGeodata;
+ private Subscription geoDataSubscription = Subscriptions.empty();
+
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.cachedetail_activity);
@@ -235,7 +239,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
finish();
return;
}
- } else if (uriHost.contains("opencaching.de")) {
+ } else if (uriHost.contains("opencaching.de") || uriHost.contains("opencaching.fr")) {
if (StringUtils.startsWith(uriPath, "/oc")) {
geocode = uriPath.substring(1).toUpperCase(Locale.US);
} else {
@@ -263,7 +267,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
// If we open this cache from a search, let's properly initialize the title bar, even if we don't have cache details
- updateTitleBar(geocode, name, null);
+ setCacheTitleBar(geocode, name, null);
final LoadCacheHandler loadCacheHandler = new LoadCacheHandler(this, progress);
@@ -275,7 +279,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
title = geocode;
}
progress.show(this, title, res.getString(R.string.cache_dialog_loading_details), true, loadCacheHandler.cancelMessage());
- } catch (final RuntimeException e) {
+ } catch (final RuntimeException ignored) {
// nothing, we lost the window
}
@@ -293,8 +297,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (getPage(position) == Page.IMAGES) {
loadCacheImages();
}
+ requireGeodata = getPage(position) == Page.DETAILS;
+ startOrStopGeoDataListener();
}
});
+ requireGeodata = pageToOpen == 1;
final String realGeocode = geocode;
final String realGuid = guid;
@@ -323,9 +330,17 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
outState.putInt(STATE_PAGE_INDEX, getCurrentItem());
}
+ private void startOrStopGeoDataListener() {
+ geoDataSubscription.unsubscribe();
+ if (requireGeodata) {
+ geoDataSubscription = locationUpdater.start(GeoDirHandler.UPDATE_GEODATA);
+ }
+ }
+
@Override
public void onResume() {
- super.onResume(locationUpdater.start(GeoDirHandler.UPDATE_GEODATA));
+ super.onResume();
+ startOrStopGeoDataListener();
if (refreshOnResume) {
notifyDataSetChanged();
@@ -334,6 +349,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
@Override
+ public void onPause() {
+ geoDataSubscription.unsubscribe();
+ super.onPause();
+ }
+
+ @Override
public void onDestroy() {
createSubscriptions.unsubscribe();
super.onDestroy();
@@ -389,17 +410,43 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return true;
case R.id.menu_waypoint_duplicate:
ensureSaved();
- if (cache.duplicateWaypoint(selectedWaypoint)) {
- DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB));
- notifyDataSetChanged();
- }
+ new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(final Void... params) {
+ if (cache.duplicateWaypoint(selectedWaypoint)) {
+ DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void onPostExecute(final Boolean result) {
+ if (result) {
+ notifyDataSetChanged();
+ }
+ }
+ }.execute();
return true;
case R.id.menu_waypoint_delete:
ensureSaved();
- if (cache.deleteWaypoint(selectedWaypoint)) {
- DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB));
- notifyDataSetChanged();
- }
+ new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(final Void... params) {
+ if (cache.deleteWaypoint(selectedWaypoint)) {
+ DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void onPostExecute(final Boolean result) {
+ if (result) {
+ notifyDataSetChanged();
+ }
+ }
+ }.execute();
return true;
case R.id.menu_waypoint_navigate_default:
if (selectedWaypoint != null) {
@@ -591,7 +638,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// allow cache to notify CacheDetailActivity when it changes so it can be reloaded
cache.setChangeNotificationHandler(new ChangeNotificationHandler(this, progress));
- updateTitleBar(cache.getGeocode(), cache.getName(), cache.getType());
+ setCacheTitleBar(cache);
// reset imagesList so Images view page will be redrawn
imagesList = null;
@@ -604,19 +651,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
Settings.addCacheToHistory(cache.getGeocode());
}
- private void updateTitleBar(@Nullable final String geocode, @Nullable final String name, @Nullable final CacheType type) {
- if (StringUtils.isNotBlank(name)) {
- setTitle(StringUtils.isNotBlank(geocode) ? name + " (" + geocode + ")" : name);
- } else {
- setTitle(StringUtils.isNotBlank(geocode) ? geocode : res.getString(R.string.cache));
- }
- if (type != null) {
- getSupportActionBar().setIcon(getResources().getDrawable(type.markerId));
- } else {
- getSupportActionBar().setIcon(android.R.color.transparent);
- }
- }
-
/**
* Tries to navigate to the {@link Geocache} of this activity using the default navigation tool.
*/
@@ -910,9 +944,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
public void call(final Integer selectedListId) {
storeCache(selectedListId, new StoreCacheHandler(CacheDetailActivity.this, progress));
}
- }, true, StoredList.TEMPORARY_LIST_ID);
+ }, true, StoredList.TEMPORARY_LIST.id);
} else {
- storeCache(StoredList.TEMPORARY_LIST_ID, new StoreCacheHandler(this, progress));
+ storeCache(StoredList.TEMPORARY_LIST.id, new StoreCacheHandler(this, progress));
}
}
@@ -1597,7 +1631,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (null != loadingIndicatorView) {
loadingIndicatorView.setVisibility(View.GONE);
}
- } catch (final Exception e) {
+ } catch (final Exception ignored) {
showToast(res.getString(R.string.err_load_descr_failed));
}
}
@@ -1653,7 +1687,13 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (!cache.isOffline()) {
showToast(getString(R.string.info_cache_saved));
cache.setListId(StoredList.STANDARD_LIST_ID);
- DataStore.saveCache(cache, LoadFlags.SAVE_ALL);
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(final Void... params) {
+ DataStore.saveCache(cache, LoadFlags.SAVE_ALL);
+ return null;
+ }
+ }.execute();
}
}
@@ -1892,29 +1932,25 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
buildDetailsContextMenu(actionMode, menu, itemTitle, true);
return true;
case R.id.shortdesc:
- assert view instanceof TextView;
- clickedItemText = ((TextView) view).getText();
+ clickedItemText = cache.getShortDescription();
buildDetailsContextMenu(actionMode, menu, res.getString(R.string.cache_description), false);
return true;
case R.id.longdesc:
- assert view instanceof TextView;
// combine short and long description
final String shortDesc = cache.getShortDescription();
if (StringUtils.isBlank(shortDesc)) {
- clickedItemText = ((TextView) view).getText();
+ clickedItemText = cache.getDescription();
} else {
- clickedItemText = shortDesc + "\n\n" + ((TextView) view).getText();
+ clickedItemText = shortDesc + "\n\n" + cache.getDescription();
}
buildDetailsContextMenu(actionMode, menu, res.getString(R.string.cache_description), false);
return true;
case R.id.personalnote:
- assert view instanceof TextView;
- clickedItemText = ((TextView) view).getText();
+ clickedItemText = cache.getPersonalNote();
buildDetailsContextMenu(actionMode, menu, res.getString(R.string.cache_personal_note), true);
return true;
case R.id.hint:
- assert view instanceof TextView;
- clickedItemText = ((TextView) view).getText();
+ clickedItemText = cache.getHint();
buildDetailsContextMenu(actionMode, menu, res.getString(R.string.cache_hint), false);
return true;
case R.id.log:
@@ -1923,8 +1959,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
buildDetailsContextMenu(actionMode, menu, res.getString(R.string.cache_logs), false);
return true;
case R.id.date: // event date
- assert view instanceof TextView;
- clickedItemText = ((TextView) view).getText();
+ clickedItemText = Formatter.formatHiddenDate(cache);
buildDetailsContextMenu(actionMode, menu, res.getString(R.string.cache_event), true);
menu.findItem(R.id.menu_calendar).setVisible(cache.canBeAddedToCalendar());
return true;
@@ -2232,7 +2267,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
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);
+ notifyDataSetChanged(activityRef);
}
}
}
@@ -2248,7 +2283,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) {
updateStatusMsg(R.string.cache_dialog_refresh_message, (String) msg.obj);
} else {
- notifyDatasetChanged(activityRef);
+ notifyDataSetChanged(activityRef);
}
}
}
@@ -2261,7 +2296,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void handleMessage(final Message msg) {
- notifyDatasetChanged(activityRef);
+ notifyDataSetChanged(activityRef);
}
}
@@ -2276,12 +2311,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (msg.what == MESSAGE_FAILED) {
super.handleMessage(msg);
} else {
- notifyDatasetChanged(activityRef);
+ notifyDataSetChanged(activityRef);
}
}
}
- private static void notifyDatasetChanged(final WeakReference<AbstractActivity> activityRef) {
+ private static void notifyDataSetChanged(final WeakReference<AbstractActivity> activityRef) {
final CacheDetailActivity activity = ((CacheDetailActivity) activityRef.get());
if (activity != null) {
activity.notifyDataSetChanged();
@@ -2308,12 +2343,22 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void onFinishEditNoteDialog(final String note) {
- cache.setPersonalNote(note);
- cache.parseWaypointsFromNote();
final TextView personalNoteView = ButterKnife.findById(this, R.id.personalnote);
setPersonalNote(personalNoteView, note);
- DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB));
- notifyDataSetChanged();
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(final Void... params) {
+ cache.setPersonalNote(note);
+ cache.parseWaypointsFromNote();
+ DataStore.saveCache(cache, EnumSet.of(SaveFlag.DB));
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(final Void v) {
+ notifyDataSetChanged();
+ }
+ }.execute();
}
private static void setPersonalNote(final TextView personalNoteView, final String personalNote) {