diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2013-12-18 10:47:02 +0100 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2013-12-18 10:47:02 +0100 |
| commit | 32b0322d35cc42c989778b7fece66ec2d47be5c7 (patch) | |
| tree | 9c365f85f130296b83f748af66723655cf1e87a0 /main/src/cgeo | |
| parent | 542e63300e4f0d5f6a3dad4b3e69977d5db13eb6 (diff) | |
| download | cgeo-32b0322d35cc42c989778b7fece66ec2d47be5c7.zip cgeo-32b0322d35cc42c989778b7fece66ec2d47be5c7.tar.gz cgeo-32b0322d35cc42c989778b7fece66ec2d47be5c7.tar.bz2 | |
refactoring: generalize GCConnector capabilities implementation
Diffstat (limited to 'main/src/cgeo')
14 files changed, 73 insertions, 85 deletions
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java index 8226f38..575c0ba 100644 --- a/main/src/cgeo/geocaching/CacheListActivity.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -1631,7 +1631,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA } if (coords != null) { loader = new CoordsGeocacheListLoader(app, coords); - } + } else { loader = new AddressGeocacheListLoader(app, address); } diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java index 2989fb2..ffb1b1f 100644 --- a/main/src/cgeo/geocaching/connector/AbstractConnector.java +++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java @@ -16,6 +16,7 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; import java.util.ArrayList; +import java.util.Collection; import java.util.List; public abstract class AbstractConnector implements IConnector { @@ -142,9 +143,6 @@ public abstract class AbstractConnector implements IConnector { return getCacheUrl(cache); } - /** - * {@link IConnector} - */ @Override public boolean isActive() { return false; @@ -213,33 +211,31 @@ public abstract class AbstractConnector implements IConnector { } @Override - public final String getCapabilitiesMessage() { - StringBuilder builder = new StringBuilder("<p>" - + CgeoApplication.getInstance().getString(R.string.feature_description) + "<ul>"); - builder.append(capability(ISearchByViewPort.class, R.string.feature_search_live_map)); - builder.append(capability(ISearchByKeyword.class, R.string.feature_search_keyword)); - builder.append(capability(ISearchByCenter.class, R.string.feature_search_center)); - builder.append(capability(ISearchByGeocode.class, R.string.feature_search_geocode)); + public final Collection<String> getCapabilities() { + ArrayList<String> builder = new ArrayList<String>(); + builder.add(capability(ISearchByViewPort.class, R.string.feature_search_live_map)); + builder.add(capability(ISearchByKeyword.class, R.string.feature_search_keyword)); + builder.add(capability(ISearchByCenter.class, R.string.feature_search_center)); + builder.add(capability(ISearchByGeocode.class, R.string.feature_search_geocode)); if (supportsUserActions()) { - builder.append(feature(R.string.feature_search_user)); + builder.add(feature(R.string.feature_search_user)); } if (supportsLogging()) { - builder.append(feature(R.string.feature_online_logging)); + builder.add(feature(R.string.feature_online_logging)); } if (supportsLogImages()) { - builder.append(feature(R.string.feature_log_images)); + builder.add(feature(R.string.feature_log_images)); } if (supportsPersonalNote()) { - builder.append(feature(R.string.feature_personal_notes)); + builder.add(feature(R.string.feature_personal_notes)); } if (supportsOwnCoordinates()) { - builder.append(feature(R.string.feature_own_coordinates)); + builder.add(feature(R.string.feature_own_coordinates)); } if (supportsWatchList()) { - builder.append(feature(R.string.feature_watch_list)); + builder.add(feature(R.string.feature_watch_list)); } - builder.append("</ul></p>"); - return builder.toString(); + return builder; } private String capability(Class<? extends IConnector> clazz, final int featureResourceId) { @@ -250,6 +246,6 @@ public abstract class AbstractConnector implements IConnector { } private static String feature(int featureResourceId) { - return "<li>" + CgeoApplication.getInstance().getString(featureResourceId) + "</li>"; + return CgeoApplication.getInstance().getString(featureResourceId); } } diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java index 8de6070..032d74c 100644 --- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java +++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java @@ -24,6 +24,7 @@ import cgeo.geocaching.geopoint.Viewport; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; @@ -60,38 +61,22 @@ public final class ConnectorFactory { UNKNOWN_TRACKABLE_CONNECTOR // must be last }; - private static final ISearchByViewPort[] searchByViewPortConns; + private static final ISearchByViewPort[] searchByViewPortConns = getMatchingConnectors(ISearchByViewPort.class); - private static final ISearchByCenter[] searchByCenterConns; + private static final ISearchByCenter[] searchByCenterConns = getMatchingConnectors(ISearchByCenter.class); - private static final ISearchByKeyword[] searchByKeywordConns; + private static final ISearchByKeyword[] searchByKeywordConns = getMatchingConnectors(ISearchByKeyword.class); - static { - final List<ISearchByViewPort> vpConns = new ArrayList<ISearchByViewPort>(); + @SuppressWarnings("unchecked") + private static <T extends IConnector> T[] getMatchingConnectors(final Class<T> clazz) { + final List<T> matching = new ArrayList<T>(); for (final IConnector conn : CONNECTORS) { - if (conn instanceof ISearchByViewPort) { - vpConns.add((ISearchByViewPort) conn); + if (clazz.isInstance(conn)) { + matching.add((T) conn); } } - searchByViewPortConns = vpConns.toArray(new ISearchByViewPort[vpConns.size()]); - - final List<ISearchByCenter> centerConns = new ArrayList<ISearchByCenter>(); - for (final IConnector conn : CONNECTORS) { - // GCConnector is handled specially, omit it here! - if (conn instanceof ISearchByCenter && !(conn instanceof GCConnector)) { - centerConns.add((ISearchByCenter) conn); - } - } - searchByCenterConns = centerConns.toArray(new ISearchByCenter[centerConns.size()]); - - final List<ISearchByKeyword> keywordConns = new ArrayList<ISearchByKeyword>(); - for (final IConnector conn : CONNECTORS) { - // GCConnector is handled specially, omit it here! - if (conn instanceof ISearchByKeyword && !(conn instanceof GCConnector)) { - keywordConns.add((ISearchByKeyword) conn); - } - } - searchByKeywordConns = keywordConns.toArray(new ISearchByKeyword[keywordConns.size()]); + T[] result = (T[]) Array.newInstance(clazz, matching.size()); + return matching.toArray(result); } public static IConnector[] getConnectors() { diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java index 04787b3..34922f5 100644 --- a/main/src/cgeo/geocaching/connector/IConnector.java +++ b/main/src/cgeo/geocaching/connector/IConnector.java @@ -8,6 +8,7 @@ import cgeo.geocaching.geopoint.Geopoint; import org.eclipse.jdt.annotation.NonNull; +import java.util.Collection; import java.util.List; public interface IConnector { @@ -249,9 +250,9 @@ public interface IConnector { public int getMaxTerrain(); /** - * Creates a text listing all features of this connector to be displayed to the user. - * + * Get a user readable collection of all online features of this connector. + * * @return */ - public String getCapabilitiesMessage(); + public Collection<String> getCapabilities(); } diff --git a/main/src/cgeo/geocaching/connector/capability/ISearchByCenter.java b/main/src/cgeo/geocaching/connector/capability/ISearchByCenter.java index 94e31cd..adc36c7 100644 --- a/main/src/cgeo/geocaching/connector/capability/ISearchByCenter.java +++ b/main/src/cgeo/geocaching/connector/capability/ISearchByCenter.java @@ -3,6 +3,7 @@ package cgeo.geocaching.connector.capability; import cgeo.geocaching.SearchResult; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.loaders.RecaptchaReceiver; import org.eclipse.jdt.annotation.NonNull; @@ -11,5 +12,5 @@ import org.eclipse.jdt.annotation.NonNull; * */ public interface ISearchByCenter extends IConnector { - public SearchResult searchByCenter(final @NonNull Geopoint center); + public SearchResult searchByCenter(final @NonNull Geopoint center, final @NonNull RecaptchaReceiver recaptchaReceiver); } diff --git a/main/src/cgeo/geocaching/connector/capability/ISearchByKeyword.java b/main/src/cgeo/geocaching/connector/capability/ISearchByKeyword.java index 07cb7b3..9b3e6eb 100644 --- a/main/src/cgeo/geocaching/connector/capability/ISearchByKeyword.java +++ b/main/src/cgeo/geocaching/connector/capability/ISearchByKeyword.java @@ -2,13 +2,15 @@ package cgeo.geocaching.connector.capability; import cgeo.geocaching.SearchResult; import cgeo.geocaching.connector.IConnector; +import cgeo.geocaching.loaders.RecaptchaReceiver; import org.eclipse.jdt.annotation.NonNull; /** - * connector capability of searching online for a cache by name - * + * Connector capability of searching online for a cache by keyword. + * */ public interface ISearchByKeyword extends IConnector { - public SearchResult searchByName(final @NonNull String name); + // TODO: The recaptcha receiver is only needed for GC. Would be good to refactor this away from the generic interface. + public SearchResult searchByKeyword(final @NonNull String keyword, final @NonNull RecaptchaReceiver recaptchaReceiver); } diff --git a/main/src/cgeo/geocaching/connector/ec/ECConnector.java b/main/src/cgeo/geocaching/connector/ec/ECConnector.java index 2535c61..9a1146e 100644 --- a/main/src/cgeo/geocaching/connector/ec/ECConnector.java +++ b/main/src/cgeo/geocaching/connector/ec/ECConnector.java @@ -16,6 +16,7 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.loaders.RecaptchaReceiver; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.utils.CancellableHandler; @@ -100,7 +101,7 @@ public class ECConnector extends AbstractConnector implements ISearchByGeocode, } @Override - public SearchResult searchByCenter(@NonNull Geopoint center) { + public SearchResult searchByCenter(@NonNull Geopoint center, final @NonNull RecaptchaReceiver recaptchaReceiver) { final Collection<Geocache> caches = ECApi.searchByCenter(center); if (caches == null) { return null; diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index aea0bca..0f4388a 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -17,6 +17,7 @@ import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.loaders.RecaptchaReceiver; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.utils.CancellableHandler; @@ -206,9 +207,9 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, /** * Add a cache to the favorites list. - * + * * This must not be called from the UI thread. - * + * * @param cache * the cache to add * @return <code>true</code> if the cache was successfully added, <code>false</code> otherwise @@ -224,9 +225,9 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, /** * Remove a cache from the favorites list. - * + * * This must not be called from the UI thread. - * + * * @param cache * the cache to add * @return <code>true</code> if the cache was successfully added, <code>false</code> otherwise @@ -268,9 +269,8 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, } @Override - public SearchResult searchByCenter(@NonNull Geopoint center) { - // TODO make search by coordinate use this method. currently it is just a marker that this connector supports search by center - return null; + public SearchResult searchByCenter(@NonNull Geopoint center, final @NonNull RecaptchaReceiver recaptchaReceiver) { + return GCParser.searchByCoords(center, Settings.getCacheType(), Settings.isShowCaptcha(), recaptchaReceiver); } @Override @@ -357,8 +357,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, } @Override - public SearchResult searchByName(@NonNull String name) { - // TODO make the connector use this method. Currently it is only a marker interface. - return null; + public SearchResult searchByKeyword(@NonNull String keyword, final @NonNull RecaptchaReceiver recaptchaReceiver) { + return GCParser.searchByKeyword(keyword, Settings.getCacheType(), Settings.isShowCaptcha(), recaptchaReceiver); } } diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index ce1a74b..46f283a 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -871,12 +871,12 @@ public abstract class GCParser { return search; } - public static SearchResult searchByCoords(final Geopoint coords, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByCoords(final @NonNull Geopoint coords, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { final Parameters params = new Parameters("lat", Double.toString(coords.getLatitude()), "lng", Double.toString(coords.getLongitude())); return searchByAny(cacheType, false, showCaptcha, params, recaptchaReceiver); } - public static SearchResult searchByKeyword(final String keyword, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + public static SearchResult searchByKeyword(final @NonNull String keyword, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(keyword)) { Log.e("GCParser.searchByKeyword: No keyword given"); return null; diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index 9ae1872..b038e8c 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -13,6 +13,7 @@ import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.oc.UserInfo.UserInfoStatus; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.loaders.RecaptchaReceiver; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.CryptUtils; @@ -50,7 +51,7 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente } @Override - public SearchResult searchByCenter(@NonNull Geopoint center) { + public SearchResult searchByCenter(@NonNull Geopoint center, final @NonNull RecaptchaReceiver recaptchaReceiver) { return new SearchResult(OkapiClient.getCachesAround(center, this)); } @@ -156,7 +157,7 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente } @Override - public SearchResult searchByName(final @NonNull String name) { + public SearchResult searchByKeyword(final @NonNull String name, final @NonNull RecaptchaReceiver recaptchaReceiver) { final Geopoint currentPos = CgeoApplication.getInstance().currentGeo().getCoords(); return new SearchResult(OkapiClient.getCachesNamed(currentPos, name, this)); } diff --git a/main/src/cgeo/geocaching/connector/ox/OXConnector.java b/main/src/cgeo/geocaching/connector/ox/OXConnector.java index 0cd49c3..81d491c 100644 --- a/main/src/cgeo/geocaching/connector/ox/OXConnector.java +++ b/main/src/cgeo/geocaching/connector/ox/OXConnector.java @@ -10,6 +10,7 @@ import cgeo.geocaching.connector.capability.ISearchByKeyword; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.loaders.RecaptchaReceiver; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.CancellableHandler; @@ -72,7 +73,7 @@ public class OXConnector extends AbstractConnector implements ISearchByCenter, I } @Override - public SearchResult searchByCenter(@NonNull Geopoint center) { + public SearchResult searchByCenter(@NonNull Geopoint center, final @NonNull RecaptchaReceiver recaptchaReceiver) { return createSearchResult(OpenCachingApi.searchByCenter(center)); } @@ -92,7 +93,7 @@ public class OXConnector extends AbstractConnector implements ISearchByCenter, I } @Override - public SearchResult searchByName(final @NonNull String name) { + public SearchResult searchByKeyword(final @NonNull String name, final @NonNull RecaptchaReceiver recaptchaReceiver) { return createSearchResult(OpenCachingApi.searchByKeyword(name)); } diff --git a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java index d070d71..3874b47 100644 --- a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java @@ -1,18 +1,18 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ISearchByCenter; -import cgeo.geocaching.connector.gc.GCParser; import cgeo.geocaching.geopoint.Geopoint; +import org.eclipse.jdt.annotation.NonNull; + import android.content.Context; public class CoordsGeocacheListLoader extends AbstractSearchLoader { - private final Geopoint coords; + private final @NonNull Geopoint coords; - public CoordsGeocacheListLoader(Context context, Geopoint coords) { + public CoordsGeocacheListLoader(final Context context, final @NonNull Geopoint coords) { super(context); this.coords = coords; } @@ -21,13 +21,10 @@ public class CoordsGeocacheListLoader extends AbstractSearchLoader { public SearchResult runSearch() { SearchResult search = new SearchResult(); - if (Settings.isGCConnectorActive()) { - search = GCParser.searchByCoords(coords, Settings.getCacheType(), Settings.isShowCaptcha(), this); - } for (ISearchByCenter centerConn : ConnectorFactory.getSearchByCenterConnectors()) { if (centerConn.isActive()) { - search.addSearchResult(centerConn.searchByCenter(coords)); + search.addSearchResult(centerConn.searchByCenter(coords, this)); } } diff --git a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java index 0d8fcb1..c8deb59 100644 --- a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java @@ -3,8 +3,6 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ISearchByKeyword; -import cgeo.geocaching.connector.gc.GCParser; -import cgeo.geocaching.settings.Settings; import android.content.Context; @@ -20,13 +18,10 @@ public class KeywordGeocacheListLoader extends AbstractSearchLoader { @Override public SearchResult runSearch() { SearchResult searchResult = new SearchResult(); - if (Settings.isGCConnectorActive()) { - searchResult = GCParser.searchByKeyword(keyword, Settings.getCacheType(), Settings.isShowCaptcha(), this); - } for (ISearchByKeyword connector : ConnectorFactory.getSearchByKeywordConnectors()) { if (connector.isActive()) { - searchResult.addSearchResult(connector.searchByName(keyword)); + searchResult.addSearchResult(connector.searchByKeyword(keyword, this)); } } diff --git a/main/src/cgeo/geocaching/settings/CapabilitiesPreference.java b/main/src/cgeo/geocaching/settings/CapabilitiesPreference.java index d7e55a4..d2e19b7 100644 --- a/main/src/cgeo/geocaching/settings/CapabilitiesPreference.java +++ b/main/src/cgeo/geocaching/settings/CapabilitiesPreference.java @@ -1,5 +1,6 @@ package cgeo.geocaching.settings; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; @@ -67,7 +68,15 @@ public class CapabilitiesPreference extends AbstractAttributeBasedPrefence { if (connector == null) { return StringUtils.EMPTY; } - return connector.getCapabilitiesMessage(); + StringBuilder builder = new StringBuilder("<p>" + + CgeoApplication.getInstance().getString(R.string.feature_description) + "<ul>"); + + for (String capability : connector.getCapabilities()) { + builder.append("<li>").append(capability).append("</li>"); + } + + builder.append("</ul></p>"); + return builder.toString(); } @Override |
