diff options
| author | rsudev <rasch@munin-soft.de> | 2013-06-23 22:44:39 +0200 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2013-06-23 22:45:45 +0200 |
| commit | 7e271de2385ac1d2193d59f58e3d5e972d306f93 (patch) | |
| tree | dafaa9e52bb378d8cb55c35a77f9cbe9809a1500 /main/src/cgeo/geocaching/connector | |
| parent | f38e587364e95b0fd44eaf81d9c45ca64aa6e4bd (diff) | |
| download | cgeo-7e271de2385ac1d2193d59f58e3d5e972d306f93.zip cgeo-7e271de2385ac1d2193d59f58e3d5e972d306f93.tar.gz cgeo-7e271de2385ac1d2193d59f58e3d5e972d306f93.tar.bz2 | |
Implements #2811 and makes the main screen status fully dynamc
Diffstat (limited to 'main/src/cgeo/geocaching/connector')
5 files changed, 167 insertions, 16 deletions
diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java index a2b0192..c5a083c 100644 --- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java +++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java @@ -4,6 +4,7 @@ import cgeo.geocaching.ICache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Trackable; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.gc.GCConnector; @@ -27,7 +28,7 @@ public final class ConnectorFactory { private static final UnknownConnector UNKNOWN_CONNECTOR = new UnknownConnector(); private static final IConnector[] CONNECTORS = new IConnector[] { GCConnector.getInstance(), - new OCApiLiveConnector("Opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret, ApiSupport.current), + new OCApiLiveConnector("opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret, ApiSupport.current), new OCConnector("OpenCaching.CZ", "www.opencaching.cz", "OZ"), new OCApiConnector("OpenCaching.CO.UK", "www.opencaching.org.uk", "OK", "arU4okouc4GEjMniE2fq", ApiSupport.oldapi), new OCConnector("OpenCaching.ES", "www.opencachingspain.es", "OC"), @@ -82,6 +83,16 @@ public final class ConnectorFactory { return searchByCenterConns; } + public static ILogin[] getActiveLiveConnectors() { + final List<ILogin> liveConns = new ArrayList<ILogin>(); + for (final IConnector conn : CONNECTORS) { + if (conn instanceof ILogin && conn.isActivated()) { + liveConns.add((ILogin) conn); + } + } + return liveConns.toArray(new ILogin[liveConns.size()]); + } + public static boolean canHandle(final String geocode) { if (isInvalidGeocode(geocode)) { return false; diff --git a/main/src/cgeo/geocaching/connector/capability/ILogin.java b/main/src/cgeo/geocaching/connector/capability/ILogin.java new file mode 100644 index 0000000..4a839c8 --- /dev/null +++ b/main/src/cgeo/geocaching/connector/capability/ILogin.java @@ -0,0 +1,57 @@ +package cgeo.geocaching.connector.capability; + +import cgeo.geocaching.connector.IConnector; + +import android.content.Context; +import android.os.Handler; + +public interface ILogin extends IConnector { + + + /** + * Contacts the server the connector belongs to + * and verifies/establishes authentication and + * retrieves information about the current user + * (Name, found caches) if applicable. + * + * @param handler + * Handler to receive status feedback + * @param fromActivity + * Calling activity context + * @return true in case of success, false in case of failure + */ + boolean login(Handler handler, Context fromActivity); + + /** + * Returns the status of the last {@link}login() request + * + * @return + */ + boolean isLoggedIn(); + + /** + * User-centered string describing the current login/connection status + * + * @return + */ + String getLoginStatusString(); + + /** + * Name the user has in this connector or empty string if not applicable + * It might be necessary to execute login before this information is valid. + * + * @return + */ + String getUserName(); + + /** + * Number of caches the user has found in this connector + * Normally retrieved/updated with (@see login). + * Might be out dated as changes on the connectors site + * are generally not notified. + * + * @return + */ + int getCachesFound(); + +} diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index fab4332..9e516e9 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -5,9 +5,12 @@ import cgeo.geocaching.ICache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Settings; +import cgeo.geocaching.SettingsActivity; import cgeo.geocaching.cgData; +import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.AbstractConnector; import cgeo.geocaching.connector.ILoggingManager; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByGeocode; import cgeo.geocaching.connector.capability.ISearchByViewPort; @@ -21,10 +24,12 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; +import android.content.Context; +import android.os.Handler; import java.util.regex.Pattern; -public class GCConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort { +public class GCConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort, ILogin { private static final String CACHE_URL_SHORT = "http://coord.info/"; // Double slash is used to force open in browser @@ -105,7 +110,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, @Override public String getName() { - return "GeoCaching.com"; + return "geocaching.com"; } @Override @@ -282,4 +287,46 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, } return R.drawable.marker; } + + @Override + public boolean login(Handler handler, Context fromActivity) { + // login + final StatusCode status = Login.login(); + + if (status == StatusCode.NO_ERROR) { + cgeoapplication.getInstance().firstRun = false; + Login.detectGcCustomDate(); + } + + if (cgeoapplication.getInstance().showLoginToast && handler != null) { + handler.sendMessage(handler.obtainMessage(0, status)); + cgeoapplication.getInstance().showLoginToast = false; + + // invoke settings activity to insert login details + if (status == StatusCode.NO_LOGIN_INFO_STORED && fromActivity != null) { + SettingsActivity.startActivity(fromActivity); + } + } + return status == StatusCode.NO_ERROR; + } + + @Override + public String getUserName() { + return Login.getActualUserName(); + } + + @Override + public int getCachesFound() { + return Login.getActualCachesFound(); + } + + @Override + public String getLoginStatusString() { + return Login.getActualStatus(); + } + + @Override + public boolean isLoggedIn() { + return Login.isActualLoginStatus(); + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index 4c6db97..87a0fd9 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -1,14 +1,17 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.Geocache; +import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ILoggingManager; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.oc.OkapiClient.UserInfo; +import cgeo.geocaching.connector.oc.OkapiClient.UserInfo.UserInfoStatus; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.utils.CryptUtils; @@ -16,11 +19,13 @@ import cgeo.geocaching.utils.CryptUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; +import android.content.Context; +import android.os.Handler; -public class OCApiLiveConnector extends OCApiConnector implements ISearchByCenter, ISearchByViewPort { +public class OCApiLiveConnector extends OCApiConnector implements ISearchByCenter, ISearchByViewPort, ILogin { private String cS; - private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, false); + private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.NOT_RETRIEVED); public OCApiLiveConnector(String name, String host, String prefix, int cKResId, int cSResId, ApiSupport apiSupport) { super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId)), apiSupport); @@ -104,16 +109,40 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente return getSupportedAuthLevel() == OAuthLevel.Level3; } - public boolean retrieveUserInfo() { - userInfo = OkapiClient.getUserInfo(this); - return userInfo.isRetrieveSuccessful(); + @Override + public boolean login(Handler handler, Context fromActivity) { + if (supportsPersonalization()) { + userInfo = OkapiClient.getUserInfo(this); + } + return userInfo.getStatus() == UserInfoStatus.SUCCESSFUL; } - public Object getUserName() { + @Override + public String getUserName() { return userInfo.getName(); } + @Override public int getCachesFound() { return userInfo.getFinds(); } + + @Override + public String getLoginStatusString() { + switch (userInfo.getStatus()) { + case NOT_RETRIEVED: + return cgeoapplication.getInstance().getString(R.string.init_login_popup_working); + case SUCCESSFUL: + return cgeoapplication.getInstance().getString(R.string.init_login_popup_ok); + case FAILED: + return cgeoapplication.getInstance().getString(R.string.init_login_popup_failed); + default: + return "Error"; + } + } + + @Override + public boolean isLoggedIn() { + return userInfo.getStatus() == UserInfoStatus.SUCCESSFUL; + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index f818a7c..c94cb02 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -14,6 +14,7 @@ import cgeo.geocaching.connector.LogResult; import cgeo.geocaching.connector.gc.GCConnector; import cgeo.geocaching.connector.oc.OCApiConnector.ApiSupport; import cgeo.geocaching.connector.oc.OCApiConnector.OAuthLevel; +import cgeo.geocaching.connector.oc.OkapiClient.UserInfo.UserInfoStatus; import cgeo.geocaching.enumerations.CacheAttribute; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; @@ -664,7 +665,7 @@ final public class OkapiClient { final JSONObject data = request(connector, OkapiService.SERVICE_USER, params); if (data == null) { - return new UserInfo(StringUtils.EMPTY, 0, false); + return new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.FAILED); } String name = StringUtils.EMPTY; @@ -693,19 +694,25 @@ final public class OkapiClient { success = false; } - return new UserInfo(name, finds, success); + return new UserInfo(name, finds, success ? UserInfoStatus.SUCCESSFUL : UserInfoStatus.FAILED); } public static class UserInfo { + public enum UserInfoStatus { + NOT_RETRIEVED, + SUCCESSFUL, + FAILED + } + private final String name; private final int finds; - private final boolean retrieveSuccessful; + private final UserInfoStatus status; - UserInfo(String name, int finds, boolean retrieveSuccessful) { + UserInfo(String name, int finds, UserInfoStatus status) { this.name = name; this.finds = finds; - this.retrieveSuccessful = retrieveSuccessful; + this.status = status; } public String getName() { @@ -716,8 +723,8 @@ final public class OkapiClient { return finds; } - public boolean isRetrieveSuccessful() { - return retrieveSuccessful; + public UserInfoStatus getStatus() { + return status; } } |
