diff options
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 Binary files differindex b840d42..e8b12ec 100644 --- a/main/libs/rxjava-android-0.17.6.jar +++ b/main/libs/rxjava-android-0.18.3.jar diff --git a/main/libs/rxjava-async-util-0.17.6.jar b/main/libs/rxjava-async-util-0.17.6.jar Binary files differdeleted file mode 100644 index 2947fe3..0000000 --- a/main/libs/rxjava-async-util-0.17.6.jar +++ /dev/null diff --git a/main/libs/rxjava-async-util-0.18.3.jar b/main/libs/rxjava-async-util-0.18.3.jar Binary files differnew file mode 100644 index 0000000..c3cc522 --- /dev/null +++ b/main/libs/rxjava-async-util-0.18.3.jar diff --git a/main/libs/rxjava-core-0.17.6.jar b/main/libs/rxjava-core-0.17.6.jar Binary files differdeleted file mode 100644 index 33d8801..0000000 --- a/main/libs/rxjava-core-0.17.6.jar +++ /dev/null diff --git a/main/libs/rxjava-core-0.18.3.jar b/main/libs/rxjava-core-0.18.3.jar Binary files differnew file mode 100644 index 0000000..699e327 --- /dev/null +++ b/main/libs/rxjava-core-0.18.3.jar 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; } |
