diff options
| -rw-r--r-- | main/res/layout/main.xml | 3 | ||||
| -rw-r--r-- | main/res/values/styles.xml | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/GCConstants.java | 11 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Settings.java | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgBase.java | 90 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeo.java | 28 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/CacheListAdapter.java | 2 |
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; |
