package cgeo.geocaching.connector.ec; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.connector.AbstractConnector; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.capability.ICredentials; import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByGeocode; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.gc.MapTokens; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.location.Geopoint; import cgeo.geocaching.location.Viewport; import cgeo.geocaching.log.LogCacheActivity; import cgeo.geocaching.log.LogType; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.settings.Credentials; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.utils.DisposableHandler; import android.app.Activity; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; public class ECConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort, ILogin, ICredentials { // As of 2016-11-17, using https redirects to http @NonNull private static final String CACHE_URL = "http://extremcaching.com/index.php/output-2/"; /** * Pattern for EC codes */ @NonNull private static final Pattern PATTERN_EC_CODE = Pattern.compile("EC[0-9]+", Pattern.CASE_INSENSITIVE); @NonNull private final ECLogin ecLogin = ECLogin.getInstance(); private ECConnector() { // singleton } /** * initialization on demand holder pattern */ private static class Holder { @NonNull private static final ECConnector INSTANCE = new ECConnector(); } @NonNull public static ECConnector getInstance() { return Holder.INSTANCE; } @Override public boolean canHandle(@NonNull final String geocode) { return PATTERN_EC_CODE.matcher(geocode).matches(); } @Override @NonNull public String getCacheUrl(@NonNull final Geocache cache) { return CACHE_URL + cache.getGeocode().replace("EC", ""); } @Override @NonNull public String getName() { return "extremcaching.com"; } @Override @NonNull public String getNameAbbreviated() { return "EC"; } @Override @NonNull public String getHost() { return "extremcaching.com"; } @Override public SearchResult searchByGeocode(@Nullable final String geocode, @Nullable final String guid, final DisposableHandler handler) { if (geocode == null) { return null; } DisposableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_loadpage); final Geocache cache = ECApi.searchByGeoCode(geocode); return cache != null ? new SearchResult(cache) : null; } @Override @NonNull public SearchResult searchByViewport(@NonNull final Viewport viewport, @Nullable final MapTokens tokens) { final Collection<Geocache> caches = ECApi.searchByBBox(viewport); final SearchResult searchResult = new SearchResult(caches); return searchResult.filterSearchResults(false, Settings.getCacheType()); } @Override @NonNull public SearchResult searchByCenter(@NonNull final Geopoint center) { final Collection<Geocache> caches = ECApi.searchByCenter(center); final SearchResult searchResult = new SearchResult(caches); return searchResult.filterSearchResults(false, Settings.getCacheType()); } @Override public boolean isOwner(@NonNull final Geocache cache) { return false; } @Override @NonNull protected String getCacheUrlPrefix() { return CACHE_URL; } @Override public boolean isActive() { return Settings.isECConnectorActive(); } @Override public boolean login(final Handler handler, @Nullable final Activity fromActivity) { // login final StatusCode status = ecLogin.login(); if (ConnectorFactory.showLoginToast && handler != null) { handler.sendMessage(handler.obtainMessage(0, status)); ConnectorFactory.showLoginToast = false; // invoke settings activity to insert login details if (status == StatusCode.NO_LOGIN_INFO_STORED && fromActivity != null) { SettingsActivity.openForScreen(R.string.preference_screen_ec, fromActivity); } } return status == StatusCode.NO_ERROR; } @Override public String getUserName() { return ecLogin.getActualUserName(); } @Override public Credentials getCredentials() { return Settings.getCredentials(R.string.pref_ecusername, R.string.pref_ecpassword); } @Override public int getCachesFound() { return ecLogin.getActualCachesFound(); } @Override public String getLoginStatusString() { return ecLogin.getActualStatus(); } @Override public boolean isLoggedIn() { return ecLogin.isActualLoginStatus(); } @Override public int getCacheMapMarkerId(final boolean disabled) { final String icons = Settings.getECIconSet(); if (StringUtils.equals(icons, "1")) { return disabled ? R.drawable.marker_disabled_other : R.drawable.marker_other; } return disabled ? R.drawable.marker_disabled_oc : R.drawable.marker_oc; } @Override @NonNull public String getLicenseText(@NonNull final Geocache cache) { // NOT TO BE TRANSLATED return "© " + cache.getOwnerDisplayName() + ", <a href=\"" + getCacheUrl(cache) + "\">" + getName() + "</a>, CC BY-NC-ND 3.0, alle Logeinträge © jeweiliger Autor"; } @Override public boolean supportsLogging() { return true; } @Override public boolean canLog(@NonNull final Geocache cache) { return true; } @Override @NonNull public ILoggingManager getLoggingManager(@NonNull final LogCacheActivity activity, @NonNull final Geocache cache) { return new ECLoggingManager(activity, this, cache); } @Override @NonNull public List<LogType> getPossibleLogTypes(@NonNull final Geocache geocache) { final List<LogType> logTypes = new ArrayList<>(); if (geocache.isEventCache()) { logTypes.add(LogType.WILL_ATTEND); logTypes.add(LogType.ATTENDED); } else { logTypes.add(LogType.FOUND_IT); } if (!geocache.isEventCache()) { logTypes.add(LogType.DIDNT_FIND_IT); } logTypes.add(LogType.NOTE); return logTypes; } @Override public int getMaxTerrain() { return 7; } @Override public int getUsernamePreferenceKey() { return R.string.pref_ecusername; } @Override public int getPasswordPreferenceKey() { return R.string.pref_ecpassword; } @Override public int getAvatarPreferenceKey() { return R.string.pref_ec_avatar; } @Override @Nullable public String getGeocodeFromUrl(@NonNull final String url) { final String geocode = "EC" + StringUtils.substringAfter(url, "extremcaching.com/index.php/output-2/"); if (canHandle(geocode)) { return geocode; } return super.getGeocodeFromUrl(url); } @Override @NonNull public String getCreateAccountUrl() { return "https://extremcaching.com/component/comprofiler/registers"; } }