aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.idea/codeStyleSettings.xml56
-rw-r--r--.idea/inspectionProfiles/c_geo_standards.xml22
-rw-r--r--cgeo-contacts/cgeo-contacts.iml1
-rw-r--r--cgeo-contacts/res/values-nl/strings.xml1
-rw-r--r--cgeo-contacts/res/values-pl/strings.xml1
-rw-r--r--cgeo-contacts/res/values-sv/strings.xml1
-rw-r--r--cgeo-contacts/src/cgeo/contacts/ContactsActivity.java6
-rw-r--r--main/libs/rxjava-android-0.18.3.jar (renamed from main/libs/rxjava-android-0.17.6.jar)bin36208 -> 35884 bytes
-rw-r--r--main/libs/rxjava-async-util-0.17.6.jarbin47317 -> 0 bytes
-rw-r--r--main/libs/rxjava-async-util-0.18.3.jarbin0 -> 47693 bytes
-rw-r--r--main/libs/rxjava-core-0.17.6.jarbin743153 -> 0 bytes
-rw-r--r--main/libs/rxjava-core-0.18.3.jarbin0 -> 567999 bytes
-rw-r--r--main/res/values-ca/strings.xml6
-rw-r--r--main/res/values-cs/strings.xml5
-rw-r--r--main/res/values-de/strings.xml11
-rw-r--r--main/res/values-es/strings.xml1
-rw-r--r--main/res/values-fr/strings.xml3
-rw-r--r--main/res/values-hu/strings.xml3
-rw-r--r--main/res/values-it/strings.xml3
-rw-r--r--main/res/values-ja/strings.xml3
-rw-r--r--main/res/values-lt/strings.xml11
-rw-r--r--main/res/values-nb/strings.xml3
-rw-r--r--main/res/values-nl/strings.xml10
-rw-r--r--main/res/values-pl/strings.xml16
-rw-r--r--main/res/values-pt/strings.xml3
-rw-r--r--main/res/values-ro/strings.xml3
-rw-r--r--main/res/values-sk/strings.xml3
-rw-r--r--main/res/values-sl/strings.xml3
-rw-r--r--main/res/values-sv/strings.xml10
-rw-r--r--main/res/values/changelog_master.xml9
-rw-r--r--main/res/values/strings.xml7
-rw-r--r--main/res/xml/preferences.xml4
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java13
-rw-r--r--main/src/cgeo/geocaching/CacheListActivity.java3
-rw-r--r--main/src/cgeo/geocaching/CachePopup.java6
-rw-r--r--main/src/cgeo/geocaching/CgeoApplication.java31
-rw-r--r--main/src/cgeo/geocaching/CreateShortcutActivity.java2
-rw-r--r--main/src/cgeo/geocaching/DataStore.java19
-rw-r--r--main/src/cgeo/geocaching/Geocache.java13
-rw-r--r--main/src/cgeo/geocaching/LogCacheActivity.java2
-rw-r--r--main/src/cgeo/geocaching/SearchActivity.java42
-rw-r--r--main/src/cgeo/geocaching/SearchResult.java13
-rw-r--r--main/src/cgeo/geocaching/SelectMapfileActivity.java3
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java3
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java361
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java6
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OkapiClient.java7
-rw-r--r--main/src/cgeo/geocaching/filter/PopularityRatioFilter.java17
-rw-r--r--main/src/cgeo/geocaching/filter/StateFilter.java14
-rw-r--r--main/src/cgeo/geocaching/list/StoredList.java16
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java9
-rw-r--r--main/src/cgeo/geocaching/maps/CachesOverlay.java2
-rw-r--r--main/src/cgeo/geocaching/network/HtmlImage.java26
-rw-r--r--main/src/cgeo/geocaching/network/StatusUpdater.java7
-rw-r--r--main/src/cgeo/geocaching/sensors/DirectionProvider.java2
-rw-r--r--main/src/cgeo/geocaching/sensors/GeoDataProvider.java14
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java6
-rw-r--r--main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java6
-rw-r--r--main/src/cgeo/geocaching/ui/AbstractCachingListViewPageViewCreator.java1
-rw-r--r--main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java1
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java39
-rw-r--r--main/src/cgeo/geocaching/ui/CompassView.java7
-rw-r--r--main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java22
-rw-r--r--main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java12
-rw-r--r--main/src/cgeo/geocaching/utils/RxUtils.java8
-rw-r--r--mapswithme-api/mapswithme-api.iml1
-rw-r--r--tests/src/cgeo/geocaching/CgeoApplicationTest.java3
-rw-r--r--tests/src/cgeo/geocaching/connector/gc/GCParserTest.java14
-rw-r--r--tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java2
-rw-r--r--tests/src/cgeo/geocaching/export/ExportTest.java4
-rw-r--r--tests/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReaderTest.java1
-rw-r--r--tests/src/cgeo/geocaching/filter/StateNotFoundFilterTest.java28
-rw-r--r--tests/src/cgeo/geocaching/test/mock/MockedCache.java1
73 files changed, 614 insertions, 378 deletions
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
index cab819f..7cd87fc 100644
--- a/.idea/codeStyleSettings.xml
+++ b/.idea/codeStyleSettings.xml
@@ -3,12 +3,66 @@
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
+ <option name="GENERATE_FINAL_LOCALS" value="true" />
+ <option name="GENERATE_FINAL_PARAMETERS" value="true" />
+ <option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
+ <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="50" />
+ <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="50" />
+ <option name="IMPORT_LAYOUT_TABLE">
+ <value>
+ <package name="" withSubpackages="true" static="true" />
+ <emptyLine />
+ <package name="butterknife" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="cgeo" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="ch" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="com" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="edu" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="menion" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="org" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="rx" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="android" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="java" withSubpackages="true" static="false" />
+ <emptyLine />
+ <package name="javax" withSubpackages="true" static="false" />
+ <emptyLine />
+ </value>
+ </option>
+ <option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
+ <option name="JD_PARAM_DESCRIPTION_ON_NEW_LINE" value="true" />
+ <option name="WRAP_COMMENTS" value="true" />
<XML>
+ <option name="XML_KEEP_LINE_BREAKS" value="false" />
+ <option name="XML_ALIGN_ATTRIBUTES" value="false" />
+ <option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
+ <codeStyleSettings language="Groovy">
+ <option name="PARENT_SETTINGS_INSTALLED" value="true" />
+ </codeStyleSettings>
+ <codeStyleSettings language="JAVA">
+ <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
+ <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
+ <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" />
+ </codeStyleSettings>
+ <codeStyleSettings language="XML">
+ <indentOptions>
+ <option name="CONTINUATION_INDENT_SIZE" value="4" />
+ </indentOptions>
+ </codeStyleSettings>
</value>
</option>
- <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (1)" />
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>
diff --git a/.idea/inspectionProfiles/c_geo_standards.xml b/.idea/inspectionProfiles/c_geo_standards.xml
index 68f0977..cf3d2fb 100644
--- a/.idea/inspectionProfiles/c_geo_standards.xml
+++ b/.idea/inspectionProfiles/c_geo_standards.xml
@@ -39,9 +39,9 @@
<inspection_tool class="ConfusingElse" enabled="true" level="WARNING" enabled_by_default="true">
<option name="reportWhenNoStatementFollow" value="false" />
</inspection_tool>
- <inspection_tool class="ConstantConditions" enabled="false" level="WARNING" enabled_by_default="false">
- <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="true" />
- <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
+ <inspection_tool class="ConstantConditions" enabled="true" level="WARNING" enabled_by_default="true">
+ <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="false" />
+ <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="true" />
</inspection_tool>
<inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="Deprecation" enabled="true" level="WARNING" enabled_by_default="true">
@@ -145,6 +145,10 @@
<inspection_tool class="ListenerMayUseAdapter" enabled="true" level="WARNING" enabled_by_default="true">
<option name="checkForEmptyMethods" value="true" />
</inspection_tool>
+ <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
+ <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
+ <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
+ </inspection_tool>
<inspection_tool class="LoopConditionNotUpdatedInsideLoop" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoreIterators" value="false" />
</inspection_tool>
@@ -180,6 +184,11 @@
<option name="REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS" value="true" />
<option name="REPORT_NULLS_PASSED_TO_NON_ANNOTATED_METHOD" value="true" />
</inspection_tool>
+ <inspection_tool class="ObjectEquality" enabled="true" level="WARNING" enabled_by_default="true">
+ <option name="m_ignoreEnums" value="true" />
+ <option name="m_ignoreClassObjects" value="false" />
+ <option name="m_ignorePrivateConstructors" value="false" />
+ </inspection_tool>
<inspection_tool class="ObsoleteCollection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoreRequiredObsoleteCollectionTypes" value="false" />
</inspection_tool>
@@ -197,6 +206,12 @@
<option name="myAdditionalRequiredHtmlAttributes" value="" />
</inspection_tool>
<inspection_tool class="ReturnFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="ReturnNull" enabled="false" level="WEAK WARNING" enabled_by_default="false">
+ <option name="m_reportObjectMethods" value="true" />
+ <option name="m_reportArrayMethods" value="true" />
+ <option name="m_reportCollectionMethods" value="true" />
+ <option name="m_ignorePrivateMethods" value="false" />
+ </inspection_tool>
<inspection_tool class="SameParameterValue" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="SameReturnValue" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="SimplifiableEqualsExpression" enabled="true" level="WARNING" enabled_by_default="true" />
@@ -209,6 +224,7 @@
</inspection_tool>
<inspection_tool class="StringBufferReplaceableByString" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="StringBufferToStringInConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
+ <inspection_tool class="StringConcatenationInFormatCall" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="StringConstructor" enabled="false" level="WARNING" enabled_by_default="false">
<option name="ignoreSubstringArguments" value="false" />
</inspection_tool>
diff --git a/cgeo-contacts/cgeo-contacts.iml b/cgeo-contacts/cgeo-contacts.iml
index 107cc3a..c045b7e 100644
--- a/cgeo-contacts/cgeo-contacts.iml
+++ b/cgeo-contacts/cgeo-contacts.iml
@@ -19,7 +19,6 @@
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
- <output url="file://$MODULE_DIR$/bin/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
diff --git a/cgeo-contacts/res/values-nl/strings.xml b/cgeo-contacts/res/values-nl/strings.xml
index d27d7c6..9967c34 100644
--- a/cgeo-contacts/res/values-nl/strings.xml
+++ b/cgeo-contacts/res/values-nl/strings.xml
@@ -3,4 +3,5 @@
<resources>
<string name="app_name">c:geo contacten (plug-in)</string>
<string name="contact_not_found">Contact met alias/bijnaam %s niet gevonden. Voeg hem (eerst) toe aan je telefoon-contacten.</string>
+ <string name="multiple_matches">Meerdere overeenkomsten</string>
</resources>
diff --git a/cgeo-contacts/res/values-pl/strings.xml b/cgeo-contacts/res/values-pl/strings.xml
index 6d919f0..b1fcc4a 100644
--- a/cgeo-contacts/res/values-pl/strings.xml
+++ b/cgeo-contacts/res/values-pl/strings.xml
@@ -3,4 +3,5 @@
<resources>
<string name="app_name">c:geo - kontakty (dodatek)</string>
<string name="contact_not_found">Kontakt z aliasem/nazwą %s nie został znaleziony. Dodaj go najpierw do swoich kontaktów.</string>
+ <string name="multiple_matches">Wiele pasujących</string>
</resources>
diff --git a/cgeo-contacts/res/values-sv/strings.xml b/cgeo-contacts/res/values-sv/strings.xml
index dbb1d7c..def0f1e 100644
--- a/cgeo-contacts/res/values-sv/strings.xml
+++ b/cgeo-contacts/res/values-sv/strings.xml
@@ -3,4 +3,5 @@
<resources>
<string name="app_name">c:geo - Kontakttillägg</string>
<string name="contact_not_found">Ingen kontakt med aliaset/smeknamnet %s hittades. Lägg till den i dina kontakter först.</string>
+ <string name="multiple_matches">Flera matchningar</string>
</resources>
diff --git a/cgeo-contacts/src/cgeo/contacts/ContactsActivity.java b/cgeo-contacts/src/cgeo/contacts/ContactsActivity.java
index c9f7656..098f5b9 100644
--- a/cgeo-contacts/src/cgeo/contacts/ContactsActivity.java
+++ b/cgeo-contacts/src/cgeo/contacts/ContactsActivity.java
@@ -67,7 +67,7 @@ public final class ContactsActivity extends Activity {
selectContact(contacts);
}
else {
- int contactId = contacts.get(0).first.intValue();
+ int contactId = contacts.get(0).first;
openContactAndFinish(contactId);
}
}
@@ -83,7 +83,7 @@ public final class ContactsActivity extends Activity {
.setItems(items, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
- int contactId = contacts.get(which).first.intValue();
+ int contactId = contacts.get(which).first;
dialog.dismiss();
openContactAndFinish(contactId);
}
@@ -111,7 +111,7 @@ public final class ContactsActivity extends Activity {
while (cursor != null && cursor.moveToNext()) {
int foundId = cursor.getInt(0);
String foundName = cursor.getString(1);
- result.add(new Pair<Integer, String>(Integer.valueOf(foundId), foundName));
+ result.add(new Pair<Integer, String>(foundId, foundName));
}
} catch (Exception e) {
Log.e(LOG_TAG, "ContactsActivity.getContactId", e);
diff --git a/main/libs/rxjava-android-0.17.6.jar b/main/libs/rxjava-android-0.18.3.jar
index b840d42..e8b12ec 100644
--- a/main/libs/rxjava-android-0.17.6.jar
+++ b/main/libs/rxjava-android-0.18.3.jar
Binary files differ
diff --git a/main/libs/rxjava-async-util-0.17.6.jar b/main/libs/rxjava-async-util-0.17.6.jar
deleted file mode 100644
index 2947fe3..0000000
--- a/main/libs/rxjava-async-util-0.17.6.jar
+++ /dev/null
Binary files differ
diff --git a/main/libs/rxjava-async-util-0.18.3.jar b/main/libs/rxjava-async-util-0.18.3.jar
new file mode 100644
index 0000000..c3cc522
--- /dev/null
+++ b/main/libs/rxjava-async-util-0.18.3.jar
Binary files differ
diff --git a/main/libs/rxjava-core-0.17.6.jar b/main/libs/rxjava-core-0.17.6.jar
deleted file mode 100644
index 33d8801..0000000
--- a/main/libs/rxjava-core-0.17.6.jar
+++ /dev/null
Binary files differ
diff --git a/main/libs/rxjava-core-0.18.3.jar b/main/libs/rxjava-core-0.18.3.jar
new file mode 100644
index 0000000..699e327
--- /dev/null
+++ b/main/libs/rxjava-core-0.18.3.jar
Binary files differ
diff --git a/main/res/values-ca/strings.xml b/main/res/values-ca/strings.xml
index 527282c..a012433 100644
--- a/main/res/values-ca/strings.xml
+++ b/main/res/values-ca/strings.xml
@@ -18,6 +18,7 @@
<string name="letterbox">Letterbox</string>
<string name="event">Trobada</string>
<string name="mega">Mega</string>
+ <string name="giga">Giga</string>
<string name="earth">Earthcatxé</string>
<string name="cito">Trobada CITO</string>
<string name="webcam">Webcam</string>
@@ -282,6 +283,7 @@
<string name="caches_move_all">Mou-ho tot</string>
<string name="caches_map_locus">Locus</string>
<string name="caches_map_locus_export">Exporta al Locus</string>
+ <string name="caches_map_mapswithme">MapsWithMe</string>
<string name="caches_recaptcha_title">reCAPTCHA</string>
<string name="caches_recaptcha_explanation">Introduïu el text de la imatge. Això permet la baixada de les coordenades del catxé, que es pot desactivar a la configuració.</string>
<string name="caches_recaptcha_hint">Text de la imatge</string>
@@ -402,8 +404,6 @@
<string name="init_signature_template_log">Text del registre</string>
<string name="init_ratingwanted">Valoració del GCvote</string>
<string name="init_summary_ratingwanted">Descarrega la valoració des de GCvote.com</string>
- <string name="init_friendlogswanted">Mostra els registres d\'amics</string>
- <string name="init_summary_friendlogswanted">Mostra els registres dels amics a una altra pàgina</string>
<string name="init_openlastdetailspage">Obre l\'última pàgina de detalls</string>
<string name="init_summary_openlastdetailspage">Obre els detalls amb l\'última pàgina utilitzada</string>
<string name="init_autoload">Descripció llarga</string>
@@ -589,7 +589,6 @@
<string name="cache_waypoints_add">Afegeix una fita</string>
<string name="cache_hint">Pista</string>
<string name="cache_logs">Llibre de registre</string>
- <string name="cache_logsfriends">Llibre de registre (Amics)</string>
<string name="cache_dialog_loading_details">S\'està carregant els detalls del catxé…</string>
<string name="cache_dialog_loading_details_status_loadpage">S\'està carregant la pàgina</string>
<string name="cache_dialog_loading_details_status_details">S\'està processant els detalls</string>
@@ -641,6 +640,7 @@
<string name="cache_menu_cachebeacon">Catxé de balisa</string>
<string name="cache_menu_navigon">Navigon</string>
<string name="cache_menu_pebble">Pebble</string>
+ <string name="cache_menu_mapswithme">MapsWithMe</string>
<string name="cache_status">Estat</string>
<string name="cache_status_offline_log">Registre desat</string>
<string name="cache_status_found">Trobat</string>
diff --git a/main/res/values-cs/strings.xml b/main/res/values-cs/strings.xml
index 3202869..911f70e 100644
--- a/main/res/values-cs/strings.xml
+++ b/main/res/values-cs/strings.xml
@@ -12,7 +12,7 @@
<string name="settings_titlebar">c:geo Nastavení</string>
<string name="all_types">Všechny typy keší</string>
<string name="traditional">Tradiční keš</string>
- <string name="multi">Multi-keš</string>
+ <string name="multi">Multi keš</string>
<string name="mystery">Mystery keš</string>
<string name="letterbox">Dopisní schránka</string>
<string name="event">Keš události</string>
@@ -402,8 +402,6 @@
<string name="init_signature_template_log">Text logu</string>
<string name="init_ratingwanted">Načítat hodnocení keše z GCvote.com</string>
<string name="init_summary_ratingwanted">Načítat hodnocení keše z GCvote.com</string>
- <string name="init_friendlogswanted">Načítat doplňkový Logbook s logy od kámošů</string>
- <string name="init_summary_friendlogswanted">Načítat doplňkový Logbook s logy od kámošů</string>
<string name="init_openlastdetailspage">Otevřít detaily na naposledy použité stránce</string>
<string name="init_summary_openlastdetailspage">Otevřít detaily na naposledy použité stránce</string>
<string name="init_autoload">Automaticky načítat dlouhý popis</string>
@@ -589,7 +587,6 @@
<string name="cache_waypoints_add">Přidat Bod trasy</string>
<string name="cache_hint">Nápověda</string>
<string name="cache_logs">Logbook</string>
- <string name="cache_logsfriends">Logbook (Přátelé)</string>
<string name="cache_dialog_loading_details">Načítání detailů keše…</string>
<string name="cache_dialog_loading_details_status_loadpage">Načítání stránky</string>
<string name="cache_dialog_loading_details_status_details">Zpracovávání podrobností</string>
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index 9180f5e..78ff1a6 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -404,8 +404,8 @@
<string name="init_signature_template_log">Log text</string>
<string name="init_ratingwanted">GCvote-Bewertung</string>
<string name="init_summary_ratingwanted">Lade Cache-Bewertung von GCvote.com</string>
- <string name="init_friendlogswanted">Logs von Freunden zeigen</string>
- <string name="init_summary_friendlogswanted">Lade zusätzliche Logbuch-Seite für Logs von Freunden</string>
+ <string name="init_friends_and_own_logs_wanted">Eigene und Logs von Freunden zeigen</string>
+ <string name="init_summary_friends_and_own_logs_wanted">Lade zusätzliche Logbuch-Seiten für eigene und Logs von Freunden</string>
<string name="init_openlastdetailspage">Zuletzt genutzte Seite</string>
<string name="init_summary_openlastdetailspage">Öffne Details mit zuletzt genutzter Seite</string>
<string name="init_autoload">Ausführliche Beschreibung</string>
@@ -588,7 +588,7 @@
<string name="cache_waypoints_add">Wegpunkt hinzufügen</string>
<string name="cache_hint">Hinweis</string>
<string name="cache_logs">Logbuch</string>
- <string name="cache_logsfriends">Logbuch (Freunde)</string>
+ <string name="cache_logs_friends_and_own">Logbuch (Freunde/Eigene)</string>
<string name="cache_dialog_loading_details">Lade Cache-Details…</string>
<string name="cache_dialog_loading_details_status_loadpage">Lade Seite</string>
<string name="cache_dialog_loading_details_status_details">Verarbeite Details</string>
@@ -644,6 +644,7 @@
<string name="cache_status">Status</string>
<string name="cache_status_offline_log">Gespeicherter Log</string>
<string name="cache_status_found">Gefunden</string>
+ <string name="cache_not_status_found">Nicht gefunden</string>
<string name="cache_status_archived">Archiviert</string>
<string name="cache_status_disabled">Deaktiviert</string>
<string name="cache_status_premium">Nur für Premium-Mitglieder</string>
@@ -970,8 +971,8 @@
<string name="attribute_skiis_no">Langlauf-Ski nicht erforderlich</string>
<string name="attribute_s_tool_yes">Besondere Werkzeuge erforderlich</string>
<string name="attribute_s_tool_no">Keine besonderen Werkzeuge erforderlich</string>
- <string name="attribute_wirelessbeacon_yes">Cache mit Funk-Sender (Chirp)</string>
- <string name="attribute_wirelessbeacon_no">Kein Cache mit Funk-Sender (Chirp)</string>
+ <string name="attribute_wirelessbeacon_yes">Funk-Sender</string>
+ <string name="attribute_wirelessbeacon_no">Ohne Funk-Sender</string>
<string name="attribute_treeclimbing_yes">Auf Bäume klettern erforderlich</string>
<string name="attribute_treeclimbing_no">Auf Bäume klettern nicht erforderlich</string>
<string name="attribute_poisonoak_yes">Giftige Pflanzen</string>
diff --git a/main/res/values-es/strings.xml b/main/res/values-es/strings.xml
index e7da7a1..0946118 100644
--- a/main/res/values-es/strings.xml
+++ b/main/res/values-es/strings.xml
@@ -381,7 +381,6 @@
<string name="init_signature_template_name">Nombre</string>
<string name="init_signature_template_url">URL</string>
<string name="init_ratingwanted">Clasificación de GCvote</string>
- <string name="init_friendlogswanted">Mostrar registros de amigos</string>
<string name="init_openlastdetailspage">Detalles de la última página</string>
<string name="init_autoload">Autocargar descripción larga</string>
<string name="init_summary_autoload">Autocargar descripción larga</string>
diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml
index e8487bf..8e19cea 100644
--- a/main/res/values-fr/strings.xml
+++ b/main/res/values-fr/strings.xml
@@ -402,8 +402,6 @@
<string name="init_signature_template_log">Texte du journal</string>
<string name="init_ratingwanted">Charger la note depuis GCvote.com</string>
<string name="init_summary_ratingwanted">Charger la note depuis GCvote.com</string>
- <string name="init_friendlogswanted">Charger le carnet (amis)</string>
- <string name="init_summary_friendlogswanted">Charger le carnet (amis)</string>
<string name="init_openlastdetailspage">Réouvrir les détails à la dernière page ouverte</string>
<string name="init_summary_openlastdetailspage">Réouvrir les détails à la dernière page ouverte</string>
<string name="init_autoload">Afficher automatiquement les descriptions longues</string>
@@ -586,7 +584,6 @@
<string name="cache_waypoints_add">Ajouter une étape</string>
<string name="cache_hint">Indice</string>
<string name="cache_logs">Carnet de bord</string>
- <string name="cache_logsfriends">Carnet (amis)</string>
<string name="cache_dialog_loading_details">Chargement des détails…</string>
<string name="cache_dialog_loading_details_status_loadpage">Chargement de la page</string>
<string name="cache_dialog_loading_details_status_details">Analyse</string>
diff --git a/main/res/values-hu/strings.xml b/main/res/values-hu/strings.xml
index 7e66ed5..68644c8 100644
--- a/main/res/values-hu/strings.xml
+++ b/main/res/values-hu/strings.xml
@@ -302,8 +302,6 @@
<string name="init_signature_template_owner">Tulajdonos</string>
<string name="init_ratingwanted">Értékelés betöltése a GCvote.com-ról</string>
<string name="init_summary_ratingwanted">Értékelés betöltése a GCvote.com-ról</string>
- <string name="init_friendlogswanted">További logbook oldal betöltése a barátok logjainak.</string>
- <string name="init_summary_friendlogswanted">További logbook oldal betöltése a barátok logjainak.</string>
<string name="init_openlastdetailspage">Az utoljára használt oldal részleteinek betöltése</string>
<string name="init_summary_openlastdetailspage">Az utoljára használt oldal részleteinek betöltése</string>
<string name="init_autoload">Hosszú leírás automatikus betöltése</string>
@@ -431,7 +429,6 @@
<string name="cache_waypoints_add">Útpont hozzáadása</string>
<string name="cache_hint">Segítség</string>
<string name="cache_logs">Láda napló</string>
- <string name="cache_logsfriends">Logbook (Barátok)</string>
<string name="cache_dialog_loading_details">Láda adatainak betöltése…</string>
<string name="cache_dialog_loading_details_status_loadpage">Oldal betöltése</string>
<string name="cache_dialog_loading_details_status_details">Részletek feldolgozása</string>
diff --git a/main/res/values-it/strings.xml b/main/res/values-it/strings.xml
index 43e6c88..56d7c10 100644
--- a/main/res/values-it/strings.xml
+++ b/main/res/values-it/strings.xml
@@ -399,8 +399,6 @@
<string name="init_signature_template_log">Testo di Log</string>
<string name="init_ratingwanted">Rating da GCvote.com</string>
<string name="init_summary_ratingwanted">Carica il rating del cache da GCvote.com</string>
- <string name="init_friendlogswanted">Visualizza log dei miei amici</string>
- <string name="init_summary_friendlogswanted">Carica logbook addizionale con i log dei miei amici</string>
<string name="init_openlastdetailspage">Carica ultima pagina usata nei dettagli</string>
<string name="init_summary_openlastdetailspage">Ricorda l\'ultima pagina usata nei dettagli</string>
<string name="init_autoload">Descrizione estesa</string>
@@ -583,7 +581,6 @@
<string name="cache_waypoints_add">Aggiungi waypoint</string>
<string name="cache_hint">Aiuto (spoiler)</string>
<string name="cache_logs">Logbook</string>
- <string name="cache_logsfriends">Log amici</string>
<string name="cache_dialog_loading_details">Caricamento dettagli del cache…</string>
<string name="cache_dialog_loading_details_status_loadpage">Caricamento pagina</string>
<string name="cache_dialog_loading_details_status_details">Elaborazione dettagli</string>
diff --git a/main/res/values-ja/strings.xml b/main/res/values-ja/strings.xml
index 9164a8c..2212fa4 100644
--- a/main/res/values-ja/strings.xml
+++ b/main/res/values-ja/strings.xml
@@ -381,8 +381,6 @@
<string name="init_signature_template_url">URL</string>
<string name="init_ratingwanted">GCvote評価</string>
<string name="init_summary_ratingwanted">キャッシュの評価をGCvote.comから取得</string>
- <string name="init_friendlogswanted">友達のログページ</string>
- <string name="init_summary_friendlogswanted">友達の書いたログを別ページに表示</string>
<string name="init_openlastdetailspage">最後に表示したページ</string>
<string name="init_summary_openlastdetailspage">キャッシュ情報の表示では最後に表示したページを開く</string>
<string name="init_autoload">詳細表示</string>
@@ -538,7 +536,6 @@
<string name="cache_waypoints_add">ウェイポイントを追加</string>
<string name="cache_hint">ヒント</string>
<string name="cache_logs">ログブック</string>
- <string name="cache_logsfriends">ログブック(友達)</string>
<string name="cache_dialog_loading_details">キャッシュの詳細をロード中…</string>
<string name="cache_dialog_loading_details_status_loadpage">ページをロード中</string>
<string name="cache_dialog_loading_details_status_details">詳細を処理中</string>
diff --git a/main/res/values-lt/strings.xml b/main/res/values-lt/strings.xml
index 2494f90..c2b599f 100644
--- a/main/res/values-lt/strings.xml
+++ b/main/res/values-lt/strings.xml
@@ -240,7 +240,7 @@
<string name="caches_more_caches_no">Daugiau slėptuvių nėra</string>
<string name="caches_more_caches_loading">Įkeliamos slėptuvės…</string>
<string name="caches_more_caches_currently">dabar</string>
- <string name="caches_downloading">Atsisiunčiamos slėptuvės…\nUžtruks</string>
+ <string name="caches_downloading">Atnaujinamos slėptuvės…\nUžtruks</string>
<string name="caches_eta_ltm">mažiau nei minutę</string>
<string name="caches_store_offline">Išsaugoti slėptuves</string>
<string name="caches_store_selected">Išsaugoti pasirinktas</string>
@@ -400,8 +400,8 @@
<string name="init_signature_template_log">Įrašo tekstas</string>
<string name="init_ratingwanted">GCvote reitingas</string>
<string name="init_summary_ratingwanted">Įkelti slėptuvės reitingą iš GCvote.com</string>
- <string name="init_friendlogswanted">Rodyti draugų įrašus</string>
- <string name="init_summary_friendlogswanted">Rodyti papildomą draugų įrašų puslapį</string>
+ <string name="init_friends_and_own_logs_wanted">Rodyti draugų/savo</string>
+ <string name="init_summary_friends_and_own_logs_wanted">Rodyti papildomą draugų ir savų įrašų puslapį</string>
<string name="init_openlastdetailspage">Paskutinis naudotas puslapis</string>
<string name="init_summary_openlastdetailspage">Atidaryti kitą slėptuvę nuo paskutinio naudoto puslapio</string>
<string name="init_autoload">Ilgas aprašymas</string>
@@ -583,7 +583,7 @@
<string name="cache_waypoints_add">Pridėti papildomą tašką</string>
<string name="cache_hint">Užuomina</string>
<string name="cache_logs">Įrašai</string>
- <string name="cache_logsfriends">Draugų įrašai</string>
+ <string name="cache_logs_friends_and_own">Draugų/savi įrašai</string>
<string name="cache_dialog_loading_details">Įkeliama slėptuvės informacija…</string>
<string name="cache_dialog_loading_details_status_loadpage">Įkeliamas puslapis</string>
<string name="cache_dialog_loading_details_status_details">Apdorojama informacija</string>
@@ -598,7 +598,7 @@
<string name="cache_dialog_offline_drop_title">Pašalinti</string>
<string name="cache_dialog_offline_drop_message">Slėptuvė pašalinama iš prietaiso atminties…</string>
<string name="cache_dialog_refresh_title">Atnaujinti</string>
- <string name="cache_dialog_refresh_message">Slėptuvės informacija atsiunčiama iš naujo…</string>
+ <string name="cache_dialog_refresh_message">Atnaujinama slėptuvės informacija…</string>
<string name="cache_dialog_watchlist_add_title">Įtraukti į stebimų slėptuvių sąrašą</string>
<string name="cache_dialog_watchlist_add_message">Slėptuvė įtraukiama į stebimų slėptuvių sąrašą…</string>
<string name="cache_dialog_watchlist_remove_title">Pašalinti iš stebimų slėptuvių sąrašo</string>
@@ -638,6 +638,7 @@
<string name="cache_status">Būsena</string>
<string name="cache_status_offline_log">Įrašas išsaugotas</string>
<string name="cache_status_found">Rasta</string>
+ <string name="cache_not_status_found">Nerasta</string>
<string name="cache_status_archived">Suarchyvuota</string>
<string name="cache_status_disabled">Išjungta</string>
<string name="cache_status_premium">Tik Premium nariams</string>
diff --git a/main/res/values-nb/strings.xml b/main/res/values-nb/strings.xml
index 6fe79e1..124c81b 100644
--- a/main/res/values-nb/strings.xml
+++ b/main/res/values-nb/strings.xml
@@ -395,8 +395,6 @@
<string name="init_signature_template_log">Loggtekst</string>
<string name="init_ratingwanted">GCvote-rangering</string>
<string name="init_summary_ratingwanted">Last rangering for cachen fra GCvote.com</string>
- <string name="init_friendlogswanted">Vis venners logger</string>
- <string name="init_summary_friendlogswanted">Vis flere logger fra venner</string>
<string name="init_openlastdetailspage">Sist brukte fane</string>
<string name="init_summary_openlastdetailspage">Åpne detaljsiden til cacher på den siste brukte fanen</string>
<string name="init_autoload">Last full beskrivelse automatisk</string>
@@ -578,7 +576,6 @@
<string name="cache_waypoints_add">Legg til veipunkter</string>
<string name="cache_hint">Hint</string>
<string name="cache_logs">Loggbok</string>
- <string name="cache_logsfriends">Loggbok (venner)</string>
<string name="cache_dialog_loading_details">Laster cachens detaljer…</string>
<string name="cache_dialog_loading_details_status_loadpage">Laster siden</string>
<string name="cache_dialog_loading_details_status_details">Behandler detaljer</string>
diff --git a/main/res/values-nl/strings.xml b/main/res/values-nl/strings.xml
index 3568423..b031d8d 100644
--- a/main/res/values-nl/strings.xml
+++ b/main/res/values-nl/strings.xml
@@ -18,6 +18,7 @@
<string name="letterbox">Letterbox hybrid</string>
<string name="event">Event cache</string>
<string name="mega">Mega-event cache</string>
+ <string name="giga">Giga-Event Cache</string>
<string name="earth">Earthcache</string>
<string name="cito">Cache in trash out event</string>
<string name="webcam">Webcam cache</string>
@@ -282,6 +283,7 @@
<string name="caches_move_all">Verplaats alle</string>
<string name="caches_map_locus">Locus</string>
<string name="caches_map_locus_export">Exporteer naar Locus</string>
+ <string name="caches_map_mapswithme">MapsWithMe</string>
<string name="caches_recaptcha_title">reCAPTCHA</string>
<string name="caches_recaptcha_explanation">Vul de tekst uit de afbeelding in. Dit is nodig voor het downloaden van de coördinaten van de caches. Dit is optioneel en kan in de instellingen uitgeschakeld worden.</string>
<string name="caches_recaptcha_hint">Tekst uit de afbeelding</string>
@@ -402,8 +404,8 @@
<string name="init_signature_template_log">Log tekst</string>
<string name="init_ratingwanted">GCvote.com waardering</string>
<string name="init_summary_ratingwanted">Laad cachewaardering van GCvote.com</string>
- <string name="init_friendlogswanted">Lange omschrijving</string>
- <string name="init_summary_friendlogswanted">Laad extra logbook pagina voor logs van vrienden</string>
+ <string name="init_friends_and_own_logs_wanted">Toon eigen/van vrienden</string>
+ <string name="init_summary_friends_and_own_logs_wanted">Toon additionele logboek pagina voor eigen en vrienden logs</string>
<string name="init_openlastdetailspage">Laad details met laatst gebruikte pagina</string>
<string name="init_summary_openlastdetailspage">Laad details met laatst gebruikte pagina</string>
<string name="init_autoload">Lange omschrijving</string>
@@ -589,7 +591,7 @@
<string name="cache_waypoints_add">Waypoint toevoegen</string>
<string name="cache_hint">Hint</string>
<string name="cache_logs">Logboek</string>
- <string name="cache_logsfriends">Logboek (vrienden)</string>
+ <string name="cache_logs_friends_and_own">Vrienden/Eigen Logs</string>
<string name="cache_dialog_loading_details">Cache details laden…</string>
<string name="cache_dialog_loading_details_status_loadpage">Pagina laden</string>
<string name="cache_dialog_loading_details_status_details">Verwerken details</string>
@@ -641,9 +643,11 @@
<string name="cache_menu_cachebeacon">Cache baken</string>
<string name="cache_menu_navigon">Navigon</string>
<string name="cache_menu_pebble">Pebble</string>
+ <string name="cache_menu_mapswithme">MapsWithMe</string>
<string name="cache_status">Status</string>
<string name="cache_status_offline_log">Log opgeslagen</string>
<string name="cache_status_found">Gevonden</string>
+ <string name="cache_not_status_found">Niet gevonden</string>
<string name="cache_status_archived">Gearchiveerd</string>
<string name="cache_status_disabled">Uitgeschakeld</string>
<string name="cache_status_premium">Alleen voor premium leden</string>
diff --git a/main/res/values-pl/strings.xml b/main/res/values-pl/strings.xml
index 26b5e23..ae3493c 100644
--- a/main/res/values-pl/strings.xml
+++ b/main/res/values-pl/strings.xml
@@ -18,6 +18,7 @@
<string name="letterbox">Hybrydowa Letterbox</string>
<string name="event">Wydarzenie</string>
<string name="mega">Mega-Wydarzenie</string>
+ <string name="giga">Giga-Wydarzenie</string>
<string name="earth">Earthcache</string>
<string name="cito">CITO</string>
<string name="webcam">Skrzynka Webcam</string>
@@ -213,7 +214,7 @@
<string name="info_select_logimage_cancelled">Wybór obrazu został anulowany.</string>
<string name="info_stored_image">Nowy obraz zapisany w:</string>
<string name="info_storing_static_maps">Próbuję zapisać mapy statyczne</string>
- <string name="loc_last">Ostatnia znana pozycja</string>
+ <string name="loc_last">Ostatnia pozycja</string>
<string name="loc_net">Sieć</string>
<string name="loc_gps">GPS</string>
<string name="loc_sat">Sat</string>
@@ -299,8 +300,8 @@
<string name="caches_filter_popularity">Ulubione</string>
<string name="caches_filter_popularity_ratio">Ulubione [%]</string>
<string name="caches_removing_from_history">Usuwam z Historii…</string>
- <string name="caches_clear_offlinelogs">Usuń logi offline</string>
- <string name="caches_clear_offlinelogs_progress">Usuwanie logów offline</string>
+ <string name="caches_clear_offlinelogs">Usuń wpisy offline</string>
+ <string name="caches_clear_offlinelogs_progress">Usuwanie wpisów offline</string>
<string name="list_menu">Lista</string>
<string name="list_menu_create">Utwórz nową listę</string>
<string name="list_menu_drop">Usuń aktualną listę</string>
@@ -399,8 +400,8 @@
<string name="init_signature_template_log">Wpis</string>
<string name="init_ratingwanted">Załaduj ocenę skrzynki z GCvote.com</string>
<string name="init_summary_ratingwanted">Załaduj ocenę skrzynki z GCvote.com</string>
- <string name="init_friendlogswanted">Załaduj dodatkowy dziennik dla wpisów od przyjaciół</string>
- <string name="init_summary_friendlogswanted">Załaduj dodatkowy dziennik dla wpisów od przyjaciół</string>
+ <string name="init_friends_and_own_logs_wanted">Pokaż przyjaciół/własne</string>
+ <string name="init_summary_friends_and_own_logs_wanted">Wyświetl dodatkowy dziennik dla wpisów własnych i przyjaciół</string>
<string name="init_openlastdetailspage">Otwórz szczegóły ostatnio używanej strony</string>
<string name="init_summary_openlastdetailspage">Otwórz szczegóły ostatnio używanej strony</string>
<string name="init_autoload">Automatyczne ładowanie długich opisów</string>
@@ -501,7 +502,7 @@
<string name="feature_description">Podane funkcje <b>online</b> na tej stronie są wspierane przez c:geo (w porównaniu do funkcji offline):</string>
<string name="feature_personal_notes">Notatka osobista</string>
<string name="feature_online_logging">Wpisy online</string>
- <string name="feature_log_images">Załączanie zdjęć do logów</string>
+ <string name="feature_log_images">Załączanie zdjęć do wpisów</string>
<string name="feature_watch_list">Listy obserwowanych skrzynek</string>
<string name="feature_own_coordinates">Przechowywanie zmodyfikowanych współrzędnych</string>
<string name="feature_search_keyword">Szukanie po słowie kluczowym</string>
@@ -583,7 +584,7 @@
<string name="cache_waypoints_add">Dodaj punkt nawigacji</string>
<string name="cache_hint">Wskazówka</string>
<string name="cache_logs">Dziennik</string>
- <string name="cache_logsfriends">Dziennik (Przyjaciele)</string>
+ <string name="cache_logs_friends_and_own">Wpisy przyjaciół/własne</string>
<string name="cache_dialog_loading_details">Ładuję szczegóły skrzynki…</string>
<string name="cache_dialog_loading_details_status_loadpage">Ładuję stronę</string>
<string name="cache_dialog_loading_details_status_details">Przetwarzam szczegóły</string>
@@ -638,6 +639,7 @@
<string name="cache_status">Status</string>
<string name="cache_status_offline_log">Zapamiętany wpis</string>
<string name="cache_status_found">Znaleziona</string>
+ <string name="cache_not_status_found">Nie znaleziono</string>
<string name="cache_status_archived">Zarchiwizowana</string>
<string name="cache_status_disabled">Niedostępna</string>
<string name="cache_status_premium">Tylko dla użytkowników Premium</string>
diff --git a/main/res/values-pt/strings.xml b/main/res/values-pt/strings.xml
index 8d781b5..ec71239 100644
--- a/main/res/values-pt/strings.xml
+++ b/main/res/values-pt/strings.xml
@@ -402,8 +402,6 @@
<string name="init_signature_template_log">Texto de registo</string>
<string name="init_ratingwanted">Carregar a pontuação da cache de GCvote.com</string>
<string name="init_summary_ratingwanted">Carregar a pontuação da cache de GCvote.com</string>
- <string name="init_friendlogswanted">Carregar página adicional de registos de amigos</string>
- <string name="init_summary_friendlogswanted">Carregar página adicional de registos de amigos</string>
<string name="init_openlastdetailspage">Abrir detalhes da última página vizualizada</string>
<string name="init_summary_openlastdetailspage">Abrir detalhes da última página vizualizada</string>
<string name="init_autoload">Carregar automaticamente a descrição longa</string>
@@ -586,7 +584,6 @@
<string name="cache_waypoints_add">Adicionar ponto de referência</string>
<string name="cache_hint">Pista</string>
<string name="cache_logs">Logbook</string>
- <string name="cache_logsfriends">Logbook (Amigos)</string>
<string name="cache_dialog_loading_details">A carregar os detalhes da cache…</string>
<string name="cache_dialog_loading_details_status_loadpage">A carregar a página</string>
<string name="cache_dialog_loading_details_status_details">A processar os detalhes</string>
diff --git a/main/res/values-ro/strings.xml b/main/res/values-ro/strings.xml
index ecb96ec..71659a6 100644
--- a/main/res/values-ro/strings.xml
+++ b/main/res/values-ro/strings.xml
@@ -404,8 +404,6 @@
<string name="init_signature_template_log">Text însemnare</string>
<string name="init_ratingwanted">Voturi GCvote</string>
<string name="init_summary_ratingwanted">Încarcă voturi de la GCvote.com</string>
- <string name="init_friendlogswanted">Arată însemnările prietenilor</string>
- <string name="init_summary_friendlogswanted">Afişează o pagină suplimentară cu însemnări de la prieteni</string>
<string name="init_openlastdetailspage">Ultima pagină cu detalii</string>
<string name="init_summary_openlastdetailspage">Arată detaliile de pe ultima pagină afişată</string>
<string name="init_autoload">Descriere completă</string>
@@ -590,7 +588,6 @@
<string name="cache_waypoints_add">Adaugă punct</string>
<string name="cache_hint">Indiciu</string>
<string name="cache_logs">Jurnal</string>
- <string name="cache_logsfriends">Jurnal (Prieteni)</string>
<string name="cache_dialog_loading_details">Încărcare detaliile cutiei…</string>
<string name="cache_dialog_loading_details_status_loadpage">Încărcare pagină</string>
<string name="cache_dialog_loading_details_status_details">Prelucrare detalii</string>
diff --git a/main/res/values-sk/strings.xml b/main/res/values-sk/strings.xml
index b321f83..771ee74 100644
--- a/main/res/values-sk/strings.xml
+++ b/main/res/values-sk/strings.xml
@@ -402,8 +402,6 @@
<string name="init_signature_template_log">Zápis do logu</string>
<string name="init_ratingwanted">Načítať hodnotenie skrýše z GCvote.com</string>
<string name="init_summary_ratingwanted">Načítať hodnotenie skrýše z GCvote.com</string>
- <string name="init_friendlogswanted">Načítať dodatočnú stránku s logmi od priateľov</string>
- <string name="init_summary_friendlogswanted">Načítať dodatočnú stránku s logmi od priateľov</string>
<string name="init_openlastdetailspage">Otvoriť detaily na naposledy použitej stránke</string>
<string name="init_summary_openlastdetailspage">Otvoriť detaily na naposledy použitej stránke</string>
<string name="init_autoload">Automatické načítanie dlhého popisu</string>
@@ -586,7 +584,6 @@
<string name="cache_waypoints_add">Pridať bod</string>
<string name="cache_hint">Nápoveda</string>
<string name="cache_logs">Logbook</string>
- <string name="cache_logsfriends">Logbook (priatelia)</string>
<string name="cache_dialog_loading_details">Načítanie detailov skrýše…</string>
<string name="cache_dialog_loading_details_status_loadpage">Načítanie stránky</string>
<string name="cache_dialog_loading_details_status_details">Spracovanie detailov</string>
diff --git a/main/res/values-sl/strings.xml b/main/res/values-sl/strings.xml
index 1237699..74a7d75 100644
--- a/main/res/values-sl/strings.xml
+++ b/main/res/values-sl/strings.xml
@@ -399,8 +399,6 @@
<string name="init_signature_template_log">Vsebina zapisa</string>
<string name="init_ratingwanted">GCvote ocene</string>
<string name="init_summary_ratingwanted">Naloži ocene iz GCvote.com</string>
- <string name="init_friendlogswanted">Naloži zapise prijateljev</string>
- <string name="init_summary_friendlogswanted">Naloži tudi posebno stran zapisov mojih prijateljev</string>
<string name="init_openlastdetailspage">Odpri nazadnje odprto stran</string>
<string name="init_summary_openlastdetailspage">Pri podrobnostih zaklada vedno odpri zadnjo uporabljeno stran</string>
<string name="init_autoload">Prikaži celoten opis</string>
@@ -583,7 +581,6 @@
<string name="cache_waypoints_add">Dodaj točko</string>
<string name="cache_hint">Namig</string>
<string name="cache_logs">Dnevnik zapisov</string>
- <string name="cache_logsfriends">Zapisi prijateljev</string>
<string name="cache_dialog_loading_details">Nalaganje podatkov zaklada…</string>
<string name="cache_dialog_loading_details_status_loadpage">Nalaganje strani</string>
<string name="cache_dialog_loading_details_status_details">Obdelujem podatke</string>
diff --git a/main/res/values-sv/strings.xml b/main/res/values-sv/strings.xml
index 3c94ee2..0ebaa4e 100644
--- a/main/res/values-sv/strings.xml
+++ b/main/res/values-sv/strings.xml
@@ -18,6 +18,7 @@
<string name="letterbox">Letterbox hybrid</string>
<string name="event">Event cache</string>
<string name="mega">Mega-event cache</string>
+ <string name="giga">Giga-Event Cache</string>
<string name="earth">Earthcache</string>
<string name="cito">Cache in trash out event</string>
<string name="webcam">Webcam cache</string>
@@ -282,6 +283,7 @@
<string name="caches_move_all">Flytta alla</string>
<string name="caches_map_locus">Locus</string>
<string name="caches_map_locus_export">Exportera till Locus</string>
+ <string name="caches_map_mapswithme">MapsWithMe</string>
<string name="caches_recaptcha_title">reCAPTCHA</string>
<string name="caches_recaptcha_explanation">Skriv texten som syns i bilden. Det krävs för att hämta koordinaterna för cacherna i listan. Det går att fortsätta ändå (men med sämre funktionalitet).</string>
<string name="caches_recaptcha_hint">Text från bilden</string>
@@ -402,8 +404,8 @@
<string name="init_signature_template_log">Loggtext</string>
<string name="init_ratingwanted">GCvote.com</string>
<string name="init_summary_ratingwanted">Ladda cache betyg från GCvote.com</string>
- <string name="init_friendlogswanted">Vänners loggar</string>
- <string name="init_summary_friendlogswanted">Ladda extra sida med loggbok för dina vänner</string>
+ <string name="init_friends_and_own_logs_wanted">Visa vänners/egna</string>
+ <string name="init_summary_friends_and_own_logs_wanted">Visa en extra loggbok med dina vänners och egna loggar</string>
<string name="init_openlastdetailspage">Visning av cachedetaljer</string>
<string name="init_summary_openlastdetailspage">Visa senaste använda delsidan när detaljer öppnas</string>
<string name="init_autoload">Cachebeskrivning</string>
@@ -589,7 +591,7 @@
<string name="cache_waypoints_add">Lägg till punkt</string>
<string name="cache_hint">Tips</string>
<string name="cache_logs">Loggbok</string>
- <string name="cache_logsfriends">Loggbok (Vänner)</string>
+ <string name="cache_logs_friends_and_own">Vänners/egna loggar</string>
<string name="cache_dialog_loading_details">Laddar detaljer om cachen…</string>
<string name="cache_dialog_loading_details_status_loadpage">Hämtar från gc.com</string>
<string name="cache_dialog_loading_details_status_details">Analyserar cacheinformation</string>
@@ -641,9 +643,11 @@
<string name="cache_menu_cachebeacon">Cache Beacon</string>
<string name="cache_menu_navigon">Navigon</string>
<string name="cache_menu_pebble">Pebble</string>
+ <string name="cache_menu_mapswithme">MapsWithMe</string>
<string name="cache_status">Status</string>
<string name="cache_status_offline_log">Sparad logg</string>
<string name="cache_status_found">Hittad</string>
+ <string name="cache_not_status_found">Ej hittad</string>
<string name="cache_status_archived">Arkiverad</string>
<string name="cache_status_disabled">Inaktiverad</string>
<string name="cache_status_premium">Enbart för Premium medlemmar</string>
diff --git a/main/res/values/changelog_master.xml b/main/res/values/changelog_master.xml
index 1e3c3d4..501cf21 100644
--- a/main/res/values/changelog_master.xml
+++ b/main/res/values/changelog_master.xml
@@ -2,5 +2,14 @@
<resources>
<!-- changelog for the master branch -->
<string name="changelog_master" translatable="false">
+ <b>Next feature release:</b>\n
+ · New: Show also own logs on friend log page\n
+ · New: Filter for caches which are not found\n
+ · Fix: Hiding own caches on opencaching\n
+ · Fix: Webcam caches not marked as found after posting log\n
+ · Fix: Archived caches now also hidden if hiding disabled caches is active\n
+ · Fix: Filter invalid characters in GPX files\n
+ \n
+ \n
</string>
</resources>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 2aa3d00..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>
@@ -715,6 +715,7 @@
<string name="cache_status">Status</string>
<string name="cache_status_offline_log">Saved Log</string>
<string name="cache_status_found">Found</string>
+ <string name="cache_not_status_found">Not Found</string>
<string name="cache_status_archived">Archived</string>
<string name="cache_status_disabled">Disabled</string>
<string name="cache_status_premium">Premium Members only</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..11fe672 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -56,13 +56,12 @@ import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
-
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Observer;
-import rx.Scheduler.Inner;
import rx.Subscriber;
import rx.android.observables.AndroidObservable;
+import rx.functions.Action0;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
@@ -300,9 +299,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
final String realGeocode = geocode;
final String realGuid = guid;
- Schedulers.io().schedule(new Action1<Inner>() {
+ Schedulers.io().createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
search = Geocache.searchByGeocode(realGeocode, StringUtils.isBlank(realGeocode) ? realGuid : null, 0, false, loadCacheHandler);
loadCacheHandler.sendMessage(Message.obtain());
}
@@ -681,7 +680,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);
@@ -2227,9 +2226,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
protected void storeCache(final int listId, final StoreCacheHandler storeCacheHandler) {
progress.show(this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage());
- Schedulers.io().schedule(new Action1<Inner>() {
+ Schedulers.io().createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
cache.store(listId, storeCacheHandler);
}
});
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java
index 0aec119..5a385a2 100644
--- a/main/src/cgeo/geocaching/CacheListActivity.java
+++ b/main/src/cgeo/geocaching/CacheListActivity.java
@@ -574,7 +574,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
setMenuItemLabel(menu, R.id.menu_remove_from_history, R.string.cache_remove_from_history, R.string.cache_clear_history);
setMenuItemLabel(menu, R.id.menu_export, R.string.export, R.string.export);
- menu.findItem(R.id.menu_import_android).setVisible(Compatibility.isStorageAccessFrameworkAvailable());
+ menu.findItem(R.id.menu_import_android).setVisible(Compatibility.isStorageAccessFrameworkAvailable() && isOffline);
} catch (final RuntimeException e) {
Log.e("CacheListActivity.onPrepareOptionsMenu", e);
}
@@ -1323,6 +1323,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA
listId = list.id;
title = list.title;
+ type = CacheListType.OFFLINE;
Settings.saveLastList(listId);
diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java
index 543be22..f91d275 100644
--- a/main/src/cgeo/geocaching/CachePopup.java
+++ b/main/src/cgeo/geocaching/CachePopup.java
@@ -11,7 +11,7 @@ import cgeo.geocaching.utils.CancellableHandler;
import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.StringUtils;
-import rx.Scheduler.Inner;
+import rx.functions.Action0;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
@@ -126,9 +126,9 @@ public class CachePopup extends AbstractPopupActivity {
protected void storeCache(final int listId) {
final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message);
progress.show(CachePopup.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage());
- Schedulers.io().schedule(new Action1<Inner>() {
+ Schedulers.io().createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
cache.store(listId, storeCacheHandler);
invalidateOptionsMenuCompatible();
}
diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java
index 09aee93..d503969 100644
--- a/main/src/cgeo/geocaching/CgeoApplication.java
+++ b/main/src/cgeo/geocaching/CgeoApplication.java
@@ -11,6 +11,9 @@ import rx.observables.ConnectableObservable;
import android.app.Application;
+import java.io.IOException;
+import java.lang.Thread.UncaughtExceptionHandler;
+
public class CgeoApplication extends Application {
private boolean forceRelog = false; // c:geo needs to log into cache providers
@@ -22,6 +25,34 @@ public class CgeoApplication extends Application {
private volatile IGeoData currentGeo = null;
private volatile float currentDirection = 0.0f;
+ private static final UncaughtExceptionHandler defaultHandler;
+
+ static {
+ defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+
+ Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+
+ @Override
+ public void uncaughtException(Thread thread, Throwable ex) {
+ Log.e("UncaughtException", ex);
+ Throwable exx = ex;
+ while (exx.getCause() != null) {
+ exx = exx.getCause();
+ }
+ if (exx.getClass().equals(OutOfMemoryError.class))
+ {
+ try {
+ Log.e("OutOfMemory");
+ android.os.Debug.dumpHprofData("/sdcard/dump.hprof");
+ } catch (IOException e) {
+ Log.e("Error writing dump", e);
+ }
+ }
+ defaultHandler.uncaughtException(thread, ex);
+ }
+ });
+ }
+
public CgeoApplication() {
setInstance(this);
}
diff --git a/main/src/cgeo/geocaching/CreateShortcutActivity.java b/main/src/cgeo/geocaching/CreateShortcutActivity.java
index b6ea4f6..c18b6f4 100644
--- a/main/src/cgeo/geocaching/CreateShortcutActivity.java
+++ b/main/src/cgeo/geocaching/CreateShortcutActivity.java
@@ -27,7 +27,7 @@ public class CreateShortcutActivity extends AbstractActivity {
@Override
public void call(final Integer listId) {
- final Intent shortcut = createShortcut(listId.intValue());
+ final Intent shortcut = createShortcut(listId);
setResult(RESULT_OK, shortcut);
// finish activity to return the shortcut
diff --git a/main/src/cgeo/geocaching/DataStore.java b/main/src/cgeo/geocaching/DataStore.java
index 32a4b64..350bc6b 100644
--- a/main/src/cgeo/geocaching/DataStore.java
+++ b/main/src/cgeo/geocaching/DataStore.java
@@ -1429,17 +1429,13 @@ public class DataStore {
}
}
- public static void saveLogsWithoutTransaction(final String geocode, final List<LogEntry> logs) {
+ public static void saveLogsWithoutTransaction(final String geocode, final Iterable<LogEntry> logs) {
// TODO delete logimages referring these logs
database.delete(dbTableLogs, "geocode = ?", new String[]{geocode});
- if (logs.isEmpty()) {
- return;
- }
-
- SQLiteStatement insertLog = PreparedStatements.getInsertLog();
+ final SQLiteStatement insertLog = PreparedStatements.getInsertLog();
final long timestamp = System.currentTimeMillis();
- for (LogEntry log : logs) {
+ for (final LogEntry log : logs) {
insertLog.bindString(1, geocode);
insertLog.bindLong(2, timestamp);
insertLog.bindLong(3, log.type.id);
@@ -1448,10 +1444,10 @@ public class DataStore {
insertLog.bindLong(6, log.date);
insertLog.bindLong(7, log.found);
insertLog.bindLong(8, log.friend ? 1 : 0);
- long logId = insertLog.executeInsert();
+ final long logId = insertLog.executeInsert();
if (log.hasLogImages()) {
- SQLiteStatement insertImage = PreparedStatements.getInsertLogImage();
- for (Image img : log.getLogImages()) {
+ final SQLiteStatement insertImage = PreparedStatements.getInsertLogImage();
+ for (final Image img : log.getLogImages()) {
insertImage.bindLong(1, logId);
insertImage.bindString(2, img.getTitle());
insertImage.bindString(3, img.getUrl());
@@ -2895,6 +2891,7 @@ public class DataStore {
}
if (excludeDisabled) {
where.append(" and ").append(dbTableCaches).append(".disabled == 0");
+ where.append(" and ").append(dbTableCaches).append(".archived == 0");
}
if (type != CacheType.ALL) {
where.append(" and ").append(dbTableCaches).append(".type == '").append(type.id).append('\'');
@@ -3164,7 +3161,7 @@ public class DataStore {
}
public static String[] getSuggestionsOwnerName(String input) {
- return getSuggestions(dbTableCaches, "owner", input);
+ return getSuggestions(dbTableCaches, "owner_real", input);
}
public static String[] getSuggestionsTrackableCode(String input) {
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java
index 19c15fd..8836115 100644
--- a/main/src/cgeo/geocaching/Geocache.java
+++ b/main/src/cgeo/geocaching/Geocache.java
@@ -35,7 +35,6 @@ import cgeo.geocaching.utils.MatcherWrapper;
import cgeo.geocaching.utils.UncertainProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.Predicate;
@@ -44,11 +43,9 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
-
import rx.Scheduler;
-import rx.Scheduler.Inner;
import rx.Subscription;
-import rx.functions.Action1;
+import rx.functions.Action0;
import android.app.Activity;
import android.content.Intent;
@@ -1438,9 +1435,9 @@ public class Geocache implements ICache, IWaypoint {
}
public Subscription drop(final Handler handler, final Scheduler scheduler) {
- return scheduler.schedule(new Action1<Inner>() {
+ return scheduler.createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
try {
dropSynchronous();
handler.sendMessage(Message.obtain());
@@ -1499,9 +1496,9 @@ public class Geocache implements ICache, IWaypoint {
}
public Subscription refresh(final int newListId, final CancellableHandler handler, final Scheduler scheduler) {
- return scheduler.schedule(new Action1<Inner>() {
+ return scheduler.createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
refreshSynchronous(newListId, handler);
handler.sendEmptyMessage(CancellableHandler.DONE);
}
diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java
index 2b05263..cccd154 100644
--- a/main/src/cgeo/geocaching/LogCacheActivity.java
+++ b/main/src/cgeo/geocaching/LogCacheActivity.java
@@ -516,7 +516,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia
if (logResult.getPostLogResult() == StatusCode.NO_ERROR) {
// update geocache in DB
- if (typeSelected == LogType.FOUND_IT || typeSelected == LogType.ATTENDED) {
+ if (typeSelected == LogType.FOUND_IT || typeSelected == LogType.ATTENDED || typeSelected == LogType.WEBCAM_PHOTO_TAKEN) {
cache.setFound(true);
cache.setVisitedDate(new Date().getTime());
}
diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java
index 2a37e27..d3bb2d8 100644
--- a/main/src/cgeo/geocaching/SearchActivity.java
+++ b/main/src/cgeo/geocaching/SearchActivity.java
@@ -174,8 +174,20 @@ public class SearchActivity extends AbstractActivity {
}
private void init() {
- buttonLatitude.setOnClickListener(new FindByCoordsAction());
- buttonLongitude.setOnClickListener(new FindByCoordsAction());
+ buttonLatitude.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ updateCoordinates();
+ }
+ });
+ buttonLongitude.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ updateCoordinates();
+ }
+ });
buttonSearchCoords.setOnClickListener(new View.OnClickListener() {
@@ -277,21 +289,17 @@ public class SearchActivity extends AbstractActivity {
}
}
- private class FindByCoordsAction implements OnClickListener {
-
- @Override
- public void onClick(final View arg0) {
- final CoordinatesInputDialog coordsDialog = new CoordinatesInputDialog(SearchActivity.this, null, null, app.currentGeo());
- coordsDialog.setCancelable(true);
- coordsDialog.setOnCoordinateUpdate(new CoordinatesInputDialog.CoordinateUpdate() {
- @Override
- public void update(final Geopoint gp) {
- buttonLatitude.setText(gp.format(GeopointFormatter.Format.LAT_DECMINUTE));
- buttonLongitude.setText(gp.format(GeopointFormatter.Format.LON_DECMINUTE));
- }
- });
- coordsDialog.show();
- }
+ private void updateCoordinates() {
+ final CoordinatesInputDialog coordsDialog = new CoordinatesInputDialog(SearchActivity.this, null, null, app.currentGeo());
+ coordsDialog.setCancelable(true);
+ coordsDialog.setOnCoordinateUpdate(new CoordinatesInputDialog.CoordinateUpdate() {
+ @Override
+ public void update(final Geopoint gp) {
+ buttonLatitude.setText(gp.format(GeopointFormatter.Format.LAT_DECMINUTE));
+ buttonLongitude.setText(gp.format(GeopointFormatter.Format.LON_DECMINUTE));
+ }
+ });
+ coordsDialog.show();
}
private void findByCoordsFn() {
diff --git a/main/src/cgeo/geocaching/SearchResult.java b/main/src/cgeo/geocaching/SearchResult.java
index 12a2522..1916afd 100644
--- a/main/src/cgeo/geocaching/SearchResult.java
+++ b/main/src/cgeo/geocaching/SearchResult.java
@@ -11,7 +11,9 @@ import cgeo.geocaching.gcvote.GCVote;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
+
import rx.Observable;
import rx.functions.Func1;
import rx.functions.Func2;
@@ -60,6 +62,14 @@ public class SearchResult implements Parcelable {
}
/**
+ * Build a new empty search result with an error status.
+ */
+ public SearchResult(final StatusCode statusCode) {
+ this();
+ error = statusCode;
+ }
+
+ /**
* Copy a search result, for example to apply different filters on it.
*
* @param searchResult the original search result, which cannot be null
@@ -155,6 +165,7 @@ public class SearchResult implements Parcelable {
return 0;
}
+ @NonNull
public Set<String> getGeocodes() {
return Collections.unmodifiableSet(geocodes);
}
@@ -218,7 +229,7 @@ public class SearchResult implements Parcelable {
int excluded = 0;
for (Geocache cache : caches) {
// Is there any reason to exclude the cache from the list?
- final boolean excludeCache = (excludeDisabled && cache.isDisabled()) ||
+ final boolean excludeCache = (excludeDisabled && (cache.isDisabled() || cache.isArchived())) ||
(excludeMine && (cache.isOwner() || cache.isFound())) ||
(!cacheType.contains(cache));
if (excludeCache) {
diff --git a/main/src/cgeo/geocaching/SelectMapfileActivity.java b/main/src/cgeo/geocaching/SelectMapfileActivity.java
index c617012..b2cdf17 100644
--- a/main/src/cgeo/geocaching/SelectMapfileActivity.java
+++ b/main/src/cgeo/geocaching/SelectMapfileActivity.java
@@ -115,8 +115,7 @@ public class SelectMapfileActivity extends AbstractFileListActivity<FileSelectio
}
if (requestCode == REQUEST_DIRECTORY) {
- final String directory = new File(data.getData().getPath()).getAbsolutePath();
- mapFile = directory;
+ mapFile = new File(data.getData().getPath()).getAbsolutePath();
close();
}
}
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index eaab159..ae61112 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -11,6 +11,7 @@ import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.Log;
import ch.boye.httpclientandroidlib.HttpResponse;
+
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
@@ -213,7 +214,7 @@ public final class StaticMapsProvider {
url.append("marker_cache_").append(cache.getType().id);
if (cache.isFound()) {
url.append("_found");
- } else if (cache.isDisabled()) {
+ } else if (cache.isDisabled() || cache.isArchived()) {
url.append("_disabled");
}
url.append(".png");
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index 5422c11..4d3580c 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -47,6 +47,14 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import rx.Observable;
+import rx.Observable.OnSubscribe;
+import rx.Subscriber;
+import rx.functions.Action1;
+import rx.functions.Func0;
+import rx.functions.Func2;
+import rx.schedulers.Schedulers;
+
import android.net.Uri;
import android.text.Html;
@@ -335,32 +343,50 @@ public abstract class GCParser {
}
static SearchResult parseCache(final String page, final CancellableHandler handler) {
- final SearchResult searchResult = parseCacheFromText(page, handler);
+ final ImmutablePair<StatusCode, Geocache> parsed = parseCacheFromText(page, handler);
// attention: parseCacheFromText already stores implicitly through searchResult.addCache
- if (searchResult != null && !searchResult.getGeocodes().isEmpty()) {
- final Geocache cache = searchResult.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
- if (cache == null) {
- return null;
- }
- getExtraOnlineInfo(cache, page, handler);
- // too late: it is already stored through parseCacheFromText
- cache.setDetailedUpdatedNow();
- if (CancellableHandler.isCancelled(handler)) {
- return null;
- }
+ if (parsed.left != StatusCode.NO_ERROR) {
+ return new SearchResult(parsed.left);
+ }
+
+ final Geocache cache = parsed.right;
+ getExtraOnlineInfo(cache, page, handler);
+ // too late: it is already stored through parseCacheFromText
+ cache.setDetailedUpdatedNow();
+ if (CancellableHandler.isCancelled(handler)) {
+ return null;
+ }
- // save full detailed caches
- CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_cache);
- DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
+ // save full detailed caches
+ CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_cache);
+ DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
- // update progress message so user knows we're still working. This is more of a place holder than
- // actual indication of what the program is doing
- CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_render);
+ // update progress message so user knows we're still working. This is more of a place holder than
+ // actual indication of what the program is doing
+ CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_render);
+ return new SearchResult(cache);
+ }
+
+ static SearchResult parseAndSaveCacheFromText(final String page, @Nullable final CancellableHandler handler) {
+ final ImmutablePair<StatusCode, Geocache> parsed = parseCacheFromText(page, handler);
+ final SearchResult result = new SearchResult(parsed.left);
+ if (parsed.left == StatusCode.NO_ERROR) {
+ result.addAndPutInCache(Collections.singletonList(parsed.right));
+ DataStore.saveLogsWithoutTransaction(parsed.right.getGeocode(), getLogsFromDetails(page).toBlockingObservable().toIterable());
}
- return searchResult;
+ return result;
}
- static SearchResult parseCacheFromText(final String pageIn, final CancellableHandler handler) {
+ /**
+ * Parse cache from text and return either an error code or a cache object in a pair. Note that inline logs are
+ * not parsed nor saved, while the cache itself is.
+ *
+ * @param pageIn the page text to parse
+ * @param handler the handler to send the progress notifications to
+ * @return a pair, with a {@link StatusCode} on the left, and a non-nulll cache objet on the right
+ * iff the status code is {@link StatusCode.NO_ERROR}.
+ */
+ static private ImmutablePair<StatusCode, Geocache> parseCacheFromText(final String pageIn, @Nullable final CancellableHandler handler) {
CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_details);
if (StringUtils.isBlank(pageIn)) {
@@ -368,22 +394,17 @@ public abstract class GCParser {
return null;
}
- final SearchResult searchResult = new SearchResult();
-
if (pageIn.contains(GCConstants.STRING_UNPUBLISHED_OTHER) || pageIn.contains(GCConstants.STRING_UNPUBLISHED_FROM_SEARCH)) {
- searchResult.setError(StatusCode.UNPUBLISHED_CACHE);
- return searchResult;
+ return ImmutablePair.of(StatusCode.UNPUBLISHED_CACHE, null);
}
if (pageIn.contains(GCConstants.STRING_PREMIUMONLY_1) || pageIn.contains(GCConstants.STRING_PREMIUMONLY_2)) {
- searchResult.setError(StatusCode.PREMIUM_ONLY);
- return searchResult;
+ return ImmutablePair.of(StatusCode.PREMIUM_ONLY, null);
}
final String cacheName = Html.fromHtml(TextUtils.getMatch(pageIn, GCConstants.PATTERN_NAME, true, "")).toString();
if (GCConstants.STRING_UNKNOWN_ERROR.equalsIgnoreCase(cacheName)) {
- searchResult.setError(StatusCode.UNKNOWN_ERROR);
- return searchResult;
+ return ImmutablePair.of(StatusCode.UNKNOWN_ERROR, null);
}
// first handle the content with line breaks, then trim everything for easier matching and reduced memory consumption in parsed fields
@@ -726,14 +747,11 @@ public abstract class GCParser {
// last check for necessary cache conditions
if (StringUtils.isBlank(cache.getGeocode())) {
- searchResult.setError(StatusCode.UNKNOWN_ERROR);
- return searchResult;
+ return ImmutablePair.of(StatusCode.UNKNOWN_ERROR, null);
}
cache.setDetailedUpdatedNow();
- searchResult.addAndPutInCache(Collections.singletonList(cache));
- DataStore.saveLogsWithoutTransaction(cache.getGeocode(), getLogsFromDetails(page, false));
- return searchResult;
+ return ImmutablePair.of(StatusCode.NO_ERROR, cache);
}
private static String getNumberString(final String numberWithPunctuation) {
@@ -1622,116 +1640,142 @@ 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
+ * @return a list of log entries which will be empty if the logs could not be retrieved
*
*/
- @Nullable
- private static List<LogEntry> getLogsFromDetails(final String page, final boolean friends) {
- String rawResponse;
+ @NonNull
+ private static Observable<LogEntry> getLogsFromDetails(final String page) {
+ // extract embedded JSON data from page
+ return parseLogs(false, TextUtils.getMatch(page, GCConstants.PATTERN_LOGBOOK, ""));
+ }
- 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));
+ final 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, "");
+ SpecialLogs(String paramName) {
+ this.paramName = paramName;
}
- return parseLogs(friends, rawResponse);
+ private String getParamName() {
+ return this.paramName;
+ }
}
- private static List<LogEntry> parseLogs(final boolean friends, String rawResponse) {
- final List<LogEntry> logs = new ArrayList<LogEntry>();
-
- // for non logged in users the log book is not shown
- if (StringUtils.isBlank(rawResponse)) {
- return logs;
- }
+ /**
+ * Extract special logs (friends, own) through seperate request.
+ *
+ * @param page
+ * The page to extrat userToken from
+ * @param logType
+ * The logType to request
+ * @return Observable<LogEntry> The logs
+ */
+ private static Observable<LogEntry> getSpecialLogs(final String page, final SpecialLogs logType) {
+ return Observable.defer(new Func0<Observable<? extends LogEntry>>() {
+ @Override
+ public Observable<? extends LogEntry> call() {
+ final MatcherWrapper userTokenMatcher = new MatcherWrapper(GCConstants.PATTERN_USERTOKEN, page);
+ if (!userTokenMatcher.find()) {
+ Log.e("GCParser.loadLogsFromDetails: unable to extract userToken");
+ return Observable.empty();
+ }
- try {
- final JSONObject resp = new JSONObject(rawResponse);
- if (!resp.getString("status").equals("success")) {
- Log.e("GCParser.loadLogsFromDetails: status is " + resp.getString("status"));
- return null;
+ 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 Observable.empty();
+ }
+ final int statusCode = response.getStatusLine().getStatusCode();
+ if (statusCode != 200) {
+ Log.e("GCParser.loadLogsFromDetails: error " + statusCode + " when requesting log information");
+ return Observable.empty();
+ }
+ String rawResponse = Network.getResponseData(response);
+ if (rawResponse == null) {
+ Log.e("GCParser.loadLogsFromDetails: unable to read whole response");
+ return Observable.empty();
+ }
+ return parseLogs(true, rawResponse);
}
+ }).subscribeOn(Schedulers.io());
+ }
- final JSONArray data = resp.getJSONArray("data");
+ private static Observable<LogEntry> parseLogs(final boolean markAsFriendsLog, final String rawResponse) {
+ return Observable.create(new OnSubscribe<LogEntry>() {
+ @Override
+ public void call(final Subscriber<? super LogEntry> subscriber) {
+ // for non logged in users the log book is not shown
+ if (StringUtils.isBlank(rawResponse)) {
+ subscriber.onCompleted();
+ return;
+ }
- for (int index = 0; index < data.length(); index++) {
- final JSONObject entry = data.getJSONObject(index);
+ try {
+ final JSONObject resp = new JSONObject(rawResponse);
+ if (!resp.getString("status").equals("success")) {
+ Log.e("GCParser.loadLogsFromDetails: status is " + resp.getString("status"));
+ subscriber.onCompleted();
+ return;
+ }
- // FIXME: use the "LogType" field instead of the "LogTypeImage" one.
- final String logIconNameExt = entry.optString("LogTypeImage", ".gif");
- final String logIconName = logIconNameExt.substring(0, logIconNameExt.length() - 4);
+ final JSONArray data = resp.getJSONArray("data");
- long date = 0;
- try {
- date = GCLogin.parseGcCustomDate(entry.getString("Visited")).getTime();
- } catch (final ParseException e) {
- Log.e("GCParser.loadLogsFromDetails: failed to parse log date.");
- }
+ for (int index = 0; index < data.length(); index++) {
+ final JSONObject entry = data.getJSONObject(index);
- // TODO: we should update our log data structure to be able to record
- // proper coordinates, and make them clickable. In the meantime, it is
- // better to integrate those coordinates into the text rather than not
- // display them at all.
- final String latLon = entry.getString("LatLonString");
- final String logText = (StringUtils.isEmpty(latLon) ? "" : (latLon + "<br/><br/>")) + TextUtils.removeControlCharacters(entry.getString("LogText"));
- final LogEntry logDone = new LogEntry(
- TextUtils.removeControlCharacters(entry.getString("UserName")),
- date,
- LogType.getByIconName(logIconName),
- logText);
- logDone.found = entry.getInt("GeocacheFindCount");
- logDone.friend = friends;
-
- final JSONArray images = entry.getJSONArray("Images");
- for (int i = 0; i < images.length(); i++) {
- final JSONObject image = images.getJSONObject(i);
- final String url = "http://imgcdn.geocaching.com/cache/log/large/" + image.getString("FileName");
- final String title = TextUtils.removeControlCharacters(image.getString("Name"));
- final Image logImage = new Image(url, title);
- logDone.addLogImage(logImage);
- }
+ // FIXME: use the "LogType" field instead of the "LogTypeImage" one.
+ final String logIconNameExt = entry.optString("LogTypeImage", ".gif");
+ final String logIconName = logIconNameExt.substring(0, logIconNameExt.length() - 4);
- logs.add(logDone);
- }
- } catch (final JSONException e) {
- // failed to parse logs
- Log.w("GCParser.loadLogsFromDetails: Failed to parse cache logs", e);
- }
+ long date = 0;
+ try {
+ date = GCLogin.parseGcCustomDate(entry.getString("Visited")).getTime();
+ } catch (final ParseException e) {
+ Log.e("GCParser.loadLogsFromDetails: failed to parse log date.");
+ }
- return logs;
+ // TODO: we should update our log data structure to be able to record
+ // proper coordinates, and make them clickable. In the meantime, it is
+ // better to integrate those coordinates into the text rather than not
+ // display them at all.
+ final String latLon = entry.getString("LatLonString");
+ final String logText = (StringUtils.isEmpty(latLon) ? "" : (latLon + "<br/><br/>")) + TextUtils.removeControlCharacters(entry.getString("LogText"));
+ final LogEntry logDone = new LogEntry(
+ TextUtils.removeControlCharacters(entry.getString("UserName")),
+ date,
+ LogType.getByIconName(logIconName),
+ logText);
+ logDone.found = entry.getInt("GeocacheFindCount");
+ logDone.friend = markAsFriendsLog;
+
+ final JSONArray images = entry.getJSONArray("Images");
+ for (int i = 0; i < images.length(); i++) {
+ final JSONObject image = images.getJSONObject(i);
+ final String url = "http://imgcdn.geocaching.com/cache/log/large/" + image.getString("FileName");
+ final String title = TextUtils.removeControlCharacters(image.getString("Name"));
+ final Image logImage = new Image(url, title);
+ logDone.addLogImage(logImage);
+ }
+
+ subscriber.onNext(logDone);
+ }
+ } catch (final JSONException e) {
+ // failed to parse logs
+ Log.w("GCParser.loadLogsFromDetails: Failed to parse cache logs", e);
+ }
+ subscriber.onCompleted();
+ }
+ });
}
@NonNull
@@ -1823,32 +1867,39 @@ public abstract class GCParser {
}
private static void getExtraOnlineInfo(final Geocache cache, final String page, final CancellableHandler handler) {
+ // This method starts the page parsing for logs in the background, as well as retrieve the friends and own logs
+ // if requested. It merges them and stores them in the background, while the rating is retrieved if needed and
+ // stored. Then we wait for the log merging and saving to be completed before returning.
if (CancellableHandler.isCancelled(handler)) {
return;
}
- //cache.setLogs(loadLogsFromDetails(page, cache, false));
+ final Observable<LogEntry> logs = getLogsFromDetails(page).subscribeOn(Schedulers.computation());
+ Observable<LogEntry> specialLogs;
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);
+ specialLogs = Observable.merge(getSpecialLogs(page, SpecialLogs.FRIENDS),
+ getSpecialLogs(page, SpecialLogs.OWN));
+ } else {
+ CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_logs);
+ specialLogs = Observable.empty();
+ }
+ final Observable<List<LogEntry>> mergedLogs = Observable.zip(logs.toList(), specialLogs.toList(),
+ new Func2<List<LogEntry>, List<LogEntry>, List<LogEntry>>() {
+ @Override
+ public List<LogEntry> call(final List<LogEntry> logEntries, final List<LogEntry> specialLogEntries) {
+ mergeFriendsLogs(logEntries, specialLogEntries);
+ return logEntries;
}
- }
- DataStore.saveLogsWithoutTransaction(cache.getGeocode(), mergedLogs);
- }
- }
-
- if (Settings.isRatingWanted()) {
- if (CancellableHandler.isCancelled(handler)) {
- return;
- }
+ }).cache();
+ mergedLogs.subscribe(new Action1<List<LogEntry>>() {
+ @Override
+ public void call(final List<LogEntry> logEntries) {
+ DataStore.saveLogsWithoutTransaction(cache.getGeocode(), logEntries);
+ }
+ });
+
+ if (Settings.isRatingWanted() && !CancellableHandler.isCancelled(handler)) {
CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_gcvote);
final GCVoteRating rating = GCVote.getRating(cache.getGuid(), cache.getGeocode());
if (rating != null) {
@@ -1857,6 +1908,28 @@ public abstract class GCParser {
cache.setMyVote(rating.getMyVote());
}
}
+
+ // Wait for completion of logs parsing, retrieving and merging
+ mergedLogs.toBlockingObservable().last();
+ }
+
+ /**
+ * 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
+ */
+ private static void mergeFriendsLogs(final List<LogEntry> mergedLogs, final Iterable<LogEntry> logsToMerge) {
+ for (final LogEntry log : logsToMerge) {
+ if (mergedLogs.contains(log)) {
+ mergedLogs.get(mergedLogs.indexOf(log)).friend = true;
+ } else {
+ mergedLogs.add(log);
+ }
+ }
}
public static boolean uploadModifiedCoordinates(Geocache cache, Geopoint wpt) {
diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java
index 049c633..bdcd78e 100644
--- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java
+++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java
@@ -3,6 +3,7 @@ package cgeo.geocaching.connector.oc;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.DataStore;
import cgeo.geocaching.Geocache;
+import cgeo.geocaching.ICache;
import cgeo.geocaching.LogCacheActivity;
import cgeo.geocaching.SearchResult;
import cgeo.geocaching.connector.ILoggingManager;
@@ -149,6 +150,11 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente
}
@Override
+ public boolean isOwner(ICache cache) {
+ return StringUtils.equals(cache.getOwnerDisplayName(), getUserName());
+ }
+
+ @Override
public String getUserName() {
return userInfo.getName();
}
diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
index 3c93488..1294353 100644
--- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
+++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
@@ -328,8 +328,11 @@ final class OkapiClient {
parseCoreCache(response, cache);
// not used: url
- final JSONObject owner = response.getJSONObject(CACHE_OWNER);
- cache.setOwnerDisplayName(parseUser(owner));
+ final JSONObject ownerObject = response.getJSONObject(CACHE_OWNER);
+ final String owner = parseUser(ownerObject);
+ cache.setOwnerDisplayName(owner);
+ // OpenCaching has no distinction between user id and user display name. Set the ID anyway to simplify c:geo workflows.
+ cache.setOwnerUserId(owner);
cache.getLogCounts().put(LogType.FOUND_IT, response.getInt(CACHE_FOUNDS));
cache.getLogCounts().put(LogType.DIDNT_FIND_IT, response.getInt(CACHE_NOTFOUNDS));
diff --git a/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java
index 2d7207a..5bfab28 100644
--- a/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java
+++ b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java
@@ -24,22 +24,15 @@ class PopularityRatioFilter extends AbstractFilter {
@Override
public boolean accepts(final Geocache cache) {
+ final int finds = getFindsCount(cache);
- int finds;
- int favorites;
- float ratio;
-
- finds = getFindsCount(cache);
-
- // prevent division by zero
- if (finds == 0) {
+ if (finds == 0) { // Prevent division by zero
return false;
}
- favorites = cache.getFavoritePoints();
- ratio = ((float) favorites / (float) finds) * 100.0f;
-
- return (ratio > minRatio) && (ratio <= maxRatio);
+ final int favorites = cache.getFavoritePoints();
+ final float ratio = 100.0f * favorites / finds;
+ return ratio > minRatio && ratio <= maxRatio;
}
private static int getFindsCount(Geocache cache) {
diff --git a/main/src/cgeo/geocaching/filter/StateFilter.java b/main/src/cgeo/geocaching/filter/StateFilter.java
index f452259..fd14b69 100644
--- a/main/src/cgeo/geocaching/filter/StateFilter.java
+++ b/main/src/cgeo/geocaching/filter/StateFilter.java
@@ -32,6 +32,19 @@ abstract class StateFilter extends AbstractFilter {
}
+ static class StateNotFoundFilter extends StateFilter {
+
+ public StateNotFoundFilter() {
+ super(res.getString(R.string.cache_not_status_found));
+ }
+
+ @Override
+ public boolean accepts(final Geocache cache) {
+ return !cache.isFound();
+ }
+
+ }
+
static class StateArchivedFilter extends StateFilter {
public StateArchivedFilter() {
super(res.getString(R.string.cache_status_archived));
@@ -115,6 +128,7 @@ abstract class StateFilter extends AbstractFilter {
public List<StateFilter> getFilters() {
final List<StateFilter> filters = new ArrayList<StateFilter>(6);
filters.add(new StateFoundFilter());
+ filters.add(new StateNotFoundFilter());
filters.add(new StateArchivedFilter());
filters.add(new StateDisabledFilter());
filters.add(new StatePremiumFilter());
diff --git a/main/src/cgeo/geocaching/list/StoredList.java b/main/src/cgeo/geocaching/list/StoredList.java
index e557fc8..84e1163 100644
--- a/main/src/cgeo/geocaching/list/StoredList.java
+++ b/main/src/cgeo/geocaching/list/StoredList.java
@@ -16,6 +16,7 @@ import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.res.Resources;
+import java.lang.ref.WeakReference;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
@@ -58,12 +59,12 @@ public final class StoredList extends AbstractList {
}
public static class UserInterface {
- private final Activity activity;
+ private final WeakReference<Activity> activityRef;
private final CgeoApplication app;
private final Resources res;
- public UserInterface(final Activity activity) {
- this.activity = activity;
+ public UserInterface(final @NonNull Activity activity) {
+ this.activityRef = new WeakReference<Activity>(activity);
app = CgeoApplication.getInstance();
res = app.getResources();
}
@@ -104,6 +105,7 @@ public final class StoredList extends AbstractList {
final CharSequence[] items = new CharSequence[listsTitle.size()];
+ final Activity activity = activityRef.get();
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(res.getString(titleId));
builder.setItems(listsTitle.toArray(items), new DialogInterface.OnClickListener() {
@@ -151,6 +153,10 @@ public final class StoredList extends AbstractList {
@SuppressWarnings("unused")
@Override
public void call(final String listName) {
+ final Activity activity = activityRef.get();
+ if (activity == null) {
+ return;
+ }
final int newId = DataStore.createList(listName);
new StoredList(newId, listName, 0);
@@ -165,6 +171,10 @@ public final class StoredList extends AbstractList {
}
private void handleListNameInput(final String defaultValue, int dialogTitle, int buttonTitle, final Action1<String> runnable) {
+ final Activity activity = activityRef.get();
+ if (activity == null) {
+ return;
+ }
Dialogs.input(activity, dialogTitle, defaultValue, buttonTitle, new Action1<String>() {
@Override
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index 00aee36..b5d0b0e 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -43,9 +43,8 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.eclipse.jdt.annotation.NonNull;
-
-import rx.Scheduler;
import rx.Subscription;
+import rx.functions.Action0;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;
@@ -1007,9 +1006,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
* loading timer Triggers every 250ms and checks for viewport change and starts a {@link LoadRunnable}.
*/
private Subscription startLoadTimer() {
- return Schedulers.newThread().schedulePeriodically(new Action1<Scheduler.Inner>() {
+ return Schedulers.newThread().createWorker().schedulePeriodically(new Action0() {
@Override
- public void call(Scheduler.Inner inner) {
+ public void call() {
try {
if (mapView != null) {
// get current viewport
@@ -1373,7 +1372,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
List<Geocache> removeList = new ArrayList<Geocache>();
for (Geocache cache : caches) {
- if ((excludeMine && cache.isFound()) || (excludeMine && cache.isOwner()) || (excludeDisabled && cache.isDisabled())) {
+ if ((excludeMine && cache.isFound()) || (excludeMine && cache.isOwner()) || (excludeDisabled && cache.isDisabled()) || (excludeDisabled && cache.isArchived())) {
removeList.add(cache);
}
}
diff --git a/main/src/cgeo/geocaching/maps/CachesOverlay.java b/main/src/cgeo/geocaching/maps/CachesOverlay.java
index 0c7c296..8607c88 100644
--- a/main/src/cgeo/geocaching/maps/CachesOverlay.java
+++ b/main/src/cgeo/geocaching/maps/CachesOverlay.java
@@ -211,9 +211,9 @@ public class CachesOverlay extends AbstractItemizedOverlay {
progress.show(context, context.getResources().getString(R.string.map_live), context.getResources().getString(R.string.cache_dialog_loading_details), true, null);
- CachesOverlayItemImpl item = null;
// prevent concurrent changes
getOverlayImpl().lock();
+ CachesOverlayItemImpl item = null;
try {
if (index < items.size()) {
item = items.get(index);
diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java
index 9c55fe9..167559d 100644
--- a/main/src/cgeo/geocaching/network/HtmlImage.java
+++ b/main/src/cgeo/geocaching/network/HtmlImage.java
@@ -13,21 +13,20 @@ import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.RxUtils;
import ch.boye.httpclientandroidlib.HttpResponse;
+
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
+
import rx.Observable;
import rx.Observable.OnSubscribe;
-import rx.Scheduler;
-import rx.Scheduler.Inner;
import rx.Subscriber;
-import rx.functions.Action1;
+import rx.functions.Action0;
import rx.functions.Func0;
import rx.functions.Func1;
-import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;
import rx.subscriptions.CompositeSubscription;
@@ -44,6 +43,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Date;
+import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -94,8 +94,7 @@ public class HtmlImage implements Html.ImageGetter {
final private PublishSubject<Observable<String>> loading = PublishSubject.create();
final Observable<String> waitForEnd = Observable.merge(loading).publish().refCount();
final CompositeSubscription subscription = new CompositeSubscription(waitForEnd.subscribe());
- final private Scheduler downloadScheduler = Schedulers.executor(new ThreadPoolExecutor(10, 10, 5, TimeUnit.SECONDS,
- new LinkedBlockingQueue<Runnable>()));
+ final private Executor downloadExecutor = new ThreadPoolExecutor(10, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
public HtmlImage(final String geocode, final boolean returnErrorImage, final int listId, final boolean onlySave) {
this.geocode = geocode;
@@ -152,9 +151,9 @@ public class HtmlImage implements Html.ImageGetter {
@Override
public void call(final Subscriber<? super BitmapDrawable> subscriber) {
subscription.add(subscriber);
- subscriber.add(RxUtils.computationScheduler.schedule(new Action1<Inner>() {
+ subscriber.add(RxUtils.computationScheduler.createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
final Pair<BitmapDrawable, Boolean> loaded = loadFromDisk();
final BitmapDrawable bitmap = loaded.getLeft();
if (loaded.getRight()) {
@@ -165,12 +164,11 @@ public class HtmlImage implements Html.ImageGetter {
if (bitmap != null && !onlySave) {
subscriber.onNext(bitmap);
}
- subscriber.add(downloadScheduler.schedule(new Action1<Inner>() {
- @Override
- public void call(final Inner inner) {
+ downloadExecutor.execute(new Runnable() {
+ @Override public void run() {
downloadAndSave(subscriber);
}
- }));
+ });
}
}));
}
@@ -205,9 +203,9 @@ public class HtmlImage implements Html.ImageGetter {
if (onlySave) {
subscriber.onCompleted();
} else {
- RxUtils.computationScheduler.schedule(new Action1<Inner>() {
+ RxUtils.computationScheduler.createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
final Pair<BitmapDrawable, Boolean> loaded = loadFromDisk();
final BitmapDrawable image = loaded.getLeft();
if (image != null) {
diff --git a/main/src/cgeo/geocaching/network/StatusUpdater.java b/main/src/cgeo/geocaching/network/StatusUpdater.java
index 4055f01..bf9ebdf 100644
--- a/main/src/cgeo/geocaching/network/StatusUpdater.java
+++ b/main/src/cgeo/geocaching/network/StatusUpdater.java
@@ -5,10 +5,9 @@ import cgeo.geocaching.utils.Version;
import org.json.JSONException;
import org.json.JSONObject;
-import rx.Scheduler;
+import rx.functions.Action0;
import rx.schedulers.Schedulers;
import rx.subjects.BehaviorSubject;
-import rx.functions.Action1;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
@@ -52,9 +51,9 @@ public class StatusUpdater {
final static public BehaviorSubject<Status> latestStatus = BehaviorSubject.create(Status.defaultStatus(null));
static {
- Schedulers.io().schedulePeriodically(new Action1<Scheduler.Inner>() {
+ Schedulers.io().createWorker().schedulePeriodically(new Action0() {
@Override
- public void call(final Scheduler.Inner inner) {
+ public void call() {
final JSONObject response =
Network.requestJSON("http://status.cgeo.org/api/status.json",
new Parameters("version_code", String.valueOf(Version.getVersionCode(CgeoApplication.getInstance())),
diff --git a/main/src/cgeo/geocaching/sensors/DirectionProvider.java b/main/src/cgeo/geocaching/sensors/DirectionProvider.java
index ff4a439..13fcc82 100644
--- a/main/src/cgeo/geocaching/sensors/DirectionProvider.java
+++ b/main/src/cgeo/geocaching/sensors/DirectionProvider.java
@@ -83,7 +83,7 @@ public class DirectionProvider {
private boolean hasSensorChecked = false;
public boolean hasSensor(Context context) {
- if (hasSensorChecked == false) {
+ if (!hasSensorChecked) {
hasSensor = getOrientationSensor(context) != null;
hasSensorChecked = true;
}
diff --git a/main/src/cgeo/geocaching/sensors/GeoDataProvider.java b/main/src/cgeo/geocaching/sensors/GeoDataProvider.java
index a77b477..a68f2a6 100644
--- a/main/src/cgeo/geocaching/sensors/GeoDataProvider.java
+++ b/main/src/cgeo/geocaching/sensors/GeoDataProvider.java
@@ -1,18 +1,15 @@
package cgeo.geocaching.sensors;
-import android.os.*;
import cgeo.geocaching.utils.Log;
-
import cgeo.geocaching.utils.StartableHandlerThread;
+
import org.apache.commons.lang3.StringUtils;
import rx.Observable;
import rx.Observable.OnSubscribe;
-import rx.Scheduler.Inner;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
-import rx.functions.Action1;
import rx.observables.ConnectableObservable;
import rx.subjects.BehaviorSubject;
import rx.subscriptions.CompositeSubscription;
@@ -24,6 +21,7 @@ import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
+import android.os.Bundle;
import java.util.concurrent.TimeUnit;
@@ -98,9 +96,9 @@ public class GeoDataProvider implements OnSubscribe<IGeoData> {
@Override
public Subscription connect() {
final CompositeSubscription subscription = new CompositeSubscription();
- AndroidSchedulers.handlerThread(handlerThread.getHandler()).schedule(new Action1<Inner>() {
+ AndroidSchedulers.handlerThread(handlerThread.getHandler()).createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
synchronized(lock) {
if (count++ == 0) {
Log.d("GeoDataProvider: starting the GPS and network listeners" + " (" + ++debugSessionCounter + ")");
@@ -118,9 +116,9 @@ public class GeoDataProvider implements OnSubscribe<IGeoData> {
subscription.add(Subscriptions.create(new Action0() {
@Override
public void call() {
- AndroidSchedulers.handlerThread(handlerThread.getHandler()).schedule(new Action1<Inner>() {
+ AndroidSchedulers.handlerThread(handlerThread.getHandler()).createWorker().schedule(new Action0() {
@Override
- public void call(final Inner inner) {
+ public void call() {
synchronized (lock) {
if (--count == 0) {
Log.d("GeoDataProvider: stopping the GPS and network listeners" + " (" + debugSessionCounter + ")");
diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java
index dc1a39d..74a9b32 100644
--- a/main/src/cgeo/geocaching/settings/SettingsActivity.java
+++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java
@@ -62,7 +62,7 @@ public class SettingsActivity extends PreferenceActivity {
* directory and preference key in onActivityResult() easily just by knowing
* the result code.
*/
- private enum DirChooserType {
+ private static enum DirChooserType {
GPX_IMPORT_DIR(1, R.string.pref_gpxImportDir,
Environment.getExternalStorageDirectory().getPath() + "/gpx", false),
GPX_EXPORT_DIR(2, R.string.pref_gpxExportDir,
@@ -189,7 +189,7 @@ public class SettingsActivity extends PreferenceActivity {
private static void setServiceScreenSummary(PreferenceManager preferenceManager, final int preferenceKey) {
- String summary = StringUtils.EMPTY;
+ String summary;
switch (preferenceKey) {
case R.string.pref_connectorGCActive:
@@ -582,7 +582,7 @@ public class SettingsActivity extends PreferenceActivity {
|| isPreference(preference, R.string.pref_connectorOXActive)
|| isPreference(preference, R.string.pref_connectorECActive)) {
// update summary
- boolean boolVal = ((Boolean) value).booleanValue();
+ final boolean boolVal = (Boolean) value;
String summary = getServiceSummary(boolVal);
if (OCPreferenceKeys.isOCPreference(preference.getKey())) {
OCPreferenceKeys prefKey = OCPreferenceKeys.getByKey(preference.getKey());
diff --git a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java
index 1ed8e68..57a69ee 100644
--- a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java
+++ b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java
@@ -12,16 +12,14 @@ public class PopularityRatioComparator extends AbstractCacheComparator {
@Override
protected int compareCaches(final Geocache cache1, final Geocache cache2) {
-
- float ratio1 = 0.0f;
- float ratio2 = 0.0f;
-
int finds1 = cache1.getFindsCount();
int finds2 = cache2.getFindsCount();
+ float ratio1 = 0.0f;
if (finds1 != 0) {
ratio1 = (((float) cache1.getFavoritePoints()) / ((float) finds1));
}
+ float ratio2 = 0.0f;
if (finds2 != 0) {
ratio2 = (((float) cache2.getFavoritePoints()) / ((float) finds2));
}
diff --git a/main/src/cgeo/geocaching/ui/AbstractCachingListViewPageViewCreator.java b/main/src/cgeo/geocaching/ui/AbstractCachingListViewPageViewCreator.java
index 799b695..06fa1fa 100644
--- a/main/src/cgeo/geocaching/ui/AbstractCachingListViewPageViewCreator.java
+++ b/main/src/cgeo/geocaching/ui/AbstractCachingListViewPageViewCreator.java
@@ -51,7 +51,6 @@ public abstract class AbstractCachingListViewPageViewCreator extends AbstractCac
int logViewPosition = state.getInt(STATE_POSITION);
int logViewPositionFromTop = state.getInt(STATE_POSITION_FROM_TOP);
view.setSelectionFromTop(logViewPosition, logViewPositionFromTop);
- return;
}
}
diff --git a/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java b/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java
index 0c67384..71cd3b4 100644
--- a/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java
+++ b/main/src/cgeo/geocaching/ui/AbstractCachingPageViewCreator.java
@@ -52,6 +52,5 @@ public abstract class AbstractCachingPageViewCreator<ViewClass extends View> imp
*/
@Override
public void setViewState(@NonNull Bundle state) {
- return;
}
}
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index 0d90d9f..3a451a5 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -45,6 +45,7 @@ import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -377,7 +378,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
final boolean lightSkin = Settings.isLightSkin();
- final TouchListener touchListener = new TouchListener(cache);
+ final TouchListener touchListener = new TouchListener(cache, this);
v.setOnClickListener(touchListener);
v.setOnLongClickListener(touchListener);
v.setOnTouchListener(touchListener);
@@ -536,24 +537,30 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
}
}
- private class TouchListener implements View.OnClickListener, View.OnLongClickListener, View.OnTouchListener {
+ private static class TouchListener implements View.OnClickListener, View.OnLongClickListener, View.OnTouchListener {
private final Geocache cache;
private final GestureDetector gestureDetector;
+ private final @NonNull WeakReference<CacheListAdapter> adapterRef;
- public TouchListener(final Geocache cache) {
+ public TouchListener(final Geocache cache, final @NonNull CacheListAdapter adapter) {
this.cache = cache;
- gestureDetector = new GestureDetector(getContext(), new FlingGesture(cache));
+ gestureDetector = new GestureDetector(adapter.getContext(), new FlingGesture(cache, adapter));
+ adapterRef = new WeakReference<CacheListAdapter>(adapter);
}
// Tap on item
@Override
public void onClick(final View view) {
- if (isSelectMode()) {
+ final CacheListAdapter adapter = adapterRef.get();
+ if (adapter == null) {
+ return;
+ }
+ if (adapter.isSelectMode()) {
cache.setStatusChecked(!cache.isStatusChecked());
- notifyDataSetChanged();
+ adapter.notifyDataSetChanged();
} else {
- CacheDetailActivity.startActivity(getContext(), cache.getGeocode(), cache.getName());
+ CacheDetailActivity.startActivity(adapter.getContext(), cache.getGeocode(), cache.getName());
}
}
@@ -572,12 +579,14 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
}
}
- private class FlingGesture extends GestureDetector.SimpleOnGestureListener {
+ private static class FlingGesture extends GestureDetector.SimpleOnGestureListener {
private final Geocache cache;
+ private final @NonNull WeakReference<CacheListAdapter> adapterRef;
- public FlingGesture(final Geocache cache) {
+ public FlingGesture(final Geocache cache, final @NonNull CacheListAdapter adapter) {
this.cache = cache;
+ adapterRef = new WeakReference<CacheListAdapter>(adapter);
}
@Override
@@ -586,11 +595,15 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
return false;
}
+ final CacheListAdapter adapter = adapterRef.get();
+ if (adapter == null) {
+ return false;
+ }
// left to right swipe
if ((e2.getX() - e1.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > Math.abs(velocityY)) {
- if (!selectMode) {
- switchSelectMode();
+ if (!adapter.selectMode) {
+ adapter.switchSelectMode();
cache.setStatusChecked(true);
}
return true;
@@ -598,8 +611,8 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> {
// right to left swipe
if ((e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > Math.abs(velocityY)) {
- if (selectMode) {
- switchSelectMode();
+ if (adapter.selectMode) {
+ adapter.switchSelectMode();
}
return true;
}
diff --git a/main/src/cgeo/geocaching/ui/CompassView.java b/main/src/cgeo/geocaching/ui/CompassView.java
index f7111f7..915303b 100644
--- a/main/src/cgeo/geocaching/ui/CompassView.java
+++ b/main/src/cgeo/geocaching/ui/CompassView.java
@@ -3,10 +3,9 @@ package cgeo.geocaching.ui;
import cgeo.geocaching.R;
import cgeo.geocaching.utils.AngleUtils;
-import rx.Scheduler;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
-import rx.functions.Action1;
+import rx.functions.Action0;
import android.content.Context;
import android.content.res.Resources;
@@ -88,9 +87,9 @@ public class CompassView extends View {
initialDisplay = true;
- periodicUpdate = AndroidSchedulers.mainThread().schedulePeriodically(new Action1<Scheduler.Inner>() {
+ periodicUpdate = AndroidSchedulers.mainThread().createWorker().schedulePeriodically(new Action0() {
@Override
- public void call(final Scheduler.Inner inner) {
+ public void call() {
final float newAzimuthShown = smoothUpdate(northMeasured, azimuthShown);
final float newCacheHeadingShown = smoothUpdate(cacheHeadingMeasured, cacheHeadingShown);
if (Math.abs(AngleUtils.difference(azimuthShown, newAzimuthShown)) >= 2 ||
diff --git a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java
index b2ce11a..67b8923 100644
--- a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java
+++ b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java
@@ -1,17 +1,18 @@
package cgeo.geocaching.ui.dialog;
import cgeo.geocaching.Geocache;
-import cgeo.geocaching.sensors.IGeoData;
import cgeo.geocaching.R;
import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.GeopointFormatter;
+import cgeo.geocaching.sensors.IGeoData;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.settings.Settings.CoordInputFormatEnum;
import cgeo.geocaching.utils.EditUtils;
import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jdt.annotation.NonNull;
import android.os.Bundle;
import android.text.Editable;
@@ -25,9 +26,11 @@ import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
+import java.lang.ref.WeakReference;
+
public class CoordinatesInputDialog extends NoTitleDialog {
- final private AbstractActivity context;
+ final private WeakReference<AbstractActivity> context;
final private IGeoData geo;
final private Geocache cache;
private Geopoint gp;
@@ -43,9 +46,9 @@ public class CoordinatesInputDialog extends NoTitleDialog {
private CoordInputFormatEnum currentFormat = null;
- public CoordinatesInputDialog(final AbstractActivity context, final Geocache cache, final Geopoint gp, final IGeoData geo) {
+ public CoordinatesInputDialog(final @NonNull AbstractActivity context, final Geocache cache, final Geopoint gp, final IGeoData geo) {
super(context, ActivityMixin.getDialogTheme());
- this.context = context;
+ this.context = new WeakReference<AbstractActivity>(context);
this.geo = geo;
this.cache = cache;
@@ -66,7 +69,7 @@ public class CoordinatesInputDialog extends NoTitleDialog {
final Spinner spinner = (Spinner) findViewById(R.id.spinnerCoordinateFormats);
final ArrayAdapter<CharSequence> adapter =
- ArrayAdapter.createFromResource(context,
+ ArrayAdapter.createFromResource(context.get(),
R.array.waypoint_coordinate_formats,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
@@ -371,7 +374,8 @@ public class CoordinatesInputDialog extends NoTitleDialog {
// Signaled and returned below
}
if (signalError) {
- context.showToast(context.getResources().getString(R.string.err_parse_lat_lon));
+ final AbstractActivity activity = context.get();
+ activity.showToast(activity.getResources().getString(R.string.err_parse_lat_lon));
}
return false;
}
@@ -423,7 +427,8 @@ public class CoordinatesInputDialog extends NoTitleDialog {
@Override
public void onClick(View v) {
if (geo == null || geo.getCoords() == null) {
- context.showToast(context.getResources().getString(R.string.err_point_unknown_position));
+ final AbstractActivity activity = context.get();
+ activity.showToast(activity.getResources().getString(R.string.err_point_unknown_position));
return;
}
@@ -437,7 +442,8 @@ public class CoordinatesInputDialog extends NoTitleDialog {
@Override
public void onClick(View v) {
if (cache == null || cache.getCoords() == null) {
- context.showToast(context.getResources().getString(R.string.err_location_unknown));
+ final AbstractActivity activity = context.get();
+ activity.showToast(activity.getResources().getString(R.string.err_location_unknown));
return;
}
diff --git a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java
index 4ce2e0c..14840b9 100644
--- a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java
+++ b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java
@@ -10,7 +10,6 @@ import org.apache.commons.lang3.StringUtils;
import android.app.Activity;
import android.app.ProgressDialog;
-import android.content.Context;
import android.content.res.Resources;
import java.io.File;
@@ -53,7 +52,6 @@ public class DatabaseBackupUtils {
}
public static boolean createBackup(final Activity activity, final Runnable runAfterwards) {
- final Context context = activity;
// avoid overwriting an existing backup with an empty database
// (can happen directly after reinstalling the app)
if (DataStore.getAllCachesCount() == 0) {
@@ -61,9 +59,9 @@ public class DatabaseBackupUtils {
return false;
}
- final ProgressDialog dialog = ProgressDialog.show(context,
- context.getString(R.string.init_backup),
- context.getString(R.string.init_backup_running), true, false);
+ final ProgressDialog dialog = ProgressDialog.show(activity,
+ activity.getString(R.string.init_backup),
+ activity.getString(R.string.init_backup_running), true, false);
new Thread() {
@Override
public void run() {
@@ -75,9 +73,9 @@ public class DatabaseBackupUtils {
Dialogs.message(activity,
R.string.init_backup_backup,
backupFileName != null
- ? context.getString(R.string.init_backup_success)
+ ? activity.getString(R.string.init_backup_success)
+ "\n" + backupFileName
- : context.getString(R.string.init_backup_failed));
+ : activity.getString(R.string.init_backup_failed));
if (runAfterwards != null) {
runAfterwards.run();
}
diff --git a/main/src/cgeo/geocaching/utils/RxUtils.java b/main/src/cgeo/geocaching/utils/RxUtils.java
index 8e7864c..deba573 100644
--- a/main/src/cgeo/geocaching/utils/RxUtils.java
+++ b/main/src/cgeo/geocaching/utils/RxUtils.java
@@ -3,16 +3,10 @@ package cgeo.geocaching.utils;
import rx.Scheduler;
import rx.schedulers.Schedulers;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
public class RxUtils {
// Utility class, not to be instanciated
private RxUtils() {}
- final static private int cores = Runtime.getRuntime().availableProcessors();
- public final static Scheduler computationScheduler = Schedulers.executor(new ThreadPoolExecutor(1, cores, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()));
-
+ public final static Scheduler computationScheduler = Schedulers.computation();
}
diff --git a/mapswithme-api/mapswithme-api.iml b/mapswithme-api/mapswithme-api.iml
index 488455c..4d01e37 100644
--- a/mapswithme-api/mapswithme-api.iml
+++ b/mapswithme-api/mapswithme-api.iml
@@ -17,7 +17,6 @@
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
- <output url="file://$MODULE_DIR$/bin/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
diff --git a/tests/src/cgeo/geocaching/CgeoApplicationTest.java b/tests/src/cgeo/geocaching/CgeoApplicationTest.java
index 3e63481..bdde2b6 100644
--- a/tests/src/cgeo/geocaching/CgeoApplicationTest.java
+++ b/tests/src/cgeo/geocaching/CgeoApplicationTest.java
@@ -158,6 +158,7 @@ public class CgeoApplicationTest extends CGeoTestCase {
public static void testSearchByGeocodeNotLoggedIn() {
withMockedLoginDo(new Runnable() {
+ @Override
public void run() {
// non premium cache
MockedCache cache = new GC2CJPF();
@@ -193,6 +194,7 @@ public class CgeoApplicationTest extends CGeoTestCase {
public static void testSearchErrorOccured() {
withMockedLoginDo(new Runnable() {
+ @Override
public void run() {
// non premium cache
final MockedCache cache = new GC1ZXX2();
@@ -342,6 +344,7 @@ public class CgeoApplicationTest extends CGeoTestCase {
public static void testSearchByViewportNotLoggedIn() {
withMockedLoginDo(new Runnable() {
+ @Override
public void run() {
final Strategy strategy = Settings.getLiveMapStrategy();
final Strategy testStrategy = Strategy.FAST; // FASTEST, FAST or DETAILED for tests
diff --git a/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java b/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java
index 2897b54..1c64568 100644
--- a/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java
+++ b/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java
@@ -36,7 +36,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
private void assertUnpublished(final int cache) {
final String page = getFileContent(cache);
- final SearchResult result = GCParser.parseCacheFromText(page, null);
+ final SearchResult result = GCParser.parseAndSaveCacheFromText(page, null);
assertThat(result).isNotNull();
assertThat(result.isEmpty()).isTrue();
assertThat(result.getError()).isEqualTo(StatusCode.UNPUBLISHED_CACHE);
@@ -52,7 +52,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
private void assertPublishedCache(final int cachePage, final String cacheName) {
final String page = getFileContent(cachePage);
- final SearchResult result = GCParser.parseCacheFromText(page, null);
+ final SearchResult result = GCParser.parseAndSaveCacheFromText(page, null);
assertThat(result).isNotNull();
assertThat(result.getCount()).isEqualTo(1);
final Geocache cache = result.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
@@ -79,7 +79,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
final SearchResult searchResult;
try {
Settings.setGcCustomDate(MockedCache.getDateFormat());
- searchResult = GCParser.parseCacheFromText(mockedCache.getData(), null);
+ searchResult = GCParser.parseAndSaveCacheFromText(mockedCache.getData(), null);
} finally {
Settings.setGcCustomDate(oldCustomDate);
}
@@ -103,7 +103,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
for (MockedCache mockedCache : RegExPerformanceTest.MOCKED_CACHES) {
// to get the same results we have to use the date format used when the mocked data was created
Settings.setGcCustomDate(MockedCache.getDateFormat());
- SearchResult searchResult = GCParser.parseCacheFromText(mockedCache.getData(), null);
+ SearchResult searchResult = GCParser.parseAndSaveCacheFromText(mockedCache.getData(), null);
Geocache parsedCache = searchResult.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
assertThat(StringUtils.isNotBlank(mockedCache.getMockedDataUser())).isTrue();
Compare.assertCompareCaches(mockedCache, parsedCache, true);
@@ -158,7 +158,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
GCParser.editModifiedCoordinates(cache, new Geopoint("N51 21.544", "E07 02.566"));
cache.dropSynchronous();
final String page = GCParser.requestHtmlPage(cache.getGeocode(), null, "n", "0");
- final Geocache cache2 = GCParser.parseCacheFromText(page, null).getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
+ final Geocache cache2 = GCParser.parseAndSaveCacheFromText(page, null).getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
assertThat(cache2).isNotNull();
assert (cache2 != null); // eclipse bug
assertThat(cache2.hasUserModifiedCoords()).isTrue();
@@ -167,7 +167,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
GCParser.deleteModifiedCoordinates(cache2);
cache2.dropSynchronous();
final String page2 = GCParser.requestHtmlPage(cache.getGeocode(), null, "n", "0");
- final Geocache cache3 = GCParser.parseCacheFromText(page2, null).getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
+ final Geocache cache3 = GCParser.parseAndSaveCacheFromText(page2, null).getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
assertThat(cache3).isNotNull();
assert (cache3 != null); // eclipse bug
assertThat(cache3.hasUserModifiedCoords()).isFalse();
@@ -210,7 +210,7 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase {
private Geocache parseCache(int resourceId) {
final String page = getFileContent(resourceId);
- final SearchResult result = GCParser.parseCacheFromText(page, null);
+ final SearchResult result = GCParser.parseAndSaveCacheFromText(page, null);
assertThat(result).isNotNull();
assertThat(result.isEmpty()).isFalse();
return result.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
diff --git a/tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java b/tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java
index 05d676b..2c1d06c 100644
--- a/tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java
+++ b/tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java
@@ -22,6 +22,8 @@ public class OkapiClientTest extends CGeoTestCase {
assertThat(cache.getGeocode()).isEqualTo(geoCode);
assertThat(cache.getName()).isEqualTo("Oshkosh Municipal Tank");
assertThat(cache.isDetailed()).isTrue();
+ assertThat(cache.getOwnerDisplayName()).isNotEmpty();
+ assertThat(cache.getOwnerUserId()).isEqualTo(cache.getOwnerDisplayName());
}
public static void testOCSearchMustWorkWithoutOAuthAccessTokens() {
diff --git a/tests/src/cgeo/geocaching/export/ExportTest.java b/tests/src/cgeo/geocaching/export/ExportTest.java
index a9fceec..848a1f7 100644
--- a/tests/src/cgeo/geocaching/export/ExportTest.java
+++ b/tests/src/cgeo/geocaching/export/ExportTest.java
@@ -52,10 +52,6 @@ public class ExportTest extends CGeoTestCase {
private static class GpxExportTester extends GpxExport {
- protected GpxExportTester() {
- super();
- }
-
public File testExportSync(List<Geocache> caches) throws InterruptedException, ExecutionException {
final ArrayList<String> geocodes = new ArrayList<String>(caches.size());
for (final Geocache cache : caches) {
diff --git a/tests/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReaderTest.java b/tests/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReaderTest.java
index 0641b5d..515d8a6 100644
--- a/tests/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReaderTest.java
+++ b/tests/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReaderTest.java
@@ -17,6 +17,7 @@ public class InvalidXMLCharacterFilterReaderTest extends AndroidTestCase {
final AtomicReference<String> description = new AtomicReference<String>();
root.setEndTextElementListener(new EndTextElementListener() {
+ @Override
public void end(String body) {
description.set(body);
}
diff --git a/tests/src/cgeo/geocaching/filter/StateNotFoundFilterTest.java b/tests/src/cgeo/geocaching/filter/StateNotFoundFilterTest.java
new file mode 100644
index 0000000..2bf9d94
--- /dev/null
+++ b/tests/src/cgeo/geocaching/filter/StateNotFoundFilterTest.java
@@ -0,0 +1,28 @@
+package cgeo.geocaching.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import cgeo.CGeoTestCase;
+import cgeo.geocaching.Geocache;
+import cgeo.geocaching.filter.StateFilter.StateNotFoundFilter;
+
+public class StateNotFoundFilterTest extends CGeoTestCase {
+
+ private StateFilter.StateNotFoundFilter notFoundFilter;
+ private Geocache foundCache;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ notFoundFilter = new StateNotFoundFilter();
+ foundCache = new Geocache();
+ foundCache.setFound(true);
+ }
+
+ public void testAccepts() {
+ assertThat(notFoundFilter.accepts(foundCache)).isFalse();
+ assertThat(notFoundFilter.accepts(new Geocache())).isTrue();
+ }
+
+}
diff --git a/tests/src/cgeo/geocaching/test/mock/MockedCache.java b/tests/src/cgeo/geocaching/test/mock/MockedCache.java
index d06e715..cd482f8 100644
--- a/tests/src/cgeo/geocaching/test/mock/MockedCache.java
+++ b/tests/src/cgeo/geocaching/test/mock/MockedCache.java
@@ -150,6 +150,7 @@ public abstract class MockedCache implements ICache {
return getName();
}
+ @Override
public Geopoint getCoords() {
return coords;
}