aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/res/values/changelog_release.xml1
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java9
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCLogin.java33
-rw-r--r--main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java2
-rw-r--r--tests/src/cgeo/geocaching/connector/gc/GCLoginTest.java2
-rw-r--r--tests/src/cgeo/geocaching/utils/TextUtilsTest.java1
6 files changed, 29 insertions, 19 deletions
diff --git a/main/res/values/changelog_release.xml b/main/res/values/changelog_release.xml
index e8f26d3..795f014 100644
--- a/main/res/values/changelog_release.xml
+++ b/main/res/values/changelog_release.xml
@@ -3,6 +3,7 @@
<!-- changelog for the release branch -->
<string name="changelog_release" translatable="false">\n
<b>Next feature release:</b>\n
+ · Fix: Adaption to website changes on gc.com\n
· New: Distance and direction shown on map of a single cache\n
· New: Show own saved log first in logbook\n
· New: Show hint in compass and map action bar\n
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
index 6e6c8b8..2668fbf 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
@@ -68,12 +68,11 @@ public final class GCConstants {
// Info box top-right
public static final Pattern PATTERN_LOGIN_NAME = Pattern.compile("\"SignedInProfileLink\">(.*?)</a>");
- public static final Pattern PATTERN_MEMBER_STATUS = Pattern.compile("<span id=\"ctl00_litPMLevel\">([^<]+)</span>");
- static final String MEMBER_STATUS_RENEW = "<a id=\"ctl00_hlRenew";
- public static final String MEMBER_STATUS_PREMIUM = "Premium Member";
- public static final String MEMBER_STATUS_CHARTER = "Charter Member";
+ public static final Pattern PATTERN_MEMBERSHIP = Pattern.compile("<dl class=\"membership-details\">.*?<dt>Membership</dt>.*?<dd>\\s*(\\p{Alpha}+)\\s*</dd>", Pattern.DOTALL);
+ public static final String MEMBER_STATUS_PREMIUM = "Premium";
+ public static final String MEMBER_STATUS_CHARTER = "Charter";
/** Use replaceAll("[,.]","") on the resulting string before converting to an int */
- static final Pattern PATTERN_CACHES_FOUND = Pattern.compile("<strong[^>]*>.*?([\\d,.]+) Caches? Found", Pattern.DOTALL);
+ static final Pattern PATTERN_CACHES_FOUND = Pattern.compile("<span[^>]*>.*?([\\d,.]+) Finds?", Pattern.DOTALL);
static final Pattern PATTERN_AVATAR_IMAGE_PROFILE_PAGE = Pattern.compile("src=\"(https?://(img(?:cdn)?\\.geocaching\\.com|[^>\"]+\\.cloudfront\\.net)/avatar/[0-9a-f-]+\\.jpg)\"[^>]*alt=\"");
static final Pattern PATTERN_LOGIN_NAME_LOGIN_PAGE = Pattern.compile("ctl00_ContentBody_lbUsername\">.*<strong>(.*)</strong>");
static final Pattern PATTERN_CUSTOMDATE = Pattern.compile("<option selected=\"selected\" value=\"([ /.Mdy-]+)\">");
diff --git a/main/src/cgeo/geocaching/connector/gc/GCLogin.java b/main/src/cgeo/geocaching/connector/gc/GCLogin.java
index 71c31c1..16de511 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCLogin.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCLogin.java
@@ -32,10 +32,11 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
+import java.util.regex.Matcher;
public class GCLogin extends AbstractLogin {
- private final static String ENGLISH = "<a href=\"#\">English &#9660;</a>";
+ private final static String ENGLISH = "<a href=\"#\">English</a>";
private static final String LANGUAGE_CHANGE_URI = "http://www.geocaching.com/my/souvenirs.aspx";
@@ -87,6 +88,7 @@ public class GCLogin extends AbstractLogin {
return login(false);
}
setHomeLocation();
+ refreshMemberStatus();
detectGcCustomDate();
return StatusCode.NO_ERROR; // logged in
}
@@ -124,6 +126,8 @@ public class GCLogin extends AbstractLogin {
}
Log.i("Successfully logged in Geocaching.com as " + username + " (" + Settings.getGCMemberStatus() + ')');
Settings.setCookieStore(Cookies.dumpCookieStore());
+ setHomeLocation();
+ refreshMemberStatus();
detectGcCustomDate();
return StatusCode.NO_ERROR; // logged in
}
@@ -192,10 +196,6 @@ public class GCLogin extends AbstractLogin {
Log.e("getLoginStatus: bad cache count", e);
}
setActualCachesFound(cachesCount);
- Settings.setGCMemberStatus(TextUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, null));
- if (page.contains(GCConstants.MEMBER_STATUS_RENEW)) {
- Settings.setGCMemberStatus(GCConstants.MEMBER_STATUS_PREMIUM);
- }
return true;
}
@@ -242,16 +242,11 @@ public class GCLogin extends AbstractLogin {
return false;
}
- public Observable<Drawable> downloadAvatarAndGetMemberStatus() {
+ public Observable<Drawable> downloadAvatar() {
try {
final String responseData = StringUtils.defaultString(Network.getResponseData(Network.getRequest("http://www.geocaching.com/my/")));
final String profile = TextUtils.replaceWhitespace(responseData);
- Settings.setGCMemberStatus(TextUtils.getMatch(profile, GCConstants.PATTERN_MEMBER_STATUS, true, null));
- if (profile.contains(GCConstants.MEMBER_STATUS_RENEW)) {
- Settings.setGCMemberStatus(GCConstants.MEMBER_STATUS_PREMIUM);
- }
-
setActualCachesFound(Integer.parseInt(removeDotAndComma(TextUtils.getMatch(profile, GCConstants.PATTERN_CACHES_FOUND, true, "-1"))));
final String avatarURL = TextUtils.getMatch(profile, GCConstants.PATTERN_AVATAR_IMAGE_PROFILE_PAGE, false, null);
@@ -287,6 +282,22 @@ public class GCLogin extends AbstractLogin {
});
}
+ private static void refreshMemberStatus() {
+ RxUtils.networkScheduler.createWorker().schedule(new Action0() {
+ @Override
+ public void call() {
+ final String page = StringUtils.defaultString(Network.getResponseData(Network.getRequest("https://www.geocaching.com/account/settings/membership")));
+ final Matcher match = GCConstants.PATTERN_MEMBERSHIP.matcher(page);
+ if (match.find()) {
+ Log.d("Setting member status to " + match.group(1));
+ Settings.setGCMemberStatus(match.group(1));
+ } else {
+ Log.w("Cannot determine member status");
+ }
+ }
+ });
+ }
+
/**
* Detect user date settings on geocaching.com
*/
diff --git a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
index 6d4d9c2..04f406f 100644
--- a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
+++ b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
@@ -31,7 +31,7 @@ public class CheckGcCredentialsPreference extends AbstractCheckCredentialsPrefer
final StatusCode loginResult = GCLogin.getInstance().login();
switch (loginResult) {
case NO_ERROR:
- return ImmutablePair.of(StatusCode.NO_ERROR, GCLogin.getInstance().downloadAvatarAndGetMemberStatus());
+ return ImmutablePair.of(StatusCode.NO_ERROR, GCLogin.getInstance().downloadAvatar());
default:
return ImmutablePair.of(loginResult, null);
}
diff --git a/tests/src/cgeo/geocaching/connector/gc/GCLoginTest.java b/tests/src/cgeo/geocaching/connector/gc/GCLoginTest.java
index fc23ab3..6022e59 100644
--- a/tests/src/cgeo/geocaching/connector/gc/GCLoginTest.java
+++ b/tests/src/cgeo/geocaching/connector/gc/GCLoginTest.java
@@ -26,7 +26,7 @@ public class GCLoginTest extends TestCase {
@Suppress // It currently fails on CI
public void testAvatar() {
- assertThat(instance.downloadAvatarAndGetMemberStatus()).isNotNull();
+ assertThat(instance.downloadAvatar()).isNotNull();
}
}
diff --git a/tests/src/cgeo/geocaching/utils/TextUtilsTest.java b/tests/src/cgeo/geocaching/utils/TextUtilsTest.java
index bc49c30..6c6b82d 100644
--- a/tests/src/cgeo/geocaching/utils/TextUtilsTest.java
+++ b/tests/src/cgeo/geocaching/utils/TextUtilsTest.java
@@ -14,7 +14,6 @@ public class TextUtilsTest extends AndroidTestCase {
public static void testRegEx() {
final String page = MockedCache.readCachePage("GC2CJPF");
assertThat(TextUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???")).isEqualTo(GCConstantsTest.MOCK_LOGIN_NAME);
- assertThat(page.contains("id=\"ctl00_hlRenew\"") || GCConstants.MEMBER_STATUS_PREMIUM.equals(TextUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, "???"))).isTrue();
}
public static void testReplaceWhitespaces() {