diff options
Diffstat (limited to 'main/src/cgeo/geocaching/CacheDetailActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 108 |
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; } } |
