aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md19
-rw-r--r--main/.classpath2
-rw-r--r--main/res/layout/about_activity.xml1
-rw-r--r--main/res/layout/edit_waypoint_activity.xml1
-rw-r--r--main/res/layout/init.xml1
-rw-r--r--main/res/layout/search.xml2
-rw-r--r--main/res/layout/touch.xml1
-rw-r--r--main/res/layout/twitter_authorization_activity.xml1
-rw-r--r--main/res/layout/visit.xml1
-rw-r--r--main/res/layout/visit_image.xml1
-rw-r--r--main/res/values-cs/strings.xml84
-rw-r--r--main/res/values-de/strings.xml13
-rw-r--r--main/res/values-fr/strings.xml2
-rw-r--r--main/res/values-ja/strings.xml2
-rw-r--r--main/res/values-nl/strings.xml4
-rw-r--r--main/res/values-pl/strings.xml2
-rw-r--r--main/res/values-pt/strings.xml2
-rw-r--r--main/res/values-sk/strings.xml4
-rw-r--r--main/res/values-sv/strings.xml32
-rw-r--r--main/res/values/strings.xml5
-rw-r--r--main/res/values/strings_not_translatable.xml11
-rw-r--r--main/src/cgeo/geocaching/EditWaypointActivity.java15
-rw-r--r--main/src/cgeo/geocaching/Geocache.java34
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java7
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java75
-rw-r--r--main/src/cgeo/geocaching/Waypoint.java9
-rw-r--r--main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java5
-rw-r--r--main/src/cgeo/geocaching/cgData.java46
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java53
-rw-r--r--main/src/cgeo/geocaching/connector/AbstractConnector.java5
-rw-r--r--main/src/cgeo/geocaching/connector/IConnector.java10
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConnector.java14
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java2
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OC11XMLParser.java28
-rw-r--r--tests/src/cgeo/CGeoTestCase.java7
-rw-r--r--tests/src/cgeo/geocaching/cgeoApplicationTest.java5
-rw-r--r--tests/src/cgeo/geocaching/connector/oc/OCXMLTest.java (renamed from tests/src/cgeo/geocaching/connector/opencaching/OCXMLTest.java)44
-rw-r--r--tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java (renamed from tests/src/cgeo/geocaching/connector/opencaching/OkapiClientTest.java)2
-rw-r--r--tests/src/cgeo/geocaching/test/mock/GC1ZXX2.html7
-rw-r--r--tests/src/cgeo/geocaching/test/mock/GC2CJPF.html7
-rw-r--r--tests/src/cgeo/geocaching/test/mock/GC2JVEH.html7
-rw-r--r--tests/src/cgeo/geocaching/test/mock/GC3XX5J.html7
42 files changed, 430 insertions, 150 deletions
diff --git a/README.md b/README.md
index 22bd9b2..00c0315 100644
--- a/README.md
+++ b/README.md
@@ -2,14 +2,12 @@
You want to contribute?
-----------------------
-Perfect! Please **tell us in the [issue tracker](https://github.com/cgeo/c-geo-opensource/issues) before hacking** on your great new feature. It would be bad if you have implemented something great, but we can't include it because it doesn't fit the remaining architecture and code.
+Perfect! Please **tell us in the [issue tracker](https://github.com/cgeo/c-geo-opensource/issues) before hacking** on your great new feature. It would be bad if you have implemented something great, but we can't include it because it doesn't fit the remaining architecture and code. You might also want to chat with the developers on channel #cgeo on the freenode IRC network.
Get the source
--------------
-Fork the project source code on [github](https://github.com/cgeo/c-geo-opensource):
-
- git clone git://github.com/cgeo/c-geo-opensource.git
+Fork the [project source code](https://github.com/cgeo/c-geo-opensource), make changes to your clone and [create a pull request](https://help.github.com/articles/using-pull-requests) afterwards.
### Branches ###
@@ -25,7 +23,7 @@ Set up Eclipse
- Install an Eclipse distribution for your OS from http://eclipse.org/downloads/ (you may choose the Java developers distribution).
- Start Eclipse, choose any directory as workspace. Close the welcome screen, if it appears.
- After the workbench has started, select File | Import | Install | Install Software Items From File and select a locally downloaded copy of https://github.com/cgeo/c-geo-opensource/tree/master/main/project/eclipse%20installation/cgeo%20eclipse%20components.p2f. This way you can easily install all necessary plugins.
-- After forking the project you should import the two Eclipse projects in your workspace with File | Import | Projects from Git.
+- After forking the project you should import the Eclipse projects in your workspace with File | Import | Projects from Git.
Build
-----
@@ -67,19 +65,14 @@ or use the Ant view of Eclipse
### Debugging ###
-In Eclipse, create a Debug Configuration for an Android Application using the menu Run->Debug Configurations
+In Eclipse, create a Debug Configuration for an Android Application using the menu Run | Debug Configurations
### Testing ###
The Test classes can be found in the project cgeo-os-test. Test classes should be located in the same package as
the class under test.
-Every class can be "Run As" (or "Debug As") an "Android JUnit Test" from Eclipse.
-To run all tests use the test suite in CgeoTestSuite in package cgeo.geocaching.test.
-Further information can be found at http://developer.android.com/guide/topics/testing/testing_android.html
-
-### Code coverage / Emma ###
-
-A code coverage report can be generated with Emma. A little how-to (German) can be found at http://www.blafoo.de/blog/index.php#param=id_32
+Every class can be "Run As" (or "Debug As") an [Android JUnit Test](http://developer.android.com/guide/topics/testing/testing_android.html) from Eclipse.
+To run all tests use the same "Run As" menu item from the context menu of the test project.
License
-------
diff --git a/main/.classpath b/main/.classpath
index 79a19e9..4fa313d 100644
--- a/main/.classpath
+++ b/main/.classpath
@@ -9,7 +9,7 @@
<classpathentry exported="true" kind="lib" path="libs/commons-lang3-3.1.jar"/>
<classpathentry kind="lib" path="libs/locus-api-4.0.jar"/>
<classpathentry kind="lib" path="libs/commons-collections-3.2.1.jar"/>
- <classpathentry kind="lib" path="libs/android-support-v4.jar"/>
+ <classpathentry kind="lib" path="libs/android-support-v4.jar" sourcepath="D:/Program Files (x86)/Android/android-sdk/extras/android/support/v4/src/java"/>
<classpathentry kind="lib" path="libs/mapsforge-map-0.3.0-jar-with-dependencies.jar"/>
<classpathentry kind="lib" path="libs/mapsforge-map-0.2.4.jar"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
diff --git a/main/res/layout/about_activity.xml b/main/res/layout/about_activity.xml
index 01b04e1..a872501 100644
--- a/main/res/layout/about_activity.xml
+++ b/main/res/layout/about_activity.xml
@@ -24,7 +24,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<LinearLayout
diff --git a/main/res/layout/edit_waypoint_activity.xml b/main/res/layout/edit_waypoint_activity.xml
index 7ea9cf5..92a8c75 100644
--- a/main/res/layout/edit_waypoint_activity.xml
+++ b/main/res/layout/edit_waypoint_activity.xml
@@ -31,7 +31,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<Button
diff --git a/main/res/layout/init.xml b/main/res/layout/init.xml
index 730e5b7..676eeca 100644
--- a/main/res/layout/init.xml
+++ b/main/res/layout/init.xml
@@ -21,7 +21,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<!-- ** -->
<RelativeLayout style="@style/separator_horizontal_layout" >
diff --git a/main/res/layout/search.xml b/main/res/layout/search.xml
index 45fb1e6..c3097db 100644
--- a/main/res/layout/search.xml
+++ b/main/res/layout/search.xml
@@ -32,8 +32,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="10dip"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<RelativeLayout style="@style/separator_horizontal_layout" >
diff --git a/main/res/layout/touch.xml b/main/res/layout/touch.xml
index 6a37726..37f7332 100644
--- a/main/res/layout/touch.xml
+++ b/main/res/layout/touch.xml
@@ -23,7 +23,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
diff --git a/main/res/layout/twitter_authorization_activity.xml b/main/res/layout/twitter_authorization_activity.xml
index dadac5a..4238534 100644
--- a/main/res/layout/twitter_authorization_activity.xml
+++ b/main/res/layout/twitter_authorization_activity.xml
@@ -25,7 +25,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<TextView
diff --git a/main/res/layout/visit.xml b/main/res/layout/visit.xml
index fde4cd3..bca9851 100644
--- a/main/res/layout/visit.xml
+++ b/main/res/layout/visit.xml
@@ -23,7 +23,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
diff --git a/main/res/layout/visit_image.xml b/main/res/layout/visit_image.xml
index 0b18f8f..b4e7a0f 100644
--- a/main/res/layout/visit_image.xml
+++ b/main/res/layout/visit_image.xml
@@ -35,7 +35,6 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
android:orientation="vertical" >
<RelativeLayout style="@style/separator_horizontal_layout" >
diff --git a/main/res/values-cs/strings.xml b/main/res/values-cs/strings.xml
index dba7430..246407e 100644
--- a/main/res/values-cs/strings.xml
+++ b/main/res/values-cs/strings.xml
@@ -82,12 +82,13 @@
<string name="log_tb_drop">Nechat zde</string>
<string name="log_tb_changeall">Změnit vše</string>
<string name="log_save">Uložit</string>
- <string name="log_saving">Ukládání logu</string>
+ <string name="log_saving">Ukládání zápisu</string>
+ <string name="log_saving_and_uploading">Odesílám zápis a nahrávám obrázek…</string>
<string name="log_clear">Vyčistit</string>
- <string name="log_post">Odeslat log</string>
- <string name="log_post_rate">Odeslat log a hlasovat</string>
- <string name="log_post_no_rate">Odeslat log a nehlasovat</string>
- <string name="log_post_not_possible">Načítám logovací stránku…</string>
+ <string name="log_post">Odeslat zápis</string>
+ <string name="log_post_rate">Odeslat zápis a hlasovat</string>
+ <string name="log_post_no_rate">Odeslat zápis a nehlasovat</string>
+ <string name="log_post_not_possible">Načítám stránku pro zápis…</string>
<string name="log_add">Přidat</string>
<string name="log_rating">Hlasovat</string>
<string name="log_no_rating">Nehlasovat</string>
@@ -110,12 +111,19 @@
<string name="log_stars_45_description">Velmi dobrá</string>
<string name="log_stars_5_description">Vynikající</string>
<string name="log_webcam">Vyfocen webkamerou</string>
- <string name="log_new_log">Log</string>
- <string name="log_new_log_text">Text logu</string>
+ <string name="log_new_log">Zápis</string>
+ <string name="log_new_log_text">Text zápisu</string>
<string name="log_announcement">Oznámení</string>
<string name="log_today">Dnes</string>
<string name="log_yesterday">Včera</string>
<string name="log_smilies">Smajlíci</string>
+ <string name="log_image">Obrázek</string>
+ <string name="log_image_attach">Připojit obrázek</string>
+ <string name="log_image_edit">Upravit obrázek</string>
+ <string name="log_image_stored">Existující</string>
+ <string name="log_image_camera">Nový</string>
+ <string name="log_image_caption">Titulek</string>
+ <string name="log_image_description">Popis</string>
<!-- translation -->
<string name="translate_to_sys_lang">Překlad do jazyka %s</string>
@@ -125,7 +133,7 @@
<!-- errors -->
<string name="err_none">ok</string>
<string name="err_start">komunikace nezačala</string>
- <string name="err_parse">selhalo čtení logovací stránky</string>
+ <string name="err_parse">selhalo čtení stránky pro zápis</string>
<string name="err_server">selhalo připojení k serveru Geocaching.com (server umřel?)</string>
<string name="err_login">nejsou uložené žádné přihlašovací údaje</string>
<string name="err_login_failed">promiňte, ale c:geo se nemůže přihlásit.</string>
@@ -164,7 +172,9 @@
<string name="err_location_unknown">c:geo nezná souřadnice keše</string>
<string name="err_missing_device_name">Prosím zadejte název zařízení před registrací.</string>
<string name="err_favorite_failed">Označení oblíbenosti keše selhalo.</string>
-
+ <string name="err_select_logimage_failed">Výběr obrázku pro zápis selhal.</string>
+ <string name="err_aquire_image_failed">Získání obrázku selhalo.</string>
+
<string name="err_tb_display">"C:geo nemůže zobrazit sledovatelný předmět. Je to opravdu sledovatelný předmět?</string>
<string name="err_tb_details_open">C:geo nemůže otevřít podrobnosti ke sledovatelnému předmětu.</string>
<string name="err_tb_forgot_saw">C:geo zapomělo, který sledovatelný předmět jste prohlíželi.</string>
@@ -179,11 +189,12 @@
<string name="err_point_bear_and_dist_title">Potřebujete poradit?</string>
<string name="err_point_bear_and_dist">Vyplňte jak směru a vzdálenosti. Úhel je úhel 0 &#8211; 360 stupňů vzhledem k severu. Vzdálenost s nebo bez jednotek.</string>
<string name="err_point_location_error">c:geo nemůže získat polohu bodu cesty.</string>
- <string name="err_log_load_data">c:geo nemůže načíst data potřebná pro zalogování návštěvy.</string>
- <string name="err_log_load_data_again">c:geo nemůže načíst data potřebná pro zalogování návštěvy. Zkouší to znovu.</string>
- <string name="err_log_load_data_still">c:geo stále načítá data potřebná pro zalogování návštěvy. Prosím počkejte chvilku.</string>
- <string name="err_log_failed_server">c:geo nemohlo odeslat log, protože server neodpovídá.</string>
- <string name="err_log_post_failed">c:geo nemohlo odeslat log.</string>
+ <string name="err_log_load_data">c:geo nemůže načíst data potřebná pro zapsání návštěvy.</string>
+ <string name="err_log_load_data_again">c:geo nemůže načíst data potřebná pro zapsání návštěvy. Zkouší to znovu.</string>
+ <string name="err_log_load_data_still">c:geo stále načítá data potřebná pro zapsání návštěvy. Prosím počkejte chvilku.</string>
+ <string name="err_log_failed_server">c:geo nemohlo odeslat zápis, protože server neodpovídá.</string>
+ <string name="err_log_post_failed">c:geo nemohlo odeslat zápis.</string>
+ <string name="err_logimage_post_failed">Zdá se, že obrázek nebyl nahrán. Zkontrolujte to prosím na Geocaching.com.</string>
<string name="err_search_address_forgot">c:geo zapomělo adresu, kterou se pokoušíte najít.</string>
<string name="err_parse_lat">c:geo nemůže dopočítat zeměpisnou šířku.</string>
<string name="err_parse_lon">c:geo nemůže dopočítat zeměpisnou délku.</string>
@@ -200,18 +211,19 @@
<string name="warn_search_help_keyword">Zadejte slovo, které je použito v názvu keše, kterou se pokoušíte najít.</string>
<string name="warn_search_help_user">Zadejte jméno uživatele z Geocaching.com.</string>
<string name="warn_search_help_tb">Zadejte kód trackable. Například \"TB29QMZ\".</string>
- <string name="warn_log_text_fill">prosím vyplňte nějaký text do logu.</string>
+ <string name="warn_log_text_fill">prosím vyplňte nějaký text do zápisu.</string>
<string name="warn_load_images">c:geo nemohlo načíst obrázky.</string>
<string name="warn_invalid_mapfile">Vybraný soubor není platným souborem mapsforge verze 0.3.0.\nOffline nejsou k dispozici.</string>
<string name="warn_deprecated_mapfile">Používáte zastaralou verzi(0.2.4) mapsforge offline mapového souboru souboru 0.2.4 map file.\nZvažte stažení nové verze pro mapsforge 0.3.0 map.\nPodpora map pro verzi 0.2.4 bude ukončena příštím vydáním aplikace.</string>
<string name="warn_nonexistant_mapfile">Vybraný mapový soubor neexistuje.\nOffline mapy nejsou k dispozici.</string>
<string name="warn_rendertheme_missing">Téma pro mapu není k dispozici.</string>
- <string name="info_log_posted">c:geo úspěšně zaslalo log.</string>
- <string name="info_log_saved">c:geo úspěšně uložilo log.</string>
- <string name="info_log_cleared">Log byl vyprázdněn.</string>
- <string name="info_log_type_changed">Typ logu byl změněn!</string>
-
+ <string name="info_log_posted">c:geo úspěšně zaslalo zápis.</string>
+ <string name="info_log_saved">c:geo úspěšně uložilo zápis.</string>
+ <string name="info_log_cleared">Zápis byl vyprázdněn.</string>
+ <string name="info_log_type_changed">Typ zápisu byl změněn!</string>
+ <string name="info_select_logimage_cancelled">Výběr nebo focení obrázku pro zápis bylo zrušeno.</string>
+ <string name="info_stored_image">Nový obrázek uložen do:</string>
<string name="info_storing_static_maps">Zkouším uložit statické mapy</string>
<!-- location service -->
@@ -306,7 +318,9 @@
<string name="caches_filter_modified">S upravenými souřadnicemi</string>
<string name="caches_filter_origin">Původ</string>
<string name="caches_removing_from_history">Mažu z Historie…</string>
-
+ <string name="caches_clear_offlinelogs">Smaž offline zápisy</string>
+ <string name="caches_clear_offlinelogs_progress">Mažu offline zápisy</string>
+
<!-- caches lists -->
<string name="list_menu">Seznam</string>
<string name="list_menu_create">Vytvoř nový seznam</string>
@@ -340,6 +354,7 @@
<!-- init -->
<string name="init_geocaching">Geocaching.com</string>
+ <string name="init_gc_activate">Aktivuj Geocaching.com na živé mapě a v hledání</string>
<string name="init_oc">opencaching.de</string>
<string name="init_oc_activate">Aktivuj opencaching.de na živé mapě a v hledání</string>
<string name="init_oc_username_description">Vložte svůj přístup na opencaching.de pro povolení možnosti označovat nálezy.</string>
@@ -360,7 +375,7 @@
<string name="init_signature">Podpis</string>
<string name="init_signature_help_button">Návod</string>
<string name="init_signature_help_title">Tipy a triky k podpisu</string>
- <string name="init_signature_help_text">Zde vložte svůj podpis k použití při logování.\nSpeciální řetězce, které můžete použít: [DATE] , [TIME], [DATETIME], [USER] a [NUMBER].\nTyto budou nahrazeny v okamžiku vložení podpisu do logu.</string>
+ <string name="init_signature_help_text">Zde vložte svůj podpis k použití při zápisech.\nSpeciální řetězce, které můžete použít: [DATE] , [TIME], [DATETIME], [USER] a [NUMBER].\nTyto budou nahrazeny v okamžiku vložení podpisu do zápisu.</string>
<string name="init_signature_template_button">Vlož šablonu</string>
<string name="init_signature_template_date">Datum</string>
<string name="init_signature_template_time">Čas</string>
@@ -372,7 +387,7 @@
<string name="init_ratingwanted">Načti hodnocení keše z GCvote.com</string>
<string name="init_elevationwanted">Načti výšková data ke keši</string>
- <string name="init_friendlogswanted">Načti extra navíc stránku logbooku s logy kamarádů.</string>
+ <string name="init_friendlogswanted">Načti extra navíc stránku logbooku se zápisy kamarádů.</string>
<string name="init_openlastdetailspage">Otevři detaily na naposledy použité stránce.</string>
<string name="init_autoload">Automaticky načti dlouhý popis</string>
<string name="init_other">Další možnosti</string>
@@ -381,14 +396,14 @@
<string name="init_captcha">Ukaž CAPTCHA obrázek, pokud je třeba. (jen Basic Member)</string>
<string name="init_useenglish">Používej angličtinu pro c:geo (vyžaduje restart)</string>
<string name="init_exclude">Nezobrazovat vlastní a nalezené keše</string>
- <string name="init_showwaypoints">Zobrazuj waypointy na živé mapě</string>
+ <string name="init_showwaypoints">Zobrazuj waypointy na mapě</string>
<string name="init_showwaypoint_description">Pokud je na mapě zobrazeno méně než zadaný počet keší, zobrazují se i jejich waypointy.</string>
- <string name="init_disabled">Nezobrazovat zrušené keše</string>
+ <string name="init_disabled">Nezobrazovat deaktivované keše</string>
<string name="init_offline">Ukládat mapy pro offline použití</string>
<string name="init_offline_wp">Ukládat statické mapy k waypointům pro offline použití</string>
- <string name="init_save_log_img">Ulož obrázky z logů</string>
+ <string name="init_save_log_img">Ulož obrázky ze zápisů</string>
<string name="init_units">Používat imperiální jednotky vzdálenosti</string>
- <string name="init_log_offline">Offline logování\n(Při logování nezobrazovat online logovací obrazovku a neodesílat log na server)</string>
+ <string name="init_log_offline">Offline zápisy\n(Při zapisování nezobrazovat online zápisovou obrazovku a neodesílat zápisy na server)</string>
<string name="init_choose_list">Zeptat se na seznam pro uložení keše</string>
<string name="init_livelist">Zobrazovat směr v seznamu keší</string>
<string name="init_altitude">Výšková korekce</string>
@@ -436,7 +451,7 @@
<string name="init_dbmove_running">Přesouvám databázi</string>
<string name="init_dbmove_success">Databáze byla úspěšně přesunuta.</string>
<string name="init_dbmove_failed">Přesun databáze se nezdařil.</string>
- <string name="init_plain_logs">Zobrazuj logy s barvami</string>
+ <string name="init_plain_logs">Zobrazuj zápisy s barvami</string>
<string name="init_use_native_ua">Tvářit se jako webový prohlížeč. Řeší problémy v některých sítích.</string>
<string name="init_rendertheme_folder">Složka s tématy map (nepovinné)</string>
@@ -493,9 +508,9 @@
<string name="cache_premium">placený účet</string>
<string name="cache_attributes">atributy</string>
<string name="cache_inventory">Inventář</string>
- <string name="cache_log_offline">offline log</string>
- <string name="cache_log_images_loading">Načítám obrázky z logů…</string>
- <string name="cache_log_images_title">Obrázky z logů</string>
+ <string name="cache_log_offline">Offline zápis</string>
+ <string name="cache_log_images_loading">Načítám obrázky ze zápisů…</string>
+ <string name="cache_log_images_title">Obrázky ze zápisů</string>
<string name="cache_log_image_default_title">Fotografie</string>
<string name="cache_personal_note">Osobní poznámka</string>
<string name="cache_personal_note_edit">Upravit</string>
@@ -574,10 +589,10 @@
<string name="cache_menu_oruxmaps">OruxMaps</string>
<string name="cache_menu_cachebeacon">Cache Beacon</string>
<string name="cache_status">Status</string>
- <string name="cache_status_offline_log">Připravený log</string>
+ <string name="cache_status_offline_log">Připravený zápis</string>
<string name="cache_status_found">Nalezena</string>
<string name="cache_status_archived">Archivována</string>
- <string name="cache_status_disabled">Zrušena</string>
+ <string name="cache_status_disabled">Deaktivována</string>
<string name="cache_status_premium">Pouze pro platící uživatele</string>
<string name="cache_status_not_premium">Přístupná všem uživatelům</string>
<string name="cache_geocode">GC kód</string>
@@ -601,7 +616,7 @@
<string name="cache_spoiler_images_loading">Načítám obrázky s nápovědou…</string>
<string name="cache_images_title">Obrázky</string>
<string name="cache_images_loading">Načítám obrázky…</string>
- <string name="cache_log_types">Typy záznamů</string>
+ <string name="cache_log_types">Typy zápisů</string>
<string name="cache_coordinates_no">Tato keš nemá souřadnice.</string>
<string name="cache_clear_history">Vymazat historii</string>
<string name="cache_remove_from_history">Vymazat z historie</string>
@@ -671,6 +686,7 @@
<string name="waypoint_edit_title">Úprava bodu trasy</string>
<string name="waypoint_add_title">Nový bod trasy</string>
<string name="waypoint_note">Poznámka</string>
+ <string name="waypoint_visited">Navštíven</string>
<string name="waypoint_save">Uložit</string>
<string name="waypoint_loading">Načítání bodu trasy…</string>
<string name="waypoint_do_not_touch_cache_coordinates">Neměnit souřadnice keše</string>
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index 1737aef..87086ef 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -84,6 +84,7 @@
<string name="log_tb_changeall">Alle ändern</string>
<string name="log_save">Speichern</string>
<string name="log_saving">Log wird gesendet…</string>
+ <string name="log_saving_and_uploading">Log und Bild werden gesendet…</string>
<string name="log_clear">Leeren</string>
<string name="log_post">Loggen</string>
<string name="log_post_rate">Loggen &amp; bewerten</string>
@@ -117,6 +118,13 @@
<string name="log_today">Heute</string>
<string name="log_yesterday">Gestern</string>
<string name="log_smilies">Smilies</string>
+ <string name="log_image">Bild</string>
+ <string name="log_image_attach">Bild hinzufügen</string>
+ <string name="log_image_edit">Bild bearbeiten</string>
+ <string name="log_image_stored">Vorhanden</string>
+ <string name="log_image_camera">Neu</string>
+ <string name="log_image_caption">Überschrift</string>
+ <string name="log_image_description">Beschreibung</string>
<!-- translation -->
<string name="translate_to_sys_lang">Übersetze in %s</string>
@@ -309,6 +317,8 @@
<string name="caches_filter_modified">Mit geänderten Koordinaten</string>
<string name="caches_filter_origin">Herkunft</string>
<string name="caches_removing_from_history">Lösche aus Verlauf…</string>
+ <string name="caches_clear_offlinelogs">Offline-Logs löschen</string>
+ <string name="caches_clear_offlinelogs_progress">Lösche Offline-Logs</string>
<!-- caches lists -->
<string name="list_menu">Liste</string>
@@ -382,7 +392,7 @@
<string name="init_captcha">Zeige CAPTCHA wenn notwendig (nur Basic Member)</string>
<string name="init_useenglish">c:geo auf Englisch nutzen (Neustart erforderlich)</string>
<string name="init_exclude">Eigene und gefundene Caches ausblenden</string>
- <string name="init_showwaypoints">Wegpunkte auf Live-Karte zeigen</string>
+ <string name="init_showwaypoints">Wegpunkte auf Karte zeigen</string>
<string name="init_showwaypoint_description">Wenn weniger als die angegebene Anzahl an Caches auf der Karte sichtbar sind, werden zusätzlich deren Wegpunkte angezeigt.</string>
<string name="init_disabled">Deaktivierte Caches ausblenden</string>
<string name="init_offline">Statische Karten zum Cache für Offline-Verwendung speichern</string>
@@ -666,6 +676,7 @@
<string name="waypoint_edit_title">Wegpunkt bearbeiten</string>
<string name="waypoint_add_title">Wegpunkt hinzufügen</string>
<string name="waypoint_note">Notiz</string>
+ <string name="waypoint_visited">Besucht</string>
<string name="waypoint_save">Speichern</string>
<string name="waypoint_loading">Lade Wegpunkt…</string>
<string name="waypoint_do_not_touch_cache_coordinates">Cache-Koordinaten nicht ändern</string>
diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml
index b229b6c..cfe144a 100644
--- a/main/res/values-fr/strings.xml
+++ b/main/res/values-fr/strings.xml
@@ -370,7 +370,7 @@
<string name="init_useenglish">Utiliser l\'anglais dans c:geo\n(redémarrage nécessaire)</string>
<string name="init_exclude">Exclure mes caches et les caches trouvées</string>
<string name="init_showwaypoints">Points intermédiaires</string>
- <string name="init_showwaypoint_description">Nombre de caches en-dessous duquel les points intermédiaires sont affichés sur la carte active.</string>
+ <string name="init_showwaypoint_description">Nombre de caches en-dessous duquel les points intermédiaires sont affichés sur la carte.</string>
<string name="init_disabled">Exclure les caches désactivées</string>
<string name="init_offline">Enregistrer les cartes pour une utilisation hors ligne</string>
<string name="init_offline_wp">Enregistrer les cartes autour des points intermédiaires pour une utilisation hors ligne</string>
diff --git a/main/res/values-ja/strings.xml b/main/res/values-ja/strings.xml
index 050bb36..126a03c 100644
--- a/main/res/values-ja/strings.xml
+++ b/main/res/values-ja/strings.xml
@@ -383,7 +383,7 @@
<string name="init_captcha">必要ならCAPTCHAを表示(ベーシック会員のみ)</string>
<string name="init_useenglish">英語表示\n(c:geoの再起動が必要)</string>
<string name="init_exclude">自分で所有または見つけたキャッシュは除く</string>
- <string name="init_showwaypoints">オンライン地図でウェイポイントの表示</string>
+ <string name="init_showwaypoints">地図でウェイポイントの表示</string>
<string name="init_showwaypoint_description">地図に表示されてるキャッシュ数が入力した数より少ない場合にはウェイポイントも地図に表示します。</string>
<string name="init_disabled">無効化キャッシュは除く</string>
<string name="init_offline">オフライン用にキャッシュの地図を保存</string>
diff --git a/main/res/values-nl/strings.xml b/main/res/values-nl/strings.xml
index 15a1815..729c382 100644
--- a/main/res/values-nl/strings.xml
+++ b/main/res/values-nl/strings.xml
@@ -385,8 +385,8 @@
<string name="init_captcha">Laat CAPTCHA zien indien noodzakelijk</string>
<string name="init_useenglish">Use English inside c:geo\n(restart needed)</string>
<string name="init_exclude">Eigen en gevonden caches uitsluiten</string>
- <string name="init_showwaypoints">Laat waypoints zien in live map</string>
- <string name="init_showwaypoint_description">Level vanaf wanneer waypoints weergegeven worden in de live map.</string>
+ <string name="init_showwaypoints">Laat waypoints zien in map</string>
+ <string name="init_showwaypoint_description">Level vanaf wanneer waypoints weergegeven worden in de map.</string>
<string name="init_disabled">Uitgeschakelde caches uitsluiten</string>
<string name="init_offline">Kaarten opslaan voor gebruik zonder verbinding</string>
<string name="init_offline_wp">Statische kaarten van waipoints opslaan voor gebruik zonder verbinding</string>
diff --git a/main/res/values-pl/strings.xml b/main/res/values-pl/strings.xml
index 0a9e96f..b5328c4 100644
--- a/main/res/values-pl/strings.xml
+++ b/main/res/values-pl/strings.xml
@@ -379,7 +379,7 @@
<string name="init_captcha">Pokaż CAPTCHA w razie potrzeby (tylko użytkownicy Basic)</string>
<string name="init_useenglish">Użyj języka angielskiego wewnątrz c:geo\n(wymaga restartu)</string>
<string name="init_exclude">Wyklucz własne lub już znalezione skrzynki</string>
- <string name="init_showwaypoints">Pokaż punkty nawigacji na mapie Live</string>
+ <string name="init_showwaypoints">Pokaż punkty nawigacji na mapie</string>
<string name="init_showwaypoint_description">Jeśli mniej niż podana liczba skrzynek wyświetlana jest na mapie, ich punkty nawigacji są dodatkowo wyświetlane.</string>
<string name="init_disabled">Wyklucz tymczasowo niedostępne skrzynki</string>
<string name="init_offline">Zapisuj mapy statyczne skrzynek do użytku offline</string>
diff --git a/main/res/values-pt/strings.xml b/main/res/values-pt/strings.xml
index 6bca8c6..5f67281 100644
--- a/main/res/values-pt/strings.xml
+++ b/main/res/values-pt/strings.xml
@@ -373,7 +373,7 @@
<string name="init_captcha">Mostrar CAPTCHA se necessário</string>
<string name="init_useenglish">Utilizar inglês no c:geo\n(necessário reiniciar)</string>
<string name="init_exclude">Excluir caches encontradas e minhas</string>
- <string name="init_showwaypoints">Mostrar Waypoints no mapa ao vivo</string>
+ <string name="init_showwaypoints">Mostrar Waypoints no mapa</string>
<string name="init_showwaypoint_description">Se menos do que o número de caches encontradas são mostradas no mapa, os seus waypoints são mostrados adicionalmente.</string>
<string name="init_disabled">Excluir caches desactivadas</string>
<string name="init_offline">Armazenar a cache de mapas estáticos para utilização offline</string>
diff --git a/main/res/values-sk/strings.xml b/main/res/values-sk/strings.xml
index 3b5c509..cef88d4 100644
--- a/main/res/values-sk/strings.xml
+++ b/main/res/values-sk/strings.xml
@@ -373,8 +373,8 @@
<string name="init_captcha">Zobraziť CAPTCHA, ak je to potrebné</string>
<string name="init_useenglish">Používať angličtinu v c:geo\n(vyžaduje reštart)</string>
<string name="init_exclude">Nezobrazovať vlastné a nájdené skrýše</string>
- <string name="init_showwaypoints">Body trasy na aktívnej mape</string>
- <string name="init_showwaypoint_description">Úroveň, od ktorej zobraziť body trasy na aktívnej mape.</string>
+ <string name="init_showwaypoints">Body trasy na mape</string>
+ <string name="init_showwaypoint_description">Úroveň, od ktorej zobraziť body trasy na mape.</string>
<string name="init_disabled">Nezobrazovať zrušené skrýše</string>
<string name="init_offline">Ukladať mapy pre použitie offline</string>
<string name="init_offline_wp">Uložiť statické mapy bodov strás pre použitie offline</string>
diff --git a/main/res/values-sv/strings.xml b/main/res/values-sv/strings.xml
index b2d2ada..d3be9ff 100644
--- a/main/res/values-sv/strings.xml
+++ b/main/res/values-sv/strings.xml
@@ -85,6 +85,7 @@
<string name="log_tb_changeall">Ändra alla</string>
<string name="log_save">Spara</string>
<string name="log_saving">Sparar logg…</string>
+ <string name="log_saving_and_uploading">Sparar logg och laddar upp bild…</string>
<string name="log_clear">Rensa</string>
<string name="log_post">Posta logg</string>
<string name="log_post_rate">Posta logg &amp; ge betyget</string>
@@ -118,6 +119,13 @@
<string name="log_today">Idag</string>
<string name="log_yesterday">Igår</string>
<string name="log_smilies">Smileys</string>
+ <string name="log_image">Bild</string>
+ <string name="log_image_attach">Lägg till bild</string>
+ <string name="log_image_edit">Redigera bild</string>
+ <string name="log_image_stored">Från fil</string>
+ <string name="log_image_camera">Ny</string>
+ <string name="log_image_caption">Bildtext</string>
+ <string name="log_image_description">Beskrivning</string>
<!-- translation -->
<string name="translate_to_sys_lang">Översätt till %s</string>
@@ -138,6 +146,7 @@
<string name="err_wrong">Felaktiga inloggningsuppgifter</string>
<string name="err_maintenance">Arbete pågår med servern Geocaching.com. c:geo fungerar under tiden i offline läge med sparade cacher.</string>
<string name="err_license">Du har inte bekräftat licensavtalet med Geocaching.com, så c:geo kan inte läsa in koordinater för cacherna.</string>
+ <string name="err_unvalidated_account">Du måste verifiera ditt konto på Geocaching.com\'s hemsida först.</string>
<string name="err_unpublished">Den sökta cachen är opubliserad.</string>
<string name="err_premium_only">Cachen är enbart för premium medlemmar på Geocaching.com.</string>
<string name="err_detail_open">Tyvärr kan c:geo inte visa detaljer om geocachen.</string>
@@ -166,6 +175,8 @@
<string name="err_missing_device_name">Vänligen ange ett namn för din enhet innan registering.</string>
<string name="err_favorite_failed">Misslyckades att ändra favoritstatus.</string>
+ <string name="err_select_logimage_failed">Misslyckades att välja bild till loggen.</string>
+ <string name="err_aquire_image_failed">Hämtning av bilden misslyckades.</string>
<string name="err_tb_display">Tyvärr kan c:geo inte visa den trackable du önskar. Är den verkligen trackable?</string>
<string name="err_tb_details_open">Tyvärr kan c:geo inte öppna detaljer för trackable.</string>
<string name="err_tb_forgot_saw">Tyvärr glömde c:geo vilken trackable du såg.</string>
@@ -187,6 +198,7 @@
<string name="err_log_load_data_still">c:geo laddar fortfarande data för att kunna posta loggen. Vänligen vänta en stund till.</string>
<string name="err_log_failed_server">Tyvärr misslyckades c:geo att posta loggen eftersom servern inte svarade.</string>
<string name="err_log_post_failed">Tyvärr misslyckades c:geo att posta loggen.</string>
+ <string name="err_logimage_post_failed">Det verkar som om din bild till loggen inte kunde laddas upp. Vänligen kontrollera den på Geocaching.com.</string>
<string name="err_search_address_forgot">Tyvärr glömde c:geo adressen du sökte efter.</string>
<string name="err_parse_lat">Tyvärr kan c:geo inte tolka latitud.</string>
@@ -216,6 +228,8 @@
<string name="info_log_saved">c:geo har sparat din logg.</string>
<string name="info_log_cleared">Loggen har rensats.</string>
<string name="info_log_type_changed">Typen av logg har ändrats!</string>
+ <string name="info_select_logimage_cancelled">Val av bild avbröts.</string>
+ <string name="info_stored_image">Ny bild sparad som:</string>
<string name="info_storing_static_maps">Försöker ladda ner statiska kartor</string>
@@ -268,6 +282,7 @@
<string name="caches_sort_size">Storlek</string>
<string name="caches_sort_favorites">Favoriter</string>
<string name="caches_sort_name">Namn</string>
+ <string name="caches_sort_geocode">Geo kod</string>
<string name="caches_sort_rating">Betyg (GC-vote)</string>
<string name="caches_sort_vote">Betyg (eget)</string>
<string name="caches_sort_inventory">Antal trackable</string>
@@ -306,7 +321,10 @@
<string name="caches_filter_track">Med trackables</string>
<string name="caches_filter_clear">Rensa filter</string>
<string name="caches_filter_modified">Med tillagda koordinater</string>
+ <string name="caches_filter_origin">Ursprung</string>
<string name="caches_removing_from_history">Tar bort från historik…</string>
+ <string name="caches_clear_offlinelogs">Rensa offline loggar</string>
+ <string name="caches_clear_offlinelogs_progress">Rensar offline loggar</string>
<!-- caches lists -->
<string name="list_menu">Listor</string>
@@ -341,6 +359,7 @@
<!-- init -->
<string name="init_geocaching">Geocaching.com</string>
+ <string name="init_gc_activate">Aktivera Geocaching.com i live-kartor och sökningar</string>
<string name="init_oc">opencaching.de</string>
<string name="init_oc_activate">Aktivera opencaching.de i live-kartor och sökningar</string>
<string name="init_oc_username_description">Ange användarnamn till opencaching.de för att kunna markera dina hittade cacher.</string>
@@ -381,14 +400,15 @@
<string name="init_captcha">Visa CAPTCHA (robotfällor) vid behov (enbart för Basic Member)</string>
<string name="init_useenglish">Använd engelska i c:geo (kräver omstart)</string>
<string name="init_exclude">Dölj egna och hittade cacher</string>
- <string name="init_showwaypoints">Extra punkter på Live kartan</string>
- <string name="init_showwaypoint_description">Gräns för antal cacher där extra punkter (parkering eller tillagd lösning) börjar visas i Live kartan. Bör vara mellan 5 och 50.</string>
+ <string name="init_showwaypoints">Extra punkter på kartan</string>
+ <string name="init_showwaypoint_description">Gräns för antal cacher där extra punkter (parkering eller tillagd lösning) börjar visas i kartan. Bör vara mellan 5 och 50.</string>
<string name="init_disabled">Dölj inaktiva cacher</string>
<string name="init_offline">Spara kartor för cacher för användning offline</string>
<string name="init_offline_wp">Spara kartor för extra punkter för användning offline</string>
<string name="init_save_log_img">Spara bilder från loggar</string>
<string name="init_units">Använd amerikanska enheter för avstånd</string>
<string name="init_log_offline">Vid loggning: spara bara loggen lokalt (visa inte loggningfönster och skicka inte loggen till gc.com)</string>
+ <string name="init_choose_list">Fråga efter lista när cacher sparas</string>
<string name="init_livelist">Visa riktning till cacher i listan</string>
<string name="init_altitude">Höjd justering</string>
<string name="init_altitude_description">Det är möjligt att justera höjden över havet om din GPS visar fel. Detta görs med ett positivt eller negativt tal, angivet i meter.</string>
@@ -508,6 +528,9 @@
<string name="cache_favpoint_not_on">Den här cachen är inte en av dina favoriter.</string>
<string name="cache_favpoint_add">Lägg till</string>
<string name="cache_favpoint_remove">Ta bort</string>
+ <string name="cache_list_text">Lista:</string>
+ <string name="cache_list_change">Flytta</string>
+ <string name="cache_list_unknown">Ej i någon lista</string>
<string name="cache_images">Bilder</string>
<string name="cache_waypoints">Punkter</string>
@@ -605,6 +628,7 @@
<string name="cache_image_open_browser">Öppna i webbläsare</string>
<string name="cache_share_field">Dela</string>
<string name="cache_time_full_hours">prick</string>
+ <string name="cache_listed_on">Listad på %s</string>
<!-- editor dialog -->
<string name="editor_save">Spara</string>
@@ -665,6 +689,7 @@
<string name="waypoint_edit_title">Redigera punkt</string>
<string name="waypoint_add_title">Lägg till punkt</string>
<string name="waypoint_note">Kommentar</string>
+ <string name="waypoint_visited">Besökt</string>
<string name="waypoint_save">Spara</string>
<string name="waypoint_loading">Laddar punkt…</string>
<string name="waypoint_do_not_touch_cache_coordinates">Ingen förändring av cachens koordinater</string>
@@ -676,6 +701,7 @@
<string name="waypoint_reset">Återställ</string>
<string name="waypoint_localy_reset_cache_coords">Återställ koordinaterna i c:geo</string>
<string name="waypoint_reset_local_and_remote_cache_coords">Återställ i c:geo och på hemsidan</string>
+ <string name="waypoint_being_saved">Punkten sparas…</string>
<string name="waypoint_coordinates_couldnt_be_modified_on_website">Hemsidan kan inte hantera att ändra cachens koordinater.</string>
<string name="waypoint_coordinates_upload_error">Ett fel inträffade när koordinaterna skulle ändras på hemsidan.</string>
<string name="waypoint_coordinates_uploading_to_website">Laddar upp koordinaterna %s till hemsidan.</string>
@@ -727,6 +753,8 @@
<string name="search_coordinates_button">Sök med koordinater</string>
<string name="search_address">Adress</string>
<string name="search_address_button">Sök med adress</string>
+ <string name="search_geo">Geo kod</string>
+ <string name="search_geo_button">Sök med geo kod</string>
<string name="search_kw">Nyckelord</string>
<string name="search_kw_prefill">Nyckelord</string>
<string name="search_kw_button">Sök med nyckelord</string>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 2053e14..8761ea4 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -323,6 +323,8 @@
<string name="caches_filter_modified">With modified coordinates</string>
<string name="caches_filter_origin">Origin</string>
<string name="caches_removing_from_history">Removing from History…</string>
+ <string name="caches_clear_offlinelogs">Clear offline logs</string>
+ <string name="caches_clear_offlinelogs_progress">Clearing offline logs</string>
<!-- caches lists -->
<string name="list_menu">List</string>
@@ -357,6 +359,7 @@
<!-- init -->
<string name="init_geocaching">Geocaching.com</string>
+ <string name="init_gc_activate">Activate Geocaching.com on live-map and in searches</string>
<string name="init_oc">opencaching.de</string>
<string name="init_oc_activate">Activate opencaching.de on live-map and in searches</string>
<string name="init_oc_username_description">Enter your opencaching.de user name in order to allow marking your finds.</string>
@@ -397,7 +400,7 @@
<string name="init_captcha">Show CAPTCHA if necessary (only Basic Member)</string>
<string name="init_useenglish">Use English language for c:geo\n(Restart needed)</string>
<string name="init_exclude">Exclude own and found caches</string>
- <string name="init_showwaypoints">Show Waypoints on Live map</string>
+ <string name="init_showwaypoints">Show Waypoints on map</string>
<string name="init_showwaypoint_description">If less than the given amount of caches are displayed on the map, their waypoints are shown additionally.</string>
<string name="init_disabled">Exclude disabled caches</string>
<string name="init_offline">Store cache static maps for offline use</string>
diff --git a/main/res/values/strings_not_translatable.xml b/main/res/values/strings_not_translatable.xml
index ec330ad..83f0e9f 100644
--- a/main/res/values/strings_not_translatable.xml
+++ b/main/res/values/strings_not_translatable.xml
@@ -82,25 +82,30 @@
<string name="changelog" translatable="false">\n
<b>Next release</b>\n\n
<b>New Features/Functions:</b>\n
+ · Support of attaching pictures to logs\n
· Support of opencaching.de online API in live map and nearby search\n
· Support for searching opencaching.nl caches\n
· Alphabetical sorting of OSM:Offline maps in map selection\n
· Color markers also in trackable logbook\n
· Edit cache type filter by clicking on filter bar\n
· Inverse sorting of cache lists (hit the same menu again)\n
- · View pager in trackable activity\n
+ · View pager for trackable activity\n
· Menu item to delete past events\n
- · Settings: Option to ask for list to store caches in\n
+ · Settings: Option to ask for list to store caches\n
· Change list in cache details\n
· Ability to select \"All\" list from main screen\n
· Default log type for event caches will be \"Attended\" if \"Will attend\" was logged before\n
· Improved and extended cache type detection on live map\n
+ · Waypoints can be marked as visited\n
+ · Possibility to delete offline logs in lists\n
\n
<b>Bugfixing:</b>\n
· Final flag icon lost when updating cache with self defined final\n
· Bad selection in directory chooser\n
· Log type \"Retract Listing\" now parsed correctly\n
· Active cache detail page now remembered when rotating device\n
+ · Replaced the term \"GC-Code\" by \"Geocode\"\n
+ · Improvements for light theme\n
\n
<a href="https://github.com/cgeo/c-geo-opensource/issues?milestone=9&amp;state=closed">Detailed list of all changes</a>\n
\n
@@ -120,4 +125,4 @@
· Please refer to the release notes on the <a href="http://www.cgeo.org">c:geo-website</a>.\n
\n</string>
-</resources>
+</resources>
diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java
index e886dea..7f011fc 100644
--- a/main/src/cgeo/geocaching/EditWaypointActivity.java
+++ b/main/src/cgeo/geocaching/EditWaypointActivity.java
@@ -488,11 +488,18 @@ public class EditWaypointActivity extends AbstractActivity {
waypoint.setId(id);
Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS);
- if (null != cache && cache.addOrChangeWaypoint(waypoint, true)) {
+ if (cache == null) {
+ finishHandler.sendEmptyMessage(SAVE_ERROR);
+ return null;
+ }
+ Waypoint oldWaypoint = cache.getWaypointById(id);
+ if (cache.addOrChangeWaypoint(waypoint, true)) {
cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
- StaticMapsProvider.removeWpStaticMaps(id, geocode);
- if (Settings.isStoreOfflineWpMaps()) {
- StaticMapsProvider.storeWaypointStaticMap(cache, waypoint, false);
+ if (!StaticMapsProvider.hasAllStaticMapsForWaypoint(geocode, waypoint)) {
+ StaticMapsProvider.removeWpStaticMaps(oldWaypoint, geocode);
+ if (Settings.isStoreOfflineWpMaps()) {
+ StaticMapsProvider.storeWaypointStaticMap(cache, waypoint, false);
+ }
}
final RadioButton modifyLocal = (RadioButton) findViewById(R.id.modify_cache_coordinates_local);
final RadioButton modifyBoth = (RadioButton) findViewById(R.id.modify_cache_coordinates_local_and_remote);
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java
index 18a315c..9a8325d 100644
--- a/main/src/cgeo/geocaching/Geocache.java
+++ b/main/src/cgeo/geocaching/Geocache.java
@@ -516,13 +516,17 @@ public class Geocache implements ICache, IWaypoint {
}
public void openInBrowser(Activity fromActivity) {
- fromActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getCacheUrl())));
+ fromActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getBrowserCacheUrl())));
}
private String getCacheUrl() {
return getConnector().getCacheUrl(this);
}
+ private String getBrowserCacheUrl() {
+ return getConnector().getLongCacheUrl(this);
+ }
+
private IConnector getConnector() {
return ConnectorFactory.getConnector(this);
}
@@ -618,15 +622,27 @@ public class Geocache implements ICache, IWaypoint {
@Override
public String getHint() {
initializeCacheTexts();
+ assertTextNotNull(hint, "Hint");
return hint;
}
/**
+ * After lazy loading the lazily loaded field must be non {@code null}.
+ *
+ */
+ private static void assertTextNotNull(final String field, final String name) throws InternalError {
+ if (field == null) {
+ throw new InternalError(name + " field is not allowed to be null here");
+ }
+ }
+
+ /**
* Attention, calling this method may trigger a database access for the cache!
*/
@Override
public String getDescription() {
initializeCacheTexts();
+ assertTextNotNull(description, "Description");
return description;
}
@@ -635,7 +651,19 @@ public class Geocache implements ICache, IWaypoint {
*/
private void initializeCacheTexts() {
if (description == null || shortdesc == null || hint == null || location == null) {
- cgData.loadCacheTexts(this);
+ Geocache partial = cgData.loadCacheTexts(this.getGeocode());
+ if (description == null) {
+ setDescription(partial.getDescription());
+ }
+ if (shortdesc == null) {
+ setShortDescription(partial.getShortDescription());
+ }
+ if (hint == null) {
+ setHint(partial.getHint());
+ }
+ if (location == null) {
+ setLocation(partial.getLocation());
+ }
}
}
@@ -645,6 +673,7 @@ public class Geocache implements ICache, IWaypoint {
@Override
public String getShortDescription() {
initializeCacheTexts();
+ assertTextNotNull(shortdesc, "Short description");
return shortdesc;
}
@@ -673,6 +702,7 @@ public class Geocache implements ICache, IWaypoint {
@Override
public String getLocation() {
initializeCacheTexts();
+ assertTextNotNull(location, "Location");
return location;
}
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index d7cef65..005ee9e 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -134,7 +134,8 @@ public class StaticMapsActivity extends AbstractActivity {
for (int level = 1; level <= 5; level++) {
try {
if (waypoint_id != null) {
- final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, waypoint_id, level);
+ final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
+ final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, cache.getWaypointById(waypoint_id), level);
if (image != null) {
maps.add(image);
}
@@ -186,8 +187,10 @@ public class StaticMapsActivity extends AbstractActivity {
final Waypoint waypoint = cache.getWaypointById(waypoint_id);
if (waypoint != null) {
showToast(res.getString(R.string.info_storing_static_maps));
+ // refresh always removes old waypoint files
+ StaticMapsProvider.removeWpStaticMaps(waypoint, geocode);
StaticMapsProvider.storeWaypointStaticMap(cache, waypoint, true);
- return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint_id);
+ return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint);
}
showToast(res.getString(R.string.err_detail_not_load_map_static));
return false;
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index 6feacc2..8e853d6 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -95,13 +95,29 @@ public class StaticMapsProvider {
storeCacheStaticMap(cache, edge, false);
}
- // download static map for current waypoints
+ // clean old and download static maps for waypoints if one is missing
if (Settings.isStoreOfflineWpMaps() && CollectionUtils.isNotEmpty(cache.getWaypoints())) {
- // remove all waypoint static map files due to origin cache waypoint id changed on saveCache
- LocalStorage.deleteFilesWithPrefix(cache.getGeocode(), MAP_FILENAME_PREFIX + WAYPOINT_PREFIX);
for (Waypoint waypoint : cache.getWaypoints()) {
- storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, false);
+ if (!hasAllStaticMapsForWaypoint(cache.getGeocode(), waypoint)) {
+ refreshAllWpStaticMaps(cache, edge);
+ }
}
+
+ }
+ }
+
+ /**
+ * Deletes and download all Waypoints static maps.
+ *
+ * @param cache
+ * The cache instance
+ * @param edge
+ * The boundings
+ */
+ private static void refreshAllWpStaticMaps(Geocache cache, int edge) {
+ LocalStorage.deleteFilesWithPrefix(cache.getGeocode(), MAP_FILENAME_PREFIX + WAYPOINT_PREFIX);
+ for (Waypoint waypoint : cache.getWaypoints()) {
+ storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, false);
}
}
@@ -124,8 +140,10 @@ public class StaticMapsProvider {
}
String wpLatlonMap = waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA);
String wpMarkerUrl = getWpMarkerUrl(waypoint);
- // download map images in separate background thread for higher performance
- downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + '_', wpLatlonMap, edge, null, waitForResult);
+ if (!hasAllStaticMapsForWaypoint(geocode, waypoint)) {
+ // download map images in separate background thread for higher performance
+ downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + '_' + waypoint.calculateStaticMapsHashcode() + "_", wpLatlonMap, edge, null, waitForResult);
+ }
}
public static void storeCacheStaticMap(Geocache cache, final boolean waitForResult) {
@@ -210,13 +228,15 @@ public class StaticMapsProvider {
return MARKERS_URL + "marker_waypoint_" + type + ".png";
}
- public static void removeWpStaticMaps(int wp_id, final String geocode) {
- if (wp_id <= 0) {
+ public static void removeWpStaticMaps(Waypoint waypoint, final String geocode) {
+ if (waypoint == null) {
return;
}
+ int waypointId = waypoint.getId();
+ int waypointMapHash = waypoint.calculateStaticMapsHashcode();
for (int level = 1; level <= 5; level++) {
try {
- StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + '_' + level, false).delete();
+ StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + '_' + level, false).delete();
} catch (Exception e) {
Log.e("StaticMapsProvider.removeWpStaticMaps", e);
}
@@ -250,12 +270,14 @@ public class StaticMapsProvider {
* Checks if at least one map file exists for the given geocode and waypoint ID.
*
* @param geocode
- * @param waypointId
+ * @param waypoint
* @return <code>true</code> if at least one mapfile exists; <code>false</code> otherwise
*/
- public static boolean hasStaticMapForWaypoint(String geocode, int waypointId) {
+ public static boolean hasStaticMapForWaypoint(String geocode, Waypoint waypoint) {
+ int waypointId = waypoint.getId();
+ int waypointMapHash = waypoint.calculateStaticMapsHashcode();
for (int level = 1; level <= 5; level++) {
- File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + level, false);
+ File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false);
if (mapFile != null && mapFile.exists()) {
return true;
}
@@ -263,12 +285,37 @@ public class StaticMapsProvider {
return false;
}
+ /**
+ * Checks if at least one map file exists for the given geocode and waypoint ID.
+ *
+ * @param geocode
+ * @param waypoint
+ * @return <code>true</code> if at least one mapfile exists; <code>false</code> otherwise
+ */
+ public static boolean hasAllStaticMapsForWaypoint(String geocode, Waypoint waypoint) {
+ int waypointId = waypoint.getId();
+ int waypointMapHash = waypoint.calculateStaticMapsHashcode();
+ for (int level = 1; level <= 5; level++) {
+ File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false);
+ if (mapFile == null) {
+ return false;
+ }
+ boolean mapExists = mapFile.exists();
+ if (!mapExists) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static Bitmap getPreviewMap(final String geocode) {
return decodeFile(StaticMapsProvider.getMapFile(geocode, PREFIX_PREVIEW, false));
}
- public static Bitmap getWaypointMap(final String geocode, int waypoint_id, int level) {
- return decodeFile(StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypoint_id + "_" + level, false));
+ public static Bitmap getWaypointMap(final String geocode, Waypoint waypoint, int level) {
+ int waypointId = waypoint.getId();
+ int waypointMapHash = waypoint.calculateStaticMapsHashcode();
+ return decodeFile(StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + waypointMapHash + "_" + level, false));
}
public static Bitmap getCacheMap(final String geocode, int level) {
diff --git a/main/src/cgeo/geocaching/Waypoint.java b/main/src/cgeo/geocaching/Waypoint.java
index 4b014a6..53160e5 100644
--- a/main/src/cgeo/geocaching/Waypoint.java
+++ b/main/src/cgeo/geocaching/Waypoint.java
@@ -269,4 +269,13 @@ public class Waypoint implements IWaypoint, Comparable<Waypoint> {
public boolean isVisited() {
return visited;
}
+
+ public int calculateStaticMapsHashcode() {
+ long hash = 0;
+ if (coords != null) {
+ hash = coords.hashCode();
+ }
+ hash = hash ^ waypointType.markerId;
+ return (int) hash;
+ }
}
diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
index d089e82..d898d7e 100644
--- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
+++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java
@@ -1,11 +1,11 @@
package cgeo.geocaching.apps.cache.navi;
+import cgeo.geocaching.Geocache;
import cgeo.geocaching.ILogable;
import cgeo.geocaching.R;
import cgeo.geocaching.StaticMapsActivity;
import cgeo.geocaching.StaticMapsProvider;
import cgeo.geocaching.Waypoint;
-import cgeo.geocaching.Geocache;
import cgeo.geocaching.cgData;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.apps.AbstractApp;
@@ -34,9 +34,8 @@ abstract class AbstractStaticMapsApp extends AbstractApp implements CacheNavigat
return false;
}
String geocode = waypoint.getGeocode();
- int id = waypoint.getId();
if (StringUtils.isNotEmpty(geocode) && cgData.isOffline(geocode, null)) {
- return StaticMapsProvider.hasStaticMapForWaypoint(geocode, id);
+ return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint);
}
return false;
}
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 7e9b37a..78c28b1 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -2382,6 +2382,22 @@ public class cgData {
database.delete(dbTableLogsOffline, "geocode = ?", new String[]{geocode});
}
+ public static void clearLogsOffline(List<Geocache> caches) {
+ if (CollectionUtils.isEmpty(caches)) {
+ return;
+ }
+
+ init();
+
+ Set<String> geocodes = new HashSet<String>(caches.size());
+ for (Geocache cache : caches) {
+ geocodes.add(cache.getGeocode());
+ cache.setLogOffline(false);
+ }
+
+ database.execSQL(String.format("DELETE FROM %s where %s", dbTableLogsOffline, whereGeocodeIn(geocodes)));
+ }
+
public static boolean hasLogOffline(final String geocode) {
if (StringUtils.isBlank(geocode)) {
return false;
@@ -2644,11 +2660,21 @@ public class cgData {
return result;
}
- public static String loadCacheTexts(final Geocache cache) {
- final String geocode = cache.getGeocode();
- if (StringUtils.isBlank(geocode)) {
- return null;
- }
+ /**
+ * Load the lazily initialized fields of a cache and return them as partial cache (all other fields unset).
+ *
+ * @param geocode
+ * @return
+ */
+ public static Geocache loadCacheTexts(final String geocode) {
+ final Geocache partial = new Geocache();
+
+ // in case of database issues, we still need to return a result to avoid endless loops
+ partial.setDescription(StringUtils.EMPTY);
+ partial.setShortDescription(StringUtils.EMPTY);
+ partial.setHint(StringUtils.EMPTY);
+ partial.setLocation(StringUtils.EMPTY);
+
init();
try {
@@ -2663,10 +2689,10 @@ public class cgData {
"1");
if (cursor.moveToFirst()) {
- cache.setDescription(StringUtils.defaultString(cursor.getString(0)));
- cache.setShortDescription(StringUtils.defaultString(cursor.getString(1)));
- cache.setHint(StringUtils.defaultString(cursor.getString(2)));
- cache.setLocation(StringUtils.defaultString(cursor.getString(3)));
+ partial.setDescription(StringUtils.defaultString(cursor.getString(0)));
+ partial.setShortDescription(StringUtils.defaultString(cursor.getString(1)));
+ partial.setHint(StringUtils.defaultString(cursor.getString(2)));
+ partial.setLocation(StringUtils.defaultString(cursor.getString(3)));
}
cursor.close();
@@ -2676,7 +2702,7 @@ public class cgData {
Log.e("cgData.getCacheDescription", e);
}
- return null;
+ return partial;
}
/**
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index 726b60e..2c9c80b 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -109,6 +109,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
private static final int MENU_STORE_CACHE = 73;
private static final int MENU_FILTER = 74;
private static final int MENU_DELETE_EVENTS = 75;
+ private static final int MENU_CLEAR_OFFLINE_LOGS = 76;
private static final int MSG_DONE = -1;
private static final int MSG_RESTART_GEO_AND_DIR = -2;
@@ -387,6 +388,21 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
}
}
};
+ private Handler clearOfflineLogsHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != MSG_CANCEL) {
+ adapter.setSelectMode(false);
+
+ refreshCurrentList();
+
+ replaceCacheListFromSearch();
+
+ progress.dismiss();
+ }
+ }
+ };
private Handler importGpxAttachementFinishedHandler = new Handler() {
@Override
@@ -544,6 +560,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
subMenu.add(0, MENU_REFRESH_STORED, 0, res.getString(R.string.cache_offline_refresh)); // download details for all caches
subMenu.add(0, MENU_MOVE_TO_LIST, 0, res.getString(R.string.cache_menu_move_list));
subMenu.add(0, MENU_DELETE_EVENTS, 0, res.getString(R.string.caches_delete_events));
+ subMenu.add(0, MENU_CLEAR_OFFLINE_LOGS, 0, res.getString(R.string.caches_clear_offlinelogs));
//TODO: add submenu/AlertDialog and use R.string.gpx_import_title
subMenu.add(0, MENU_IMPORT_GPX, 0, res.getString(R.string.gpx_import_title));
@@ -610,6 +627,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
setVisible(menu, MENU_MOVE_TO_LIST, !isEmpty);
setVisible(menu, MENU_EXPORT, !isEmpty);
setVisible(menu, MENU_REMOVE_FROM_HISTORY, !isEmpty);
+ setVisible(menu, MENU_CLEAR_OFFLINE_LOGS, !isEmpty && containsOfflineLogs());
setVisible(menu, MENU_IMPORT_GPX, isConcrete);
setVisible(menu, MENU_IMPORT_WEB, isConcrete);
@@ -666,6 +684,15 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
return false;
}
+ private boolean containsOfflineLogs() {
+ for (Geocache cache : adapter.getCheckedOrAllCaches()) {
+ if (cache.isLogOffline()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void setMenuItemLabel(final Menu menu, final int menuId, final int resIdSelection, final int resId) {
final MenuItem menuItem = menu.findItem(menuId);
if (menuItem == null) {
@@ -751,6 +778,10 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
deletePastEvents();
invalidateOptionsMenuCompatible();
return true;
+ case MENU_CLEAR_OFFLINE_LOGS:
+ clearOfflineLogs();
+ invalidateOptionsMenuCompatible();
+ return true;
default:
return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, search);
}
@@ -770,6 +801,11 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
new DropDetailsThread(dropDetailsHandler, deletion).start();
}
+ public void clearOfflineLogs() {
+ progress.show(this, null, res.getString(R.string.caches_clear_offlinelogs_progress), true, clearOfflineLogsHandler.obtainMessage(MSG_CANCEL));
+ new ClearOfflineLogsThread(clearOfflineLogsHandler).start();
+ }
+
/**
* called from the filter bar view
*/
@@ -1361,6 +1397,23 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
}
}
+ private class ClearOfflineLogsThread extends Thread {
+
+ final private Handler handler;
+ final private List<Geocache> selected;
+
+ public ClearOfflineLogsThread(Handler handlerIn) {
+ handler = handlerIn;
+ selected = adapter.getCheckedOrAllCaches();
+ }
+
+ @Override
+ public void run() {
+ cgData.clearLogsOffline(selected);
+ handler.sendEmptyMessage(MSG_DONE);
+ }
+ }
+
private class MoreCachesListener implements View.OnClickListener {
@Override
diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java
index 1eb8fbb..413291c 100644
--- a/main/src/cgeo/geocaching/connector/AbstractConnector.java
+++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java
@@ -102,6 +102,11 @@ public abstract class AbstractConnector implements IConnector {
abstract protected String getCacheUrlPrefix();
+ @Override
+ public String getLongCacheUrl(final Geocache cache) {
+ return getCacheUrl(cache);
+ }
+
/**
* {@link IConnector}
*/
diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java
index da626f2..9169b4a 100644
--- a/main/src/cgeo/geocaching/connector/IConnector.java
+++ b/main/src/cgeo/geocaching/connector/IConnector.java
@@ -1,7 +1,7 @@
package cgeo.geocaching.connector;
-import cgeo.geocaching.ICache;
import cgeo.geocaching.Geocache;
+import cgeo.geocaching.ICache;
import cgeo.geocaching.enumerations.CacheRealm;
import cgeo.geocaching.geopoint.Geopoint;
@@ -30,6 +30,14 @@ public interface IConnector {
public String getCacheUrl(final Geocache cache);
/**
+ * get long browser URL for the given cache
+ *
+ * @param cache
+ * @return
+ */
+ public String getLongCacheUrl(final Geocache cache);
+
+ /**
* enable/disable watchlist controls in cache details
*
* @return
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
index 2a38bd9..50bf096 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
@@ -24,7 +24,9 @@ import java.util.regex.Pattern;
public class GCConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort {
- private static final String HTTP_COORD_INFO = "http://coord.info/";
+ private static final String CACHE_URL_SHORT = "http://coord.info/";
+ // Double slash is used to force open in browser
+ private static final String CACHE_URL_LONG = "http://www.geocaching.com//seek/cache_details.aspx?wp=";
private static final Pattern gpxZipFilePattern = Pattern.compile("\\d{7,}(_.+)?\\.zip", Pattern.CASE_INSENSITIVE);
private GCConnector() {
@@ -51,9 +53,13 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode,
}
@Override
+ public String getLongCacheUrl(Geocache cache) {
+ return CACHE_URL_LONG + cache.getGeocode();
+ }
+
+ @Override
public String getCacheUrl(Geocache cache) {
- // it would also be possible to use "http://www.geocaching.com/seek/cache_details.aspx?wp=" + cache.getGeocode();
- return "http://www.geocaching.com//seek/cache_details.aspx?wp=" + cache.getGeocode();
+ return CACHE_URL_SHORT + cache.getGeocode();
}
@Override
@@ -224,7 +230,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode,
@Override
protected String getCacheUrlPrefix() {
- return HTTP_COORD_INFO;
+ return CACHE_URL_SHORT;
}
@Override
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
index f678797..4d27617 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
@@ -39,7 +39,7 @@ public final class GCConstants {
public final static Pattern PATTERN_NAME = Pattern.compile("<span id=\"ctl00_ContentBody_CacheName\">(.*?)</span>");
public final static Pattern PATTERN_DIFFICULTY = Pattern.compile("<span id=\"ctl00_ContentBody_uxLegendScale\"[^>]*>[^<]*<img src=\"[^\"]*/images/stars/stars([0-9_]+)\\.gif\"");
public final static Pattern PATTERN_TERRAIN = Pattern.compile("<span id=\"ctl00_ContentBody_Localize[\\d]+\"[^>]*>[^<]*<img src=\"[^\"]*/images/stars/stars([0-9_]+)\\.gif\"");
- public final static Pattern PATTERN_OWNER_USERID = Pattern.compile("<a id=\"ctl00_ContentBody_uxFindLinksHiddenByThisUser\" href=\"[^\"]*/seek/nearest\\.aspx\\?u=(.*?)\"");
+ public final static Pattern PATTERN_OWNER_USERID = Pattern.compile("other caches <a href=\"/seek/nearest\\.aspx\\?u=(.*?)\">hidden</a> or");
public final static Pattern PATTERN_FOUND = Pattern.compile("<a id=\"ctl00_ContentBody_hlFoundItLog\"[^<]*<img src=\"[^\"]+check\\.\\w+\"[^>]*>[^<]*</a>[^<]*</p>");
public final static Pattern PATTERN_FOUND_ALTERNATIVE = Pattern.compile("<div class=\"StatusInformationWidget FavoriteWidget\"");
public final static Pattern PATTERN_FOUND_DATE = Pattern.compile("You logged this as Found on ([^.]+?)\\.[^<]*</a>[^<]*</p>");
diff --git a/main/src/cgeo/geocaching/connector/oc/OC11XMLParser.java b/main/src/cgeo/geocaching/connector/oc/OC11XMLParser.java
index 9a76a96..621032f 100644
--- a/main/src/cgeo/geocaching/connector/oc/OC11XMLParser.java
+++ b/main/src/cgeo/geocaching/connector/oc/OC11XMLParser.java
@@ -43,8 +43,7 @@ import java.util.regex.Pattern;
public class OC11XMLParser {
- private static final String PARAGRAPH_END = "</p>";
- private static final String PARAGRAPH_BEGIN = "<p>";
+ private static final String[] MARKUP = new String[] { "p", "span" };
private static Pattern STRIP_DATE = Pattern.compile("\\+0([0-9]){1}\\:00");
private static Pattern LOCAL_URL = Pattern.compile("href=\"(.*)\"");
private static final int CACHE_PARSE_LIMIT = 250;
@@ -514,7 +513,7 @@ public class OC11XMLParser {
@Override
public void end(String body) {
final String content = body.trim();
- descHolder.shortDesc = linkify(content);
+ descHolder.shortDesc = linkify(stripMarkup(content));
}
});
@@ -524,7 +523,7 @@ public class OC11XMLParser {
@Override
public void end(String body) {
final String content = body.trim();
- descHolder.desc = linkify(content);
+ descHolder.desc = linkify(stripMarkup(content));
}
});
@@ -733,12 +732,23 @@ public class OC11XMLParser {
* rendering.
*/
protected static String stripMarkup(String input) {
- if (StringUtils.startsWith(input, PARAGRAPH_BEGIN) && StringUtils.endsWith(input, PARAGRAPH_END)) {
- String inner = input.substring(PARAGRAPH_BEGIN.length(), input.length() - PARAGRAPH_END.length());
- if (!inner.contains(PARAGRAPH_BEGIN)) {
- return inner.trim();
+ if (!StringUtils.startsWith(input, "<")) {
+ return input;
+ }
+ String result = input.trim();
+ for (String tagName : MARKUP) {
+ final String startTag = "<" + tagName + ">";
+ if (StringUtils.startsWith(result, startTag)) {
+ final String endTag = "</" + tagName + ">";
+ if (StringUtils.endsWith(result, endTag)) {
+ String inner = result.substring(startTag.length(), result.length() - endTag.length()).trim();
+ String nested = stripMarkup(inner);
+ if (!nested.contains(startTag)) {
+ result = nested;
+ }
+ }
}
}
- return input;
+ return result;
}
} \ No newline at end of file
diff --git a/tests/src/cgeo/CGeoTestCase.java b/tests/src/cgeo/CGeoTestCase.java
index 31fde34..6a63cbc 100644
--- a/tests/src/cgeo/CGeoTestCase.java
+++ b/tests/src/cgeo/CGeoTestCase.java
@@ -1,6 +1,8 @@
package cgeo;
+import cgeo.geocaching.cgData;
import cgeo.geocaching.cgeoapplication;
+import cgeo.geocaching.enumerations.LoadFlags;
import android.test.ApplicationTestCase;
@@ -16,4 +18,9 @@ public abstract class CGeoTestCase extends ApplicationTestCase<cgeoapplication>
createApplication();
}
+ /** Remove cache from DB and cache to ensure that the cache is not loaded from the database */
+ protected static void deleteCacheFromDB(String geocode) {
+ cgData.removeCache(geocode, LoadFlags.REMOVE_ALL);
+ }
+
}
diff --git a/tests/src/cgeo/geocaching/cgeoApplicationTest.java b/tests/src/cgeo/geocaching/cgeoApplicationTest.java
index 73591ed..a877660 100644
--- a/tests/src/cgeo/geocaching/cgeoApplicationTest.java
+++ b/tests/src/cgeo/geocaching/cgeoApplicationTest.java
@@ -405,11 +405,6 @@ public class cgeoApplicationTest extends CGeoTestCase {
}
/** Remove cache from DB and cache to ensure that the cache is not loaded from the database */
- private static void deleteCacheFromDB(String geocode) {
- cgData.removeCache(geocode, LoadFlags.REMOVE_ALL);
- }
-
- /** Remove cache from DB and cache to ensure that the cache is not loaded from the database */
private static void deleteCacheFromDBAndLogout(String geocode) {
deleteCacheFromDB(geocode);
diff --git a/tests/src/cgeo/geocaching/connector/opencaching/OCXMLTest.java b/tests/src/cgeo/geocaching/connector/oc/OCXMLTest.java
index ca2e302..b12823a 100644
--- a/tests/src/cgeo/geocaching/connector/opencaching/OCXMLTest.java
+++ b/tests/src/cgeo/geocaching/connector/oc/OCXMLTest.java
@@ -1,9 +1,8 @@
-package cgeo.geocaching.connector.opencaching;
+package cgeo.geocaching.connector.oc;
import cgeo.CGeoTestCase;
import cgeo.geocaching.Geocache;
import cgeo.geocaching.Settings;
-import cgeo.geocaching.connector.oc.OCXMLClient;
import cgeo.geocaching.enumerations.CacheType;
import java.util.Collection;
@@ -80,4 +79,45 @@ public class OCXMLTest extends CGeoTestCase {
Settings.setExcludeMine(oldExcludeMine);
}
}
+
+ public static void testFetchTwiceDuplicatesDescription() {
+ final String geoCode = "OCEFBA";
+ final String description = "Bei dem Cache kannst du einen kleinen Schatz bergen. Bitte lege aber einen ander Schatz in das Döschen. Achtung vor Automuggels.";
+
+ deleteCacheFromDB(geoCode);
+ Geocache cache = OCXMLClient.getCache(geoCode);
+ assertNotNull(cache);
+ try {
+ assertEquals(geoCode, cache.getGeocode());
+ assertEquals(description, cache.getDescription());
+ cache.store(null);
+
+ // reload, make sure description is not duplicated
+ cache = OCXMLClient.getCache(geoCode);
+ assertNotNull(cache);
+ assertEquals(description, cache.getDescription());
+ } finally {
+ deleteCacheFromDB(geoCode);
+ }
+ }
+
+ public static void testRemoveMarkupCache() {
+ final String geoCode = "OCEFBA";
+ final String description = "Bei dem Cache kannst du einen kleinen Schatz bergen. Bitte lege aber einen ander Schatz in das Döschen. Achtung vor Automuggels.";
+
+ Geocache cache = OCXMLClient.getCache(geoCode);
+ assertNotNull(cache);
+ assertEquals(description, cache.getDescription());
+ }
+
+ public static void testRemoveMarkup() {
+ assertEquals("", OC11XMLParser.stripMarkup(""));
+ assertEquals("Test", OC11XMLParser.stripMarkup("Test"));
+ assertEquals("<b>bold and others not removed</b>", OC11XMLParser.stripMarkup("<b>bold and others not removed</b>"));
+ assertEquals("unnecessary paragraph", OC11XMLParser.stripMarkup("<p>unnecessary paragraph</p>"));
+ assertEquals("unnecessary span", OC11XMLParser.stripMarkup("<span>unnecessary span</span>"));
+ assertEquals("nested", OC11XMLParser.stripMarkup("<span><span>nested</span></span>"));
+ assertEquals("mixed", OC11XMLParser.stripMarkup("<span> <p> mixed </p> </span>"));
+ assertEquals("<p>not</p><p>removable</p>", OC11XMLParser.stripMarkup("<p>not</p><p>removable</p>"));
+ }
}
diff --git a/tests/src/cgeo/geocaching/connector/opencaching/OkapiClientTest.java b/tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java
index 9173c6a..690cd4c 100644
--- a/tests/src/cgeo/geocaching/connector/opencaching/OkapiClientTest.java
+++ b/tests/src/cgeo/geocaching/connector/oc/OkapiClientTest.java
@@ -1,4 +1,4 @@
-package cgeo.geocaching.connector.opencaching;
+package cgeo.geocaching.connector.oc;
import cgeo.CGeoTestCase;
import cgeo.geocaching.Geocache;
diff --git a/tests/src/cgeo/geocaching/test/mock/GC1ZXX2.html b/tests/src/cgeo/geocaching/test/mock/GC1ZXX2.html
index 33364ef..69eb0a1 100644
--- a/tests/src/cgeo/geocaching/test/mock/GC1ZXX2.html
+++ b/tests/src/cgeo/geocaching/test/mock/GC1ZXX2.html
@@ -1050,11 +1050,8 @@ Man weiß hier Bescheid. Dieser Cache ist rund um die Uhr zu finden, ohne ein Ge
</p>
<ul class="NoPrint">
<li>
- ...other caches&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksHiddenByThisUser" href="/seek/nearest.aspx?u=daniel354">hidden</a>&nbsp;
- or&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksFoundByThisUser" href="/seek/nearest.aspx?ul=daniel354">found</a>&nbsp;
- by this user
+
+ ...other caches <a href="/seek/nearest.aspx?u=daniel354">hidden</a> or <a href="/seek/nearest.aspx?ul=daniel354">found</a> by this user
</li>
<li>
diff --git a/tests/src/cgeo/geocaching/test/mock/GC2CJPF.html b/tests/src/cgeo/geocaching/test/mock/GC2CJPF.html
index b06215d..bfa932f 100644
--- a/tests/src/cgeo/geocaching/test/mock/GC2CJPF.html
+++ b/tests/src/cgeo/geocaching/test/mock/GC2CJPF.html
@@ -1394,11 +1394,8 @@ P.S. An warmen Tagen Badesachen und Handtuch mitnehmen.</span>
</p>
<ul class="NoPrint">
<li>
- ...other caches&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksHiddenByThisUser" href="/seek/nearest.aspx?u=Tom03">hidden</a>&nbsp;
- or&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksFoundByThisUser" href="/seek/nearest.aspx?ul=Tom03">found</a>&nbsp;
- by this user
+
+ ...other caches <a href="/seek/nearest.aspx?u=Tom03">hidden</a> or <a href="/seek/nearest.aspx?ul=Tom03">found</a> by this user
</li>
<li>
diff --git a/tests/src/cgeo/geocaching/test/mock/GC2JVEH.html b/tests/src/cgeo/geocaching/test/mock/GC2JVEH.html
index 9e1a44f..8b974b5 100644
--- a/tests/src/cgeo/geocaching/test/mock/GC2JVEH.html
+++ b/tests/src/cgeo/geocaching/test/mock/GC2JVEH.html
@@ -1062,11 +1062,8 @@ Sys.WebForms.PageRequestManager._initialize('ctl00$uxMainScriptManager', 'aspnet
</p>
<ul class="NoPrint">
<li>
- ...other caches&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksHiddenByThisUser" href="/seek/nearest.aspx?u=indianerjones">hidden</a>&nbsp;
- or&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksFoundByThisUser" href="/seek/nearest.aspx?ul=indianerjones">found</a>&nbsp;
- by this user
+
+ ...other caches <a href="/seek/nearest.aspx?u=indianerjones">hidden</a> or <a href="/seek/nearest.aspx?ul=indianerjones">found</a> by this user
</li>
<li>
diff --git a/tests/src/cgeo/geocaching/test/mock/GC3XX5J.html b/tests/src/cgeo/geocaching/test/mock/GC3XX5J.html
index c4740f0..30bb9ac 100644
--- a/tests/src/cgeo/geocaching/test/mock/GC3XX5J.html
+++ b/tests/src/cgeo/geocaching/test/mock/GC3XX5J.html
@@ -943,11 +943,8 @@ PRINESI SVOJE PISALO / BRING YOUR OWN PEN<br /></span>
</p>
<ul class="NoPrint">
<li>
- ...other caches&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksHiddenByThisUser" href="/seek/nearest.aspx?u=David+%26+Ajda">hidden</a>&nbsp;
- or&nbsp;
- <a id="ctl00_ContentBody_uxFindLinksFoundByThisUser" href="/seek/nearest.aspx?ul=David+%26+Ajda">found</a>&nbsp;
- by this user
+
+ ...other caches <a href="/seek/nearest.aspx?u=David+%26+Ajda">hidden</a> or <a href="/seek/nearest.aspx?ul=David+%26+Ajda">found</a> by this user
</li>
<li>