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.java108
1 files changed, 62 insertions, 46 deletions
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 22bd500..244080b 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -5,7 +5,6 @@ import butterknife.InjectView;
import cgeo.calendar.CalendarAddon;
import cgeo.geocaching.activity.AbstractActivity;
-import cgeo.geocaching.activity.AbstractActivity.ActivitySharingInterface;
import cgeo.geocaching.activity.AbstractViewPagerActivity;
import cgeo.geocaching.activity.INavigationSource;
import cgeo.geocaching.activity.Progress;
@@ -14,6 +13,7 @@ import cgeo.geocaching.apps.cache.navi.NavigationSelectionActionProvider;
import cgeo.geocaching.apps.cachelist.MapsWithMeCacheListApp;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;
+import cgeo.geocaching.connector.capability.IgnoreCapability;
import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.connector.gc.GCConstants;
import cgeo.geocaching.enumerations.CacheAttribute;
@@ -24,6 +24,7 @@ import cgeo.geocaching.gcvote.GCVote;
import cgeo.geocaching.gcvote.GCVoteDialog;
import cgeo.geocaching.list.StoredList;
import cgeo.geocaching.location.Units;
+import cgeo.geocaching.network.AndroidBeam;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.SmileyImage;
@@ -45,6 +46,7 @@ import cgeo.geocaching.ui.OwnerActionsClickListener;
import cgeo.geocaching.ui.WeakReferenceHandler;
import cgeo.geocaching.ui.dialog.Dialogs;
import cgeo.geocaching.ui.logs.CacheLogsViewCreator;
+import cgeo.geocaching.utils.CheckerUtils;
import cgeo.geocaching.utils.CryptUtils;
import cgeo.geocaching.utils.Formatter;
import cgeo.geocaching.utils.ImageUtils;
@@ -57,11 +59,11 @@ import cgeo.geocaching.utils.TextUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.Charsets;
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;
@@ -86,8 +88,6 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.net.Uri;
-import android.nfc.NdefMessage;
-import android.nfc.NfcAdapter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
@@ -102,6 +102,7 @@ import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
+import android.text.util.Linkify;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.Menu;
@@ -137,7 +138,7 @@ import java.util.regex.Pattern;
* e.g. details, description, logs, waypoints, inventory...
*/
public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailActivity.Page>
- implements CacheMenuHandler.ActivityInterface, INavigationSource, ActivitySharingInterface, EditNoteDialogListener {
+ implements CacheMenuHandler.ActivityInterface, INavigationSource, AndroidBeam.ActivitySharingInterface, EditNoteDialogListener {
private static final int MESSAGE_FAILED = -1;
private static final int MESSAGE_SUCCEEDED = 1;
@@ -186,17 +187,14 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
// get parameters
final Bundle extras = getIntent().getExtras();
- Uri uri = getIntent().getData();
+ final Uri uri = AndroidBeam.getUri(getIntent());
// try to get data from extras
String name = null;
String geocode = null;
String guid = null;
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
- final NdefMessage msg = (NdefMessage) extras.getParcelableArray(NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
- uri = Uri.parse("http://" + new String(msg.getRecords()[0].getPayload(), Charsets.UTF_8));
- } else if (extras != null) {
+ if (extras != null) {
geocode = extras.getString(Intents.EXTRA_GEOCODE);
name = extras.getString(Intents.EXTRA_NAME);
guid = extras.getString(Intents.EXTRA_GUID);
@@ -207,6 +205,10 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
geocode = MapsWithMeCacheListApp.getCacheFromMapsWithMe(this, getIntent());
}
+ if (geocode == null && uri != null) {
+ geocode = ConnectorFactory.getGeocodeFromURL(uri.toString());
+ }
+
// try to get data from URI
if (geocode == null && guid == null && uri != null) {
final String uriHost = uri.getHost().toLowerCase(Locale.US);
@@ -238,31 +240,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return;
}
}
- } else if (uriHost.contains("coord.info")) {
- if (StringUtils.startsWith(uriPath, "/gc")) {
- geocode = uriPath.substring(1).toUpperCase(Locale.US);
- } else {
- showToast(res.getString(R.string.err_detail_open));
- finish();
- return;
- }
- } else if (uriHost.contains("opencaching.de") || uriHost.contains("opencaching.fr")) {
- if (StringUtils.startsWith(uriPath, "/oc")) {
- geocode = uriPath.substring(1).toUpperCase(Locale.US);
- } else {
- geocode = uri.getQueryParameter("wp");
- if (StringUtils.isNotBlank(geocode)) {
- geocode = geocode.toUpperCase(Locale.US);
- } else {
- showToast(res.getString(R.string.err_detail_open));
- finish();
- return;
- }
- }
- } else {
- showToast(res.getString(R.string.err_detail_open));
- finish();
- return;
}
}
@@ -306,6 +283,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
requireGeodata = getPage(position) == Page.DETAILS;
startOrStopGeoDataListener();
+
+ // cancel contextual actions on page change
+ if (currentActionMode != null) {
+ currentActionMode.finish();
+ }
}
});
requireGeodata = pageToOpen == 1;
@@ -323,10 +305,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
locationUpdater = new CacheDetailsGeoDirHandler(this);
// If we have a newer Android device setup Android Beam for easy cache sharing
- initializeAndroidBeam(this);
+ AndroidBeam.enable(this, this);
}
@Override
+ @Nullable
public String getAndroidBeamUri() {
return cache != null ? cache.getCgeoUrl() : null;
}
@@ -467,7 +450,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return true;
case R.id.menu_waypoint_caches_around:
if (selectedWaypoint != null) {
- CacheListActivity.startActivityCoordinates(this, selectedWaypoint.getCoords());
+ CacheListActivity.startActivityCoordinates(this, selectedWaypoint.getCoords(), selectedWaypoint.getName());
}
return true;
case R.id.menu_waypoint_reset_cache_coords:
@@ -495,13 +478,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
CacheMenuHandler.addMenuItems(this, menu, cache);
- MenuItem menuItem = menu.findItem(R.id.menu_default_navigation);
+ final MenuItem menuItem = menu.findItem(R.id.menu_default_navigation);
final NavigationActionProvider navAction = (NavigationActionProvider) MenuItemCompat.getActionProvider(menuItem);
if (navAction != null) {
navAction.setNavigationSource(this);
}
- menuItem = menu.findItem(R.id.menu_navigate);
- NavigationSelectionActionProvider.initialize(menuItem, cache);
+ NavigationSelectionActionProvider.initialize(menu.findItem(R.id.menu_navigate), cache);
return true;
}
@@ -513,6 +495,13 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
menu.findItem(R.id.menu_delete).setVisible(cache != null && cache.isOffline());
menu.findItem(R.id.menu_refresh).setVisible(cache != null && cache.isOffline());
menu.findItem(R.id.menu_gcvote).setVisible(cache != null && GCVote.isVotingPossible(cache));
+ menu.findItem(R.id.menu_checker).setVisible(cache != null && StringUtils.isNotEmpty(CheckerUtils.getCheckerUrl(cache)));
+ if (cache != null) {
+ final IConnector connector = ConnectorFactory.getConnector(cache);
+ if (connector instanceof IgnoreCapability) {
+ menu.findItem(R.id.menu_ignore).setVisible(((IgnoreCapability) connector).canIgnoreCache(cache));
+ }
+ }
return super.onPrepareOptionsMenu(menu);
}
@@ -537,6 +526,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
case R.id.menu_gcvote:
showVoteDialog();
return true;
+ case R.id.menu_checker:
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(CheckerUtils.getCheckerUrl(cache))));
+ return true;
+ case R.id.menu_ignore:
+ ignoreCache();
+ return true;
default:
if (NavigationAppFactory.onMenuItemSelected(item, this, cache)) {
return true;
@@ -550,6 +545,15 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
return super.onOptionsItemSelected(item);
}
+ private void ignoreCache() {
+ RxUtils.networkScheduler.createWorker().schedule(new Action0() {
+ @Override
+ public void call() {
+ ((IgnoreCapability) ConnectorFactory.getConnector(cache)).ignoreCache(cache);
+ }
+ });
+ }
+
private void showVoteDialog() {
GCVoteDialog.show(this, cache, new Runnable() {
@Override
@@ -1288,6 +1292,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
});
+ /**
+ * Reflect the (contextual) action mode of the action bar.
+ */
+ protected ActionMode currentActionMode;
+
protected class DescriptionViewCreator extends AbstractCachingPageViewCreator<ScrollView> {
@InjectView(R.id.personalnote) protected TextView personalNoteView;
@@ -1463,9 +1472,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
if (unknownTagsHandler.isProblematicDetected()) {
final int startPos = description.length();
final IConnector connector = ConnectorFactory.getConnector(cache);
- final Spanned tableNote = Html.fromHtml(res.getString(R.string.cache_description_table_note, "<a href=\"" + cache.getUrl() + "\">" + connector.getName() + "</a>"));
- ((Editable) description).append("\n\n").append(tableNote);
- ((Editable) description).setSpan(new StyleSpan(Typeface.ITALIC), startPos, description.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ if (StringUtils.isNotEmpty(cache.getUrl())) {
+ final Spanned tableNote = Html.fromHtml(res.getString(R.string.cache_description_table_note, "<a href=\"" + cache.getUrl() + "\">" + connector.getName() + "</a>"));
+ ((Editable) description).append("\n\n").append(tableNote);
+ ((Editable) description).setSpan(new StyleSpan(Typeface.ITALIC), startPos, description.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
}
}
/**
@@ -1786,7 +1797,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public boolean onLongClick(final View v) {
- startSupportActionMode(new ActionMode.Callback() {
+ currentActionMode = startSupportActionMode(new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(final ActionMode actionMode, final Menu menu) {
@@ -1835,7 +1846,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void onDestroyActionMode(final ActionMode actionMode) {
- // do nothing
+ currentActionMode = null;
}
@Override
@@ -2177,6 +2188,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
personalNoteView.setText(personalNote, TextView.BufferType.SPANNABLE);
if (StringUtils.isNotBlank(personalNote)) {
personalNoteView.setVisibility(View.VISIBLE);
+ Linkify.addLinks(personalNoteView, Linkify.ALL);
} else {
personalNoteView.setVisibility(View.GONE);
}
@@ -2194,6 +2206,10 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
@Override
public void cachesAround() {
- CacheListActivity.startActivityCoordinates(this, cache.getCoords());
+ CacheListActivity.startActivityCoordinates(this, cache.getCoords(), cache.getName());
+ }
+
+ public void setNeedsRefresh() {
+ refreshOnResume = true;
}
}