aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/res/layout/main.xml3
-rw-r--r--main/res/values/styles.xml1
-rw-r--r--main/src/cgeo/geocaching/GCConstants.java11
-rw-r--r--main/src/cgeo/geocaching/Settings.java2
-rw-r--r--main/src/cgeo/geocaching/cgBase.java90
-rw-r--r--main/src/cgeo/geocaching/cgeo.java28
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java2
7 files changed, 117 insertions, 20 deletions
diff --git a/main/res/layout/main.xml b/main/res/layout/main.xml
index bbbd214..6fd54f1 100644
--- a/main/res/layout/main.xml
+++ b/main/res/layout/main.xml
@@ -168,6 +168,9 @@
android:layout_marginRight="6dip"
android:layout_marginLeft="6dip"
android:orientation="vertical">
+ <TextView android:id="@+id/user_info"
+ style="@style/location_current"
+ android:text="@string/init_login_popup_working"/>
<TextView android:id="@+id/nav_location"
style="@style/location_current"
android:text="@string/loc_trying" />
diff --git a/main/res/values/styles.xml b/main/res/values/styles.xml
index ad3fc8d..1e0d8a2 100644
--- a/main/res/values/styles.xml
+++ b/main/res/values/styles.xml
@@ -196,7 +196,6 @@
<item name="android:ellipsize">marquee</item>
<item name="android:textSize">14dip</item>
<item name="android:textColor">@color/text_icon</item>
- <item name="android:background">@drawable/icon_bcg</item>
</style>
<style name="location_current_type">
diff --git a/main/src/cgeo/geocaching/GCConstants.java b/main/src/cgeo/geocaching/GCConstants.java
index 40fc248..24a3056 100644
--- a/main/src/cgeo/geocaching/GCConstants.java
+++ b/main/src/cgeo/geocaching/GCConstants.java
@@ -56,11 +56,14 @@ public final class GCConstants {
public final static Pattern PATTERN_INVENTORYINSIDE = Pattern.compile("[^<]*<li>[^<]*<a href=\"[a-z0-9\\-\\_\\.\\?\\/\\:\\@]*\\/track\\/details\\.aspx\\?guid=([0-9a-z\\-]+)[^\"]*\"[^>]*>[^<]*<img src=\"[^\"]+\"[^>]*>[^<]*<span>([^<]+)<\\/span>[^<]*<\\/a>[^<]*<\\/li>");
public final static Pattern PATTERN_WATCHLIST = Pattern.compile("icon_stop_watchlist.gif");
- public static final Pattern PATTERN_LOGGEDIN = Pattern.compile("<span class=\"Success\">You are logged in as[^<]*<strong[^>]*>([^<]+)</strong>[^<]*</span>");
- public static final Pattern PATTERN_LOGGEDIN2 = Pattern.compile("<strong>\\W*Hello,[^<]*<a[^>]+>([^<]+)</a>[^<]*</strong>");
+ // Info box top-right
+ public static final Pattern PATTERN_LOGIN_NAME = Pattern.compile("<strong>\\W*Hello,[^<]*<a[^>]+>([^<]+)</a>[^<]*</strong>");
+ public static final Pattern PATTERN_MEMBER_STATUS = Pattern.compile("<span id=\"ctl00_litPMLevel\" style=\"display: block;\">([^<]+)</span>");
+ public static final Pattern PATTERN_CACHES_FOUND = Pattern.compile("<img src=\"/images/icons/icon_smile.png\" title=\"Caches Found\" /> (\\d+)&");
+
+ public static final Pattern PATTERN_AVATAR_IMAGE_PROFILE_PAGE = Pattern.compile("<img src=\"(http://img.geocaching.com/user/avatar/[0-9a-f-]+\\.jpg)\"[^>]*\\salt=\"Avatar\"");
+ public static final Pattern PATTERN_LOGIN_NAME_LOGIN_PAGE = Pattern.compile("<span class=\"Success\">You are logged in as[^<]*<strong[^>]*>([^<]+)</strong>[^<]*</span>");
public static final Pattern PATTERN_USERLOGGEDIN = Pattern.compile("<strong>Hello, <a href=\"/my/default.aspx\" title=\"View Profile for[^\"]*\" class=\"SignedInProfileLink\">(.*?)</a></strong>");
- public static final Pattern PATTERN_AVATAR_IMAGE = Pattern.compile("<img src=\"(http://img.geocaching.com/user/avatar/[0-9a-f-]+\\.jpg)\"[^>]*\\salt=\"Avatar\"");
- public static final Pattern PATTERN_MEMBER_STATUS = Pattern.compile("<p class=\"NoBottomSpacing\" id=\"memberStatus\">([^<]+)<br");
public static final Pattern PATTERN_CUSTOMDATE = Pattern.compile("<option selected=\"selected\" value=\"([ /Mdy-]+)\">");
/**
diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java
index 49f36a5..b8eeccf 100644
--- a/main/src/cgeo/geocaching/Settings.java
+++ b/main/src/cgeo/geocaching/Settings.java
@@ -194,7 +194,7 @@ public final class Settings {
}
public static String getMemberStatus() {
- return sharedPrefs.getString(KEY_MEMBER_STATUS, null);
+ return sharedPrefs.getString(KEY_MEMBER_STATUS, "");
}
public static boolean setMemberStatus(final String memberStatus) {
diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java
index 008af8d..ff9f27d 100644
--- a/main/src/cgeo/geocaching/cgBase.java
+++ b/main/src/cgeo/geocaching/cgBase.java
@@ -141,6 +141,13 @@ public class cgBase {
public static final int UPDATE_LOAD_PROGRESS_DETAIL = 42186;
+ // false = not logged in
+ private static boolean actualLoginStatus = false;
+ private static String actualUserName = "";
+ private static String actualMemberStatus = "";
+ private static int actualCachesFound = -1;
+ private static String actualStatus = "";
+
private cgBase() {
//initialize(app);
throw new UnsupportedOperationException(); // static class, not to be instantiated
@@ -150,6 +157,7 @@ public class cgBase {
context = app.getBaseContext();
res = app.getBaseContext().getResources();
+ cgBase.actualStatus = res.getString(R.string.init_login_popup_working);
try {
final PackageManager manager = app.getPackageManager();
@@ -304,7 +312,7 @@ public class cgBase {
return StatusCode.CONNECTION_FAILED; // no loginpage
}
- if (checkLogin(loginData)) {
+ if (getLoginStatus(loginData)) {
Log.i(Settings.tag, "Already logged in Geocaching.com as " + login.left);
switchToEnglish(loginData);
return StatusCode.NO_ERROR; // logged in
@@ -331,7 +339,7 @@ public class cgBase {
loginData = getResponseData(loginResponse);
if (StringUtils.isNotBlank(loginData)) {
- if (checkLogin(loginData)) {
+ if (getLoginStatus(loginData)) {
Log.i(Settings.tag, "Successfully logged in Geocaching.com as " + login.left);
switchToEnglish(loginData);
@@ -372,22 +380,34 @@ public class cgBase {
* @param page
* @return true = User has been logged in, false else
*/
- private static boolean checkLogin(String page) {
+ private static boolean getLoginStatus(String page) {
if (StringUtils.isBlank(page)) {
Log.e(Settings.tag, "cgeoBase.checkLogin: No page given");
return false;
}
- // on every page
- if (BaseUtils.matches(page, GCConstants.PATTERN_LOGGEDIN2)) {
+ cgBase.actualStatus = res.getString(R.string.init_login_popup_ok);
+
+ // on every page except login page
+ cgBase.actualLoginStatus = BaseUtils.matches(page, GCConstants.PATTERN_LOGIN_NAME);
+ if (cgBase.actualLoginStatus) {
+ cgBase.actualUserName = BaseUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???");
+ cgBase.actualMemberStatus = BaseUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, "???");
+ cgBase.actualCachesFound = Integer.parseInt(BaseUtils.getMatch(page, GCConstants.PATTERN_CACHES_FOUND, true, "0"));
return true;
}
- // after login
- if (BaseUtils.matches(page, GCConstants.PATTERN_LOGGEDIN)) {
+ // login page
+ cgBase.actualLoginStatus = BaseUtils.matches(page, GCConstants.PATTERN_LOGIN_NAME_LOGIN_PAGE);
+ if (cgBase.actualLoginStatus) {
+ cgBase.actualUserName = Settings.getUsername();
+ cgBase.actualMemberStatus = Settings.getMemberStatus();
+ // number of caches found is not part of this page
return true;
}
+ cgBase.actualStatus = res.getString(R.string.err_login_failed);
+
return false;
}
@@ -1414,7 +1434,9 @@ public class cgBase {
Settings.setMemberStatus(BaseUtils.getMatch(profile, GCConstants.PATTERN_MEMBER_STATUS, true, null));
- final String avatarURL = BaseUtils.getMatch(profile, GCConstants.PATTERN_AVATAR_IMAGE, false, null);
+ cgBase.actualCachesFound = Integer.parseInt(BaseUtils.getMatch(profile, GCConstants.PATTERN_CACHES_FOUND, true, "-1"));
+
+ final String avatarURL = BaseUtils.getMatch(profile, GCConstants.PATTERN_AVATAR_IMAGE_PROFILE_PAGE, false, null);
if (null != avatarURL) {
final HtmlImage imgGetter = new HtmlImage(context, "", false, 0, false);
return imgGetter.getDrawable(avatarURL);
@@ -1763,7 +1785,7 @@ public class cgBase {
putViewstates(params, viewstates);
String page = getResponseData(postRequest(uri, params));
- if (!checkLogin(page)) {
+ if (!getLoginStatus(page)) {
final StatusCode loginState = login();
if (loginState == StatusCode.NO_ERROR) {
page = getResponseData(postRequest(uri, params));
@@ -1860,6 +1882,8 @@ public class cgBase {
final ParseResult search = ParseResult.filterParseResults(parseResult, Settings.isExcludeDisabledCaches(), false, cacheType);
cgeoapplication.getInstance().addSearch(search.cacheList, listId);
+ getLoginStatus(page);
+
return search;
}
@@ -2052,7 +2076,7 @@ public class cgBase {
final String uri = new Uri.Builder().scheme("http").authority("www.geocaching.com").path("/seek/log.aspx").encodedQuery("ID=" + cacheid).build().toString();
String page = getResponseData(postRequest(uri, params));
- if (!checkLogin(page)) {
+ if (!getLoginStatus(page)) {
final StatusCode loginState = login();
if (loginState == StatusCode.NO_ERROR) {
page = getResponseData(postRequest(uri, params));
@@ -2128,6 +2152,9 @@ public class cgBase {
app.saveVisitDate(geocode);
}
+ getLoginStatus(page);
+ // the log-successful-page contains still the old value
+ actualCachesFound++;
return StatusCode.NO_ERROR;
}
} catch (Exception e) {
@@ -2177,7 +2204,7 @@ public class cgBase {
final String uri = new Uri.Builder().scheme("http").authority("www.geocaching.com").path("/track/log.aspx").encodedQuery("wid=" + tbid).build().toString();
String page = getResponseData(postRequest(uri, params));
- if (!checkLogin(page)) {
+ if (!getLoginStatus(page)) {
final StatusCode loginState = login();
if (loginState == StatusCode.NO_ERROR) {
page = getResponseData(postRequest(uri, params));
@@ -2393,7 +2420,7 @@ public class cgBase {
HttpResponse response = postRequest(uri, null);
String data = getResponseData(response);
- if (!checkLogin(data)) {
+ if (!getLoginStatus(data)) {
if (login() == StatusCode.NO_ERROR) {
response = postRequest(uri, null);
data = getResponseData(response);
@@ -2418,7 +2445,7 @@ public class cgBase {
HttpResponse response = request(uri, params, xContentType, my, addF);
String data = getResponseData(response);
- if (!checkLogin(data)) {
+ if (!getLoginStatus(data)) {
if (login() == StatusCode.NO_ERROR) {
response = request(uri, params, xContentType, my, addF);
data = getResponseData(response);
@@ -3083,4 +3110,41 @@ public class cgBase {
return null;
}
+ public static boolean isActualLoginStatus() {
+ return actualLoginStatus;
+ }
+
+ public static void setActualLoginStatus(boolean actualLoginStatus) {
+ cgBase.actualLoginStatus = actualLoginStatus;
+ }
+
+ public static String getActualUserName() {
+ return actualUserName;
+ }
+
+ public static void setActualUserName(String actualUserName) {
+ cgBase.actualUserName = actualUserName;
+ }
+
+ public static String getActualMemberStatus() {
+ return actualMemberStatus;
+ }
+
+ public static void setActualMemberStatus(String actualMemberStatus) {
+ cgBase.actualMemberStatus = actualMemberStatus;
+ }
+
+ public static int getActualCachesFound() {
+ return actualCachesFound;
+ }
+
+ public static void setActualCachesFound(int actualCachesFound) {
+ cgBase.actualCachesFound = actualCachesFound;
+ }
+
+ public static String getActualStatus() {
+ return actualStatus;
+ }
+
}
+
diff --git a/main/src/cgeo/geocaching/cgeo.java b/main/src/cgeo/geocaching/cgeo.java
index 7c80834..ff47b15 100644
--- a/main/src/cgeo/geocaching/cgeo.java
+++ b/main/src/cgeo/geocaching/cgeo.java
@@ -9,6 +9,7 @@ import cgeo.geocaching.enumerations.StatusCode;
import cgeo.geocaching.enumerations.WaypointType;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.maps.CGeoMap;
+import cgeo.geocaching.ui.CacheListAdapter;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -61,6 +62,28 @@ public class cgeo extends AbstractActivity {
private List<Address> addresses = null;
private boolean addressObtaining = false;
private boolean initialized = false;
+
+ private Handler updateUserInfoHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ TextView userInfoView = (TextView) findViewById(R.id.user_info);
+
+ String userInfo = "geocaching.com" + CacheListAdapter.SEPARATOR;
+ if (cgBase.isActualLoginStatus()) {
+ userInfo += cgBase.getActualUserName();
+ if (cgBase.getActualCachesFound() >= 0) {
+ userInfo += " (" + String.valueOf(cgBase.getActualCachesFound()) + ")";
+ }
+ userInfo += CacheListAdapter.SEPARATOR;
+ }
+ userInfo += cgBase.getActualStatus();
+
+ userInfoView.setText(userInfo);
+ }
+ };
+
private Handler obtainAddressHandler = new Handler() {
@Override
@@ -180,6 +203,8 @@ public class cgeo extends AbstractActivity {
public void onResume() {
super.onResume();
+ updateUserInfoHandler.sendEmptyMessage(-1);
+
init();
}
@@ -742,11 +767,13 @@ public class cgeo extends AbstractActivity {
return;
}
+ // login
final StatusCode status = cgBase.login();
if (status == StatusCode.NO_ERROR) {
app.firstRun = false;
cgBase.detectGcCustomDate();
+ updateUserInfoHandler.sendEmptyMessage(-1);
}
if (app.showLoginToast) {
@@ -808,4 +835,5 @@ public class cgeo extends AbstractActivity {
public void goSearch(View view) {
onSearchRequested();
}
+
}
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index 11a70b7..bc046f1 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -79,7 +79,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
* time in milliseconds after which the list may be resorted due to position updates
*/
private static final int PAUSE_BETWEEN_LIST_SORT = 1000;
- private static final String SEPARATOR = " · ";
+ public static final String SEPARATOR = " · ";
private IFilter currentFilter = null;
private List<cgCache> originalList = null;
private final CacheListType cacheListType;