aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorMarco Jacob <mjacob@union06.de>2014-05-02 10:15:01 +0200
committerMarco Jacob <mjacob@union06.de>2014-05-03 22:26:16 +0200
commitc54322f5fc29e4b8f632521b0b4c1f479528b9d5 (patch)
tree7c914a0828fd040c9f08a9c80cf422d98a4ae3fb /main
parent73a6f622ec617a95ab1969ad1b4135e20f296030 (diff)
downloadcgeo-c54322f5fc29e4b8f632521b0b4c1f479528b9d5.zip
cgeo-c54322f5fc29e4b8f632521b0b4c1f479528b9d5.tar.gz
cgeo-c54322f5fc29e4b8f632521b0b4c1f479528b9d5.tar.bz2
Fixes #1793 - personal logs on friends logs tab
Diffstat (limited to 'main')
-rw-r--r--main/res/values/strings.xml6
-rw-r--r--main/res/xml/preferences.xml4
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java2
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java137
4 files changed, 92 insertions, 57 deletions
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 6a0e571..a9d92d0 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -451,8 +451,8 @@
<string name="init_signature_template_log">Log text</string>
<string name="init_ratingwanted">GCvote Rating</string>
<string name="init_summary_ratingwanted">Load cache rating from GCvote.com</string>
- <string name="init_friendlogswanted">Show Friends\' Logs</string>
- <string name="init_summary_friendlogswanted">Display additional logbook page for logs from friends</string>
+ <string name="init_friends_and_own_logs_wanted">Show Friends\'/Own</string>
+ <string name="init_summary_friends_and_own_logs_wanted">Display additional logbook page for friends\' and own logs</string>
<string name="init_openlastdetailspage">Last Details Page</string>
<string name="init_summary_openlastdetailspage">Open details with last used page</string>
<string name="init_autoload">Long Description</string>
@@ -659,7 +659,7 @@
<string name="cache_waypoints_add">Add Waypoint</string>
<string name="cache_hint">Hint</string>
<string name="cache_logs">Logbook</string>
- <string name="cache_logsfriends">Logbook (Friends)</string>
+ <string name="cache_logs_friends_and_own">Friends/Own Logs</string>
<string name="cache_dialog_loading_details">Loading cache details…</string>
<string name="cache_dialog_loading_details_status_loadpage">Loading page</string>
<string name="cache_dialog_loading_details_status_details">Processing details</string>
diff --git a/main/res/xml/preferences.xml b/main/res/xml/preferences.xml
index d550dc8..11d62c5 100644
--- a/main/res/xml/preferences.xml
+++ b/main/res/xml/preferences.xml
@@ -407,8 +407,8 @@
<CheckBoxPreference
android:defaultValue="true"
android:key="@string/pref_friendlogswanted"
- android:summary="@string/init_summary_friendlogswanted"
- android:title="@string/init_friendlogswanted" />
+ android:summary="@string/init_summary_friends_and_own_logs_wanted"
+ android:title="@string/init_friends_and_own_logs_wanted" />
<CheckBoxPreference
android:defaultValue="false"
android:key="@string/pref_opendetailslastpage"
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index a66d181..6f15bcb 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -681,7 +681,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
DETAILS(R.string.detail),
DESCRIPTION(R.string.cache_description),
LOGS(R.string.cache_logs),
- LOGSFRIENDS(R.string.cache_logsfriends),
+ LOGSFRIENDS(R.string.cache_logs_friends_and_own),
WAYPOINTS(R.string.cache_waypoints),
INVENTORY(R.string.cache_inventory),
IMAGES(R.string.cache_images);
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index 0549b3f..57dcb4b 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -732,7 +732,7 @@ public abstract class GCParser {
cache.setDetailedUpdatedNow();
searchResult.addAndPutInCache(Collections.singletonList(cache));
- DataStore.saveLogsWithoutTransaction(cache.getGeocode(), getLogsFromDetails(page, false));
+ DataStore.saveLogsWithoutTransaction(cache.getGeocode(), getLogsFromDetails(page));
return searchResult;
}
@@ -1622,55 +1622,73 @@ public abstract class GCParser {
*
* @param page
* the text of the details page
- * @param friends
- * return friends logs only (will require a network request)
* @return a list of log entries or <code>null</code> if the logs could not be retrieved
*
*/
@Nullable
- private static List<LogEntry> getLogsFromDetails(final String page, final boolean friends) {
- String rawResponse;
+ private static List<LogEntry> getLogsFromDetails(final String page) {
+ // extract embedded JSON data from page
+ String rawResponse = TextUtils.getMatch(page, GCConstants.PATTERN_LOGBOOK, "");
+ return parseLogs(false, rawResponse);
+ }
- if (friends) {
- final MatcherWrapper userTokenMatcher = new MatcherWrapper(GCConstants.PATTERN_USERTOKEN, page);
- if (!userTokenMatcher.find()) {
- Log.e("GCParser.loadLogsFromDetails: unable to extract userToken");
- return null;
- }
+ private enum SpecialLogs {
+ FRIENDS("sf"),
+ OWN("sp");
- final String userToken = userTokenMatcher.group(1);
- final Parameters params = new Parameters(
- "tkn", userToken,
- "idx", "1",
- "num", String.valueOf(GCConstants.NUMBER_OF_LOGS),
- "decrypt", "true",
- // "sp", Boolean.toString(personal), // personal logs
- "sf", Boolean.toString(friends));
+ String paramName;
- final HttpResponse response = Network.getRequest("http://www.geocaching.com/seek/geocache.logbook", params);
- if (response == null) {
- Log.e("GCParser.loadLogsFromDetails: cannot log logs, response is null");
- return null;
- }
- final int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != 200) {
- Log.e("GCParser.loadLogsFromDetails: error " + statusCode + " when requesting log information");
- return null;
- }
- rawResponse = Network.getResponseData(response);
- if (rawResponse == null) {
- Log.e("GCParser.loadLogsFromDetails: unable to read whole response");
- return null;
- }
- } else {
- // extract embedded JSON data from page
- rawResponse = TextUtils.getMatch(page, GCConstants.PATTERN_LOGBOOK, "");
+ private SpecialLogs(String paramName) {
+ this.paramName = paramName;
+ }
+
+ private String getParamName() {
+ return this.paramName;
+ }
+ }
+
+ /**
+ * Extract special logs (friends, own) through seperate request.
+ *
+ * @param page
+ * The page to extrat userToken from
+ * @param logType
+ * The logType to request
+ * @return List<LogEntry> The list
+ */
+ private static List<LogEntry> getSpecialLogs(final String page, final SpecialLogs logType) {
+ final MatcherWrapper userTokenMatcher = new MatcherWrapper(GCConstants.PATTERN_USERTOKEN, page);
+ if (!userTokenMatcher.find()) {
+ Log.e("GCParser.loadLogsFromDetails: unable to extract userToken");
+ return null;
}
- return parseLogs(friends, rawResponse);
+ final String userToken = userTokenMatcher.group(1);
+ final Parameters params = new Parameters(
+ "tkn", userToken,
+ "idx", "1",
+ "num", String.valueOf(GCConstants.NUMBER_OF_LOGS),
+ logType.getParamName(), Boolean.toString(Boolean.TRUE),
+ "decrypt", "true");
+ final HttpResponse response = Network.getRequest("http://www.geocaching.com/seek/geocache.logbook", params);
+ if (response == null) {
+ Log.e("GCParser.loadLogsFromDetails: cannot log logs, response is null");
+ return null;
+ }
+ final int statusCode = response.getStatusLine().getStatusCode();
+ if (statusCode != 200) {
+ Log.e("GCParser.loadLogsFromDetails: error " + statusCode + " when requesting log information");
+ return null;
+ }
+ String rawResponse = Network.getResponseData(response);
+ if (rawResponse == null) {
+ Log.e("GCParser.loadLogsFromDetails: unable to read whole response");
+ return null;
+ }
+ return parseLogs(true, rawResponse);
}
- private static List<LogEntry> parseLogs(final boolean friends, String rawResponse) {
+ private static List<LogEntry> parseLogs(final boolean markAsFriendsLog, String rawResponse) {
final List<LogEntry> logs = new ArrayList<LogEntry>();
// for non logged in users the log book is not shown
@@ -1713,7 +1731,7 @@ public abstract class GCParser {
LogType.getByIconName(logIconName),
logText);
logDone.found = entry.getInt("GeocacheFindCount");
- logDone.friend = friends;
+ logDone.friend = markAsFriendsLog;
final JSONArray images = entry.getJSONArray("Images");
for (int i = 0; i < images.length(); i++) {
@@ -1830,17 +1848,10 @@ public abstract class GCParser {
//cache.setLogs(loadLogsFromDetails(page, cache, false));
if (Settings.isFriendLogsWanted()) {
CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_logs);
- final List<LogEntry> friendLogs = getLogsFromDetails(page, true);
- if (friendLogs != null && !friendLogs.isEmpty()) {
- // create new list, as the existing log list is immutable
- ArrayList<LogEntry> mergedLogs = new ArrayList<LogEntry>(cache.getLogs());
- for (final LogEntry log : friendLogs) {
- if (mergedLogs.contains(log)) {
- mergedLogs.get(mergedLogs.indexOf(log)).friend = true;
- } else {
- mergedLogs.add(log);
- }
- }
+ final List<LogEntry> friendLogs = getSpecialLogs(page, SpecialLogs.FRIENDS);
+ final List<LogEntry> ownLogs = getSpecialLogs(page, SpecialLogs.OWN);
+ final List<LogEntry> mergedLogs = new ArrayList<LogEntry>(cache.getLogs());
+ if (mergeFriendsLogs(mergedLogs, friendLogs) | mergeFriendsLogs(mergedLogs, ownLogs)) {
DataStore.saveLogsWithoutTransaction(cache.getGeocode(), mergedLogs);
}
}
@@ -1859,6 +1870,30 @@ public abstract class GCParser {
}
}
+ /**
+ * Merge log entries and mark them as friends logs (personal and friends) to identify
+ * them on friends/personal logs tab.
+ *
+ * @param mergedLogs
+ * the list to merge logs with
+ * @param logsToMerge
+ * the list of logs to merge
+ * @return true / false merged done
+ */
+ private static boolean mergeFriendsLogs(final List<LogEntry> mergedLogs, List<LogEntry> logsToMerge) {
+ if (logsToMerge != null && !logsToMerge.isEmpty()) {
+ for (final LogEntry log : logsToMerge) {
+ if (mergedLogs.contains(log)) {
+ mergedLogs.get(mergedLogs.indexOf(log)).friend = true;
+ } else {
+ mergedLogs.add(log);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
public static boolean uploadModifiedCoordinates(Geocache cache, Geopoint wpt) {
return editModifiedCoordinates(cache, wpt);
}