diff options
Diffstat (limited to 'main/src/cgeo')
4 files changed, 143 insertions, 22 deletions
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 9c3e89f..ff24322 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -4,7 +4,10 @@ import butterknife.InjectView; import butterknife.Views; import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.connector.ConnectorFactory; +import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.gc.Login; +import cgeo.geocaching.connector.oc.OCApiLiveConnector; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; @@ -50,7 +53,8 @@ import java.util.List; import java.util.Locale; public class MainActivity extends AbstractActivity { - @InjectView(R.id.user_info) protected TextView userInfoView; + @InjectView(R.id.user_info_gc) protected TextView userInfoViewGc; + @InjectView(R.id.user_info_ocde) protected TextView userInfoViewOcDe; @InjectView(R.id.nav_satellites) protected TextView navSatellites; @InjectView(R.id.filter_button_title)protected TextView filterTitle; @InjectView(R.id.map) protected ImageView findOnMap; @@ -82,8 +86,8 @@ public class MainActivity extends AbstractActivity { @Override public void handleMessage(Message msg) { - StringBuilder userInfo = new StringBuilder("geocaching.com").append(Formatter.SEPARATOR); if (Settings.isGCConnectorActive()) { + StringBuilder userInfo = new StringBuilder("geocaching.com").append(Formatter.SEPARATOR); if (Login.isActualLoginStatus()) { userInfo.append(Login.getActualUserName()); if (Login.getActualCachesFound() >= 0) { @@ -92,12 +96,36 @@ public class MainActivity extends AbstractActivity { userInfo.append(Formatter.SEPARATOR); } userInfo.append(Login.getActualStatus()); + + userInfoViewGc.setText(userInfo.toString()); + userInfoViewGc.setVisibility(View.VISIBLE); + } + else { + userInfoViewGc.setVisibility(View.GONE); + } + + if (Settings.isOCConnectorActive()) { + StringBuilder userInfo = new StringBuilder("opencaching.de").append(Formatter.SEPARATOR); + IConnector conn = ConnectorFactory.getConnector("OCXXXX"); + if (conn instanceof OCApiLiveConnector) { + OCApiLiveConnector ocapiConn = (OCApiLiveConnector) conn; + if (ocapiConn.supportsPersonalization()) { + userInfo.append(ocapiConn.getUserName()); + int count = ocapiConn.getCachesFound(); + if (count >= 0) { + userInfo.append(" (").append(String.valueOf(count)).append(')'); + } + } else { + userInfo.append("Anonymous"); + } + } + userInfoViewOcDe.setText(userInfo.toString()); + userInfoViewOcDe.setVisibility(View.VISIBLE); } else { - userInfo.append("<disabled>"); // TODO this is just a quick fix. We need some better status implementation showing multiple connectors. + userInfoViewOcDe.setVisibility(View.GONE); } - userInfoView.setText(userInfo.toString()); } }; @@ -699,26 +727,34 @@ public class MainActivity extends AbstractActivity { return; } - if (!Settings.isGCConnectorActive()) { - return; - } - - // login - final StatusCode status = Login.login(); + if (Settings.isGCConnectorActive()) { + // login + final StatusCode status = Login.login(); - if (status == StatusCode.NO_ERROR) { - app.firstRun = false; - Login.detectGcCustomDate(); - updateUserInfoHandler.sendEmptyMessage(-1); - } + if (status == StatusCode.NO_ERROR) { + app.firstRun = false; + Login.detectGcCustomDate(); + updateUserInfoHandler.sendEmptyMessage(-1); + } - if (app.showLoginToast) { - firstLoginHandler.sendMessage(firstLoginHandler.obtainMessage(0, status)); - app.showLoginToast = false; + if (app.showLoginToast) { + firstLoginHandler.sendMessage(firstLoginHandler.obtainMessage(0, status)); + app.showLoginToast = false; - // invoke settings activity to insert login details - if (status == StatusCode.NO_LOGIN_INFO_STORED) { - SettingsActivity.startActivity(MainActivity.this); + // invoke settings activity to insert login details + if (status == StatusCode.NO_LOGIN_INFO_STORED) { + SettingsActivity.startActivity(MainActivity.this); + } + } + } + if (Settings.isOCConnectorActive()) { + IConnector conn = ConnectorFactory.getConnector("OCXXXX"); + if (conn instanceof OCApiLiveConnector) { + OCApiLiveConnector ocapiConn = (OCApiLiveConnector) conn; + if (ocapiConn.supportsPersonalization()) { + ocapiConn.retrieveUserInfo(); + } + updateUserInfoHandler.sendEmptyMessage(-1); } } } diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index 59d0f56..4c6db97 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -8,6 +8,7 @@ import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByViewPort; +import cgeo.geocaching.connector.oc.OkapiClient.UserInfo; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.utils.CryptUtils; @@ -19,6 +20,7 @@ import android.app.Activity; public class OCApiLiveConnector extends OCApiConnector implements ISearchByCenter, ISearchByViewPort { private String cS; + private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, false); 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); @@ -97,4 +99,21 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente public boolean canLog(Geocache cache) { return true; } + + public boolean supportsPersonalization() { + return getSupportedAuthLevel() == OAuthLevel.Level3; + } + + public boolean retrieveUserInfo() { + userInfo = OkapiClient.getUserInfo(this); + return userInfo.isRetrieveSuccessful(); + } + + public Object getUserName() { + return userInfo.getName(); + } + + public int getCachesFound() { + return userInfo.getFinds(); + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index 39f9ddf..9920e6f 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -100,6 +100,8 @@ final public class OkapiClient { private static final String LOG_USER = "user"; private static final String USER_USERNAME = "username"; + private static final String USER_CACHES_FOUND = "caches_found"; + private static final String USER_INFO_FIELDS = "username|caches_found"; // the several realms of possible fields for cache retrieval: // Core: for livemap requests (L3 - only with level 3 auth) @@ -678,4 +680,67 @@ final public class OkapiClient { } } + public static UserInfo getUserInfo(OCApiLiveConnector connector) { + final Parameters params = new Parameters("fields", USER_INFO_FIELDS); + + final JSONObject data = request(connector, OkapiService.SERVICE_USER, params); + + if (data == null) { + return new UserInfo(StringUtils.EMPTY, 0, false); + } + + String name = StringUtils.EMPTY; + int finds = 0; + boolean success = true; + + if (!data.isNull(USER_USERNAME)) { + try { + name = data.getString(USER_USERNAME); + } catch (JSONException e) { + Log.e("OkapiClient.getUserInfo - name", e); + success = false; + } + } else { + success = false; + } + + if (!data.isNull(USER_CACHES_FOUND)) { + try { + finds = data.getInt(USER_CACHES_FOUND); + } catch (JSONException e) { + Log.e("OkapiClient.getUserInfo - finds", e); + success = false; + } + } else { + success = false; + } + + return new UserInfo(name, finds, success); + } + + public static class UserInfo { + + private final String name; + private final int finds; + private final boolean retrieveSuccessful; + + UserInfo(String name, int finds, boolean retrieveSuccessful) { + this.name = name; + this.finds = finds; + this.retrieveSuccessful = retrieveSuccessful; + } + + public String getName() { + return name; + } + + public int getFinds() { + return finds; + } + + public boolean isRetrieveSuccessful() { + return retrieveSuccessful; + } + } + } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiService.java b/main/src/cgeo/geocaching/connector/oc/OkapiService.java index 9b47596..ec09527 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiService.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiService.java @@ -7,7 +7,8 @@ enum OkapiService { SERVICE_CACHE("/okapi/services/caches/geocache", OAuthLevel.Level1), SERVICE_SEARCH_AND_RETRIEVE("/okapi/services/caches/shortcuts/search_and_retrieve", OAuthLevel.Level1), SERVICE_MARK_CACHE("/okapi/services/caches/mark", OAuthLevel.Level3), - SERVICE_SUBMIT_LOG("/okapi/services/logs/submit", OAuthLevel.Level3); + SERVICE_SUBMIT_LOG("/okapi/services/logs/submit", OAuthLevel.Level3), + SERVICE_USER("/okapi/services/users/user", OAuthLevel.Level1); final String methodName; final OAuthLevel level; |
