diff options
Diffstat (limited to 'main')
188 files changed, 3045 insertions, 3232 deletions
diff --git a/main/.classpath b/main/.classpath index 72adb52..d7bb252 100644 --- a/main/.classpath +++ b/main/.classpath @@ -19,5 +19,6 @@ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/> + <classpathentry kind="lib" path="compile-libs/org.eclipse.jdt.annotation_1.1.0.v20130513-1648.jar"/> <classpathentry kind="output" path="bin/classes"/> </classpath> diff --git a/main/.settings/org.eclipse.jdt.core.prefs b/main/.settings/org.eclipse.jdt.core.prefs index 41c73f0..3e9e8a8 100644 --- a/main/.settings/org.eclipse.jdt.core.prefs +++ b/main/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,10 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -18,6 +24,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=warning org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore @@ -25,7 +32,7 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning @@ -36,7 +43,9 @@ org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled @@ -53,12 +62,18 @@ org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warni org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=error +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=error +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning @@ -68,10 +83,12 @@ org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning @@ -90,6 +107,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference= org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.processAnnotations=enabled diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml index 2d01358..5a204e9 100644 --- a/main/AndroidManifest.xml +++ b/main/AndroidManifest.xml @@ -30,7 +30,7 @@ android:xlargeScreens="true" /> <application - android:name=".cgeoapplication" + android:name=".CgeoApplication" android:allowBackup="true" android:backupAgent="cgeo.geocaching.backup.CentralBackupAgent" android:icon="@drawable/cgeo" @@ -111,7 +111,19 @@ android:name=".twitter.TwitterAuthorizationActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/auth_twitter" - android:windowSoftInputMode="stateHidden" > + android:windowSoftInputMode="stateHidden" + android:launchMode="singleTask" > + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data + android:host="www.cgeo.org" + android:pathPrefix="/twitter/" + android:scheme="callback" /> + </intent-filter> </activity> <activity android:name=".EditWaypointActivity_" @@ -137,7 +149,7 @@ android:configChanges="keyboardHidden|orientation" > </activity> <activity - android:name=".cgeocaches" + android:name=".CacheListActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/app_name" > @@ -375,13 +387,37 @@ android:name=".connector.oc.OCDEAuthorizationActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" - android:windowSoftInputMode="stateHidden" > + android:windowSoftInputMode="stateHidden" + android:launchMode="singleTask"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data + android:host="www.cgeo.org" + android:pathPrefix="/opencaching.de/" + android:scheme="callback" /> + </intent-filter> </activity> <activity android:name=".connector.oc.OCPLAuthorizationActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" - android:windowSoftInputMode="stateHidden" > + android:windowSoftInputMode="stateHidden" + android:launchMode="singleTask"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data + android:host="www.cgeo.org" + android:pathPrefix="/opencaching.pl/" + android:scheme="callback" /> + </intent-filter> </activity> </application> </manifest> diff --git a/main/compile-libs/org.eclipse.jdt.annotation_1.1.0.v20130513-1648.jar b/main/compile-libs/org.eclipse.jdt.annotation_1.1.0.v20130513-1648.jar Binary files differnew file mode 100644 index 0000000..daca164 --- /dev/null +++ b/main/compile-libs/org.eclipse.jdt.annotation_1.1.0.v20130513-1648.jar diff --git a/main/libs/commons-collections-3.2.1.jar b/main/libs/commons-collections-3.2.1.jar Binary files differdeleted file mode 100644 index c35fa1f..0000000 --- a/main/libs/commons-collections-3.2.1.jar +++ /dev/null diff --git a/main/libs/commons-collections4-4.0-alpha1.jar b/main/libs/commons-collections4-4.0-alpha1.jar Binary files differnew file mode 100644 index 0000000..580a405 --- /dev/null +++ b/main/libs/commons-collections4-4.0-alpha1.jar diff --git a/main/libs/commons-io-2.4.jar b/main/libs/commons-io-2.4.jar Binary files differnew file mode 100644 index 0000000..90035a4 --- /dev/null +++ b/main/libs/commons-io-2.4.jar diff --git a/main/libs/commons-lang3-3.1.jar.properties b/main/libs/commons-lang3-3.1.jar.properties new file mode 100644 index 0000000..adbaad3 --- /dev/null +++ b/main/libs/commons-lang3-3.1.jar.properties @@ -0,0 +1 @@ +src=src/commons-lang3-3.1-src.zip
\ No newline at end of file diff --git a/main/libs/src/commons-collections-3.2.1-src.zip b/main/libs/src/commons-collections-3.2.1-src.zip Binary files differnew file mode 100644 index 0000000..e195370 --- /dev/null +++ b/main/libs/src/commons-collections-3.2.1-src.zip diff --git a/main/libs/src/commons-lang3-3.1-src.zip b/main/libs/src/commons-lang3-3.1-src.zip Binary files differnew file mode 100644 index 0000000..13010f4 --- /dev/null +++ b/main/libs/src/commons-lang3-3.1-src.zip diff --git a/main/proguard-project.txt b/main/proguard-project.txt index d4991f6..3edd33f 100644 --- a/main/proguard-project.txt +++ b/main/proguard-project.txt @@ -49,3 +49,6 @@ # Butter knife view injection, see http://jakewharton.github.io/butterknife/ -dontwarn butterknife.Views$InjectViewProcessor -keep class **$$ViewInjector { *; } + +# Null analysis annotations of Eclipse JDT are just used by the Eclipse compiler, so ignore them here +-dontwarn org.eclipse.jdt.annotation.**
\ No newline at end of file diff --git a/main/project/localization/findmissingtranslations.sh b/main/project/localization/findmissingtranslations.sh index ea14f90..52fc053 100755 --- a/main/project/localization/findmissingtranslations.sh +++ b/main/project/localization/findmissingtranslations.sh @@ -5,7 +5,7 @@ cd `dirname "$0"` . ./funcs.sh finddiffs () { - echo "translations missing or not in the right place for language '$1':" > $1.missing + echo "translations missing for language '$1':" > $1.missing diff -y en.str $1.str > tmp.str echo "Only in values/strings.xml:" >> $1.missing grep "<\||" tmp.str | cut -d " " -f 1 | while read s; do diff --git a/main/project/localization/funcs.sh b/main/project/localization/funcs.sh index 198fbae..c61a12e 100644 --- a/main/project/localization/funcs.sh +++ b/main/project/localization/funcs.sh @@ -1,5 +1,5 @@ # Utility functions for location-aware programs getnames () { - sed -ne 's/^.*<\(string\|plurals\)\s*name\s*=\s*"\([^\"]*\)".*$/\2/p' $1 + sed -ne 's/^.*<\(string\|plurals\)\s*name\s*=\s*"\([^\"]*\)".*$/\2/p' $1 | sort } diff --git a/main/res/layout/authorization_activity.xml b/main/res/layout/authorization_activity.xml index 771592d..28c1987 100644 --- a/main/res/layout/authorization_activity.xml +++ b/main/res/layout/authorization_activity.xml @@ -44,27 +44,11 @@ android:textColor="?text_color" android:textSize="14sp" /> - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="7dip" > - - <Button - android:id="@+id/start" - style="@style/button_full" /> - - <EditText - android:id="@+id/pin" - style="@style/edittext_full" - android:inputType="number" - android:visibility="gone" /> + <Button + android:id="@+id/start" + style="@style/button_full" + android:layout_margin="7dip" /> - <Button - android:id="@+id/pin_button" - style="@style/button_full" - android:visibility="visible" /> - </LinearLayout> </LinearLayout> </ScrollView> diff --git a/main/res/layout/cachedetail_details_page.xml b/main/res/layout/cachedetail_details_page.xml index 484385e..e735699 100644 --- a/main/res/layout/cachedetail_details_page.xml +++ b/main/res/layout/cachedetail_details_page.xml @@ -261,7 +261,7 @@ <ImageView
android:id="@+id/map_preview"
android:layout_width="fill_parent"
- android:layout_height="80dip"
+ android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:onClick="showNavigationMenu"
diff --git a/main/res/layout/logs_item.xml b/main/res/layout/logs_item.xml index 6bfe30a..6ce20bb 100644 --- a/main/res/layout/logs_item.xml +++ b/main/res/layout/logs_item.xml @@ -58,9 +58,7 @@ android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="22dip" - android:autoLink="web" android:gravity="left" - android:linksClickable="true" android:textColor="?text_color" android:textSize="14sp" /> diff --git a/main/res/values-cs/strings.xml b/main/res/values-cs/strings.xml index f82e199..cfb304f 100644 --- a/main/res/values-cs/strings.xml +++ b/main/res/values-cs/strings.xml @@ -321,7 +321,6 @@ <!-- caches lists --> <string name="list_menu">Seznam</string> <string name="list_menu_create">Vytvoลit novรฝ seznam</string> - <string name="list_menu_all_lists">Vลกechny keลกe</string> <string name="list_menu_drop">Smazat aktuรกlnรญ seznam</string> <string name="list_menu_change">Zmฤnit seznam</string> <string name="list_menu_rename">Pลejmenovat aktuรกlnรญ seznam</string> @@ -363,7 +362,7 @@ <string name="init_login_popup_ok">Pลihlรกลกenรญ bylo รบspฤลกnรฉ</string> <string name="init_login_popup_failed">Pลihlรกลกenรญ selhalo</string> <string name="init_login_popup_failed_reason">Pลihlรกลกenรญ se nezdaลilo, protoลพe:</string> - <string name="init_twitter_authorize">Autorizovat c:geo</string> + <string name="settings_authorize">Autorizovat c:geo</string> <string name="init_signature">Podpis</string> <string name="init_signature_help_text">Zadej podpis k pouลพitรญ pลi logovรกnรญ.\nSpeciรกlnรญ ลetฤzce, kterรฉ mลฏลพeลก pouลพรญt jsou: [DATE] , [TIME], [DATETIME], [USER] & [NUMBER].\nTyto ลetฤzce budou nahrazeny pลi vklรกdรกnรญ podpisu do Logu.</string> <string name="init_signature_template_button">Vloลพit ลกablonu</string> @@ -475,12 +474,7 @@ <string name="auth_authorize">Autorizovat c:geo</string> <string name="auth_start">Zahรกjit autorizaci</string> <string name="auth_again">Znovu autorizovat</string> - <string name="auth_pin_hint">PIN pลidฤlenรฝ Twitterem</string> <string name="auth_finish">Dokonฤit</string> - <string name="auth_dialog_wait">ฤekรกnรญ na Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN kรณd</string> - <string name="auth_dialog_pin_message">Prosรญm, napiลก PIN kรณd pลidฤlenรฝ Twitterem. Je to nutnรฉ pro dokonฤenรญ autorizace.</string> - <string name="auth_dialog_completed">c:geo nynรญ mลฏลพe posรญlat zprรกvy na Tvลฏj Twitter.</string> <!-- cache --> <plurals name="cache_counts"> @@ -1040,8 +1034,6 @@ <string name="twitter">Twitter: <a href="">@android_GC</a></string> <string name="nutshellmanual">Nรกvod: <a href="">c:geo v Nutshell</a></string> <string name="about_twitter">Mรก <b>c:geo</b> publikovat novรฝ status na Twitteru vลพdy, kdyลพ zalogujeลก keลก?</string> - <string name="about_auth_1">Nรกsledujรญcรญ proces dovoluje aplikaci <b>c:geo</b> pลรญstup na Twitter - pokud budeลก souhlasit.</string> - <string name="about_auth_2">Klepnutรญm na tlaฤรญtko \"Zahรกjit autorizaci\" bude proces zahรกjen. Tento proces otevลe webovรฝ prohlรญลพeฤ s Twitterem. Pลihlaลก se na tรฉto strรกnce a povol <b>c:geu</b> pลรญstup k tvรฉmu รบฤtu. Pokud je to povoleno, Twitter ti ukรกลพe ฤรญselnรฝ PIN kรณd. Tento PIN kรณd musรญลก zadat do <b>c:geo</b> a potvrdit. To je vลกe.</string> <!-- status (used via string based resource loading) --> <string name="status_new_release" tools:ignore="UnusedResources">Dostupnรฉ novรฉ vydรกnรญ.\nKlepni pro instalaci.</string> diff --git a/main/res/values-da/strings.xml b/main/res/values-da/strings.xml index 5deb999..e452af5 100644 --- a/main/res/values-da/strings.xml +++ b/main/res/values-da/strings.xml @@ -132,7 +132,7 @@ <string name="init_twitter">Twitter</string> <string name="init_username">Brugernavn</string> <string name="init_password">Password</string> - <string name="init_twitter_authorize">Godkend c:geo</string> + <string name="settings_authorize">Godkend c:geo</string> <string name="init_signature">Signatur</string> <string name="init_skin">Light skin (genstart af c:geo nรธdvendig)</string> <string name="init_summary_skin">Light skin (genstart af c:geo nรธdvendig)</string> @@ -156,12 +156,7 @@ <string name="auth_authorize">Godkend c:geo</string> <string name="auth_start">Start godkendelse</string> <string name="auth_again">Start igen</string> - <string name="auth_pin_hint">PIN tildelt af Twitter</string> <string name="auth_finish">Fรฆrdig</string> - <string name="auth_dialog_wait">Venter pรฅ Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN-kode</string> - <string name="auth_dialog_pin_message">Indtast PIN-kode fra Twitter. PIN er pรฅkrรฆvet for at gennemfรธre godkendelse.</string> - <string name="auth_dialog_completed">c:geo er nu godkendt til at poste beskeder pรฅ Twitter.</string> <!-- cache --> <plurals name="cache_counts"> @@ -287,7 +282,5 @@ <string name="facebook">Facebook: <a href="http://www.facebook.com/pages/cgeo/297269860090">c:geo page</a></string> <string name="twitter">Twitter: <a href="http://twitter.com/android_gc">@android_GC</a></string> <string name="about_twitter">Skal <b>c:geo</b> sende status til Twitter hvergang du logger en cache?</string> - <string name="about_auth_1">Med denne proces tillader du at <b>c:geo</b> fรฅr adgang til din Twitter.</string> - <string name="about_auth_2">Klik pรฅ \"godkend c:geo\" knappen for at starte godkendelsesprocessen. Det vil รฅbne Twitter i en webbrowser. Log ind pรฅ siden og tillad <b>c:geo</b> at tilgรฅ din Twitter. Nรฅr godkendt, vil Twitter vise en PIN-kode. Denne PIN skal tastes ind i <b>c:geo</b> og bekrรฆftes.</string> </resources> diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index 80f5c38..fa526a7 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -293,7 +293,6 @@ <string name="caches_clear_offlinelogs_progress">Lรถsche Offline-Logs</string> <string name="list_menu">Liste</string> <string name="list_menu_create">Neue Liste</string> - <string name="list_menu_all_lists">Alle</string> <string name="list_menu_drop">Aktuelle Liste lรถschen</string> <string name="list_menu_change">Andere Liste anzeigen</string> <string name="list_menu_rename">Aktuelle Liste umbenennen</string> @@ -346,13 +345,11 @@ <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Aktivieren</string> <string name="init_oc_de_description">Autorisiere c:geo auf opencaching.de zuzugreifen um Caches zu suchen und nach deinen Funden zu filtern.</string> - <string name="init_register_oc_de">c:geo autorisieren</string> - <string name="init_reregister_oc_de">c:geo neu autorisieren</string> + <string name="settings_authorize">c:geo autorisieren</string> + <string name="settings_reauthorize">c:geo neu autorisieren</string> <string name="init_oc_pl">Opencaching.pl</string> <string name="settings_activate_oc_pl">Aktiviere</string> <string name="init_oc_pl_description">Autorisiere c:geo auf opencaching.pl zuzugreifen um Caches zu suchen und nach deinen Funden zu filtern.</string> - <string name="init_register_oc_pl">c:geo autorisieren</string> - <string name="init_reregister_oc_pl">c:geo neu autorisieren</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Aktivieren</string> @@ -365,8 +362,6 @@ <string name="init_login_popup_failed">Login fehlgeschlagen</string> <string name="init_login_popup_failed_reason">Login fehlgeschlagen:</string> <string name="init_login_popup_not_authorized">Nicht autorisiert</string> - <string name="init_twitter_authorize">c:geo autorisieren</string> - <string name="init_twitter_reauthorize">c:geo neu autorisieren</string> <string name="init_signature">Signatur</string> <string name="init_signature_help_text">Verwendete Signatur fรผr Logtexte.\nErlaubte Platzhalter sind: [DATE], [TIME], [DATETIME], [USER] & [NUMBER]. Diese werden beim Einfรผgen der Signatur durch die entsprechenden Werte ersetzt.</string> <string name="init_signature_template_button">Platzhalter einfรผgen</string> @@ -482,27 +477,10 @@ <string name="auth_authorize">c:geo autorisieren</string> <string name="auth_start">Starte Autorisierung</string> <string name="auth_again">Neustarten</string> - <string name="auth_pin_hint">Twitter-PIN</string> <string name="auth_finish">Fertig</string> - <string name="auth_dialog_wait">Warten auf Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN Code</string> - <string name="auth_dialog_pin_message">Bitte den Twitter-PIN-Code eingeben, dies ist notwendig um die Autorisierung abzuschlieรen.</string> - <string name="auth_dialog_completed">c:geo ist nun autorisiert, Tweets bei Twitter zu erstellen.</string> - <string name="about_auth_1">Der folgende Prozess erlaubt es <b>c:geo</b> auf den persรถnlichen Twitter-Account zuzugreifen, wenn zugestimmt wird.</string> - <string name="about_auth_2">Ein Klick auf \"Starte Autorisierung\" รถffnet eine Twitter-Seite in einem Browserfenster. Durch die Anmeldung und die Bestรคtigung wird <b>c:geo</b> ermรถglicht, auf den persรถnlichen Twitter-Account zuzugreifen. Wird dies bestรคtigt, nennt Twitter eine numerische PIN, diese muss kopiert und in <b>c:geo</b> eingefรผgt werden. Das ist alles.</string> <string name="auth_ocde">opencaching.de</string> <string name="auth_ocpl">opencaching.pl</string> - <string name="auth_authorize_oc">c:geo autorisieren</string> - <string name="auth_start_oc">Starte Autorisierung</string> - <string name="auth_again_oc">Neustarten</string> - <string name="auth_pin_hint_oc">%s-PIN</string> - <string name="auth_finish_oc">Fertig</string> - <string name="auth_dialog_wait_oc">Warten auf %sโฆ</string> - <string name="auth_dialog_pin_title_oc">PIN Code</string> - <string name="auth_dialog_pin_message_oc">Bitte den %s-PIN-Code eingeben, dies ist notwendig um die Autorisierung abzuschlieรen.</string> <string name="auth_dialog_completed_oc">c:geo ist nun autorisiert, caches zu laden und auf %s zu loggen.</string> - <string name="about_auth_1_oc">Der folgende Prozess erlaubt es <b>c:geo</b> auf den persรถnlichen %s-Account zuzugreifen, wenn zugestimmt wird.</string> - <string name="about_auth_2_oc">Ein Klick auf \"Starte Autorisierung\" รถffnet eine %s-Seite in einem Browserfenster. Durch die Anmeldung und die Bestรคtigung wird <b>c:geo</b> ermรถglicht, auf den persรถnlichen Account zuzugreifen. Wird dies bestรคtigt, nennt %s eine numerische PIN, diese muss kopiert und in <b>c:geo</b> eingefรผgt werden. Das ist alles.</string> <string name="cache_offline">Offline</string> <string name="cache_offline_refresh">Aktualisieren</string> <string name="cache_offline_drop">Lรถschen</string> diff --git a/main/res/values-es/strings.xml b/main/res/values-es/strings.xml index 26bbe73..e692f15 100644 --- a/main/res/values-es/strings.xml +++ b/main/res/values-es/strings.xml @@ -322,7 +322,7 @@ <string name="init_login_popup_ok">Acceso conseguido.</string> <string name="init_login_popup_failed">Error en el acceso.</string> <string name="init_login_popup_failed_reason">El acceso ha fallado debido a </string> - <string name="init_twitter_authorize">Autorizar a c:geo</string> + <string name="settings_authorize">Autorizar a c:geo</string> <string name="init_signature">Firma</string> <string name="init_signature_help_text">Escribe la firma que quieres usar en los registros.\nLas palabras especiales que puedes usar son: [DATE], [TIME], [USER] y [NUMBER].\nSerรกn reemplazados por sus valores al insertar la firma.</string> <string name="init_signature_template_button">Insertar plantilla</string> @@ -386,12 +386,7 @@ <string name="auth_authorize">Autorizar c:geo</string> <string name="auth_start">Iniciar autorizaciรณn</string> <string name="auth_again">Volver a iniciar</string> - <string name="auth_pin_hint">PIN asignado por Twitter</string> <string name="auth_finish">Fin</string> - <string name="auth_dialog_wait">Esperando por Twitterโฆ</string> - <string name="auth_dialog_pin_title">Cรณdigo PIN</string> - <string name="auth_dialog_pin_message">Debes usar el codigo PIN suministrado por Twitter. Es obligatorio completar la autorizaciรณn.</string> - <string name="auth_dialog_completed">c:geo ahora estรก autorizado para publicar en Twitter.</string> <!-- cache --> <plurals name="cache_counts"> @@ -771,7 +766,5 @@ <string name="twitter">Twitter: <a href="">@android_GC</a></string> <string name="nutshellmanual">Manual: <a href="">c:geo en breve</a></string> <string name="about_twitter">ยฟDebe <b>c:geo</b> publicar el nuevo estado en Twitter cuando registras un escondite?</string> - <string name="about_auth_1">El siguiente proceso permite a <b>c:geo</b> acceder a Twitter - si estรกs de acuerdo.</string> - <string name="about_auth_2">Hacer clic en el botรณn \"autorizar c:geo\" iniciarรก el proceso. Este proceso abrirรก un navegador con la web de Twitter. Identifรญcate y permite a <b>c:geo</b> acceder a tu cuenta. Si aceptas Twitter te mostrarรก un cรณdigo PIN. Este PIN debe ser pegado en <b>c:geo</b> y ser confirmado. Eso es todo.</string> </resources> diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml index 539bf37..246a767 100644 --- a/main/res/values-fr/strings.xml +++ b/main/res/values-fr/strings.xml @@ -100,7 +100,7 @@ <string name="log_stars_4_description">plutรดt bien</string> <string name="log_stars_45_description">trรจs bien</string> <string name="log_stars_5_description">super</string> - <string name="log_webcam">photo webcam prise</string> + <string name="log_webcam">Photo prise par la webcam</string> <string name="log_new_log">Carnet</string> <string name="log_new_log_text">Message</string> <string name="log_announcement">Annonce</string> @@ -293,7 +293,6 @@ <string name="caches_clear_offlinelogs_progress">Effacement des entrรฉes de carnet hors-ligne</string> <string name="list_menu">Listes</string> <string name="list_menu_create">Nouvelle liste</string> - <string name="list_menu_all_lists">Toutes les caches</string> <string name="list_menu_drop">Effacer la liste courante</string> <string name="list_menu_change">Changer de liste</string> <string name="list_menu_rename">Renommer la liste courante</string> @@ -343,16 +342,14 @@ <string name="settings_gc_legal_note">En utilisant les services de geocaching.com, vous acceptez les conditions d\'utilisation de Groundspeak.</string> <string name="settings_info_facebook_login_title">Connexion Facebook</string> <string name="settings_info_facebook_login">Vous ne pouvez pas faire que c:geo se connecte ร geocaching.com avec votre compte Facebook. Mais il existe une solution simpleโฆ</string> - <string name="init_oc">opencaching.de</string> + <string name="settings_authorize">Autoriser c:geo</string> + <string name="settings_reauthorize">Rรฉ-autoriser c:geo</string> + <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Activer</string> <string name="init_oc_de_description">Autoriser c:geo ร utiliser opencaching.de pour chercher des caches et accรฉder/filtrer vos caches trouvรฉes.</string> - <string name="init_register_oc_de">Autoriser c:geo</string> - <string name="init_reregister_oc_de">Rรฉ-autoriser c:geo</string> <string name="init_oc_pl">Opencaching.pl</string> <string name="settings_activate_oc_pl">Activer</string> <string name="init_oc_pl_description">Autoriser c:geo ร utiliser opencaching.pl pour chercher des caches et accรฉder/filtrer vos caches trouvรฉes.</string> - <string name="init_register_oc_pl">Autoriser c:geo</string> - <string name="init_reregister_oc_pl">Rรฉ-autoriser c:geo</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Activer</string> @@ -365,8 +362,6 @@ <string name="init_login_popup_failed">Erreur de connexion</string> <string name="init_login_popup_failed_reason">Erreur de connexion: </string> <string name="init_login_popup_not_authorized">Non autorisรฉ</string> - <string name="init_twitter_authorize">Autorisation de c:geo</string> - <string name="init_twitter_reauthorize">Rรฉ-autoriser c:geo</string> <string name="init_signature">Signature</string> <string name="init_signature_help_text">รcrivez votre propre signature pour vos visites.\nLes codes spรฉciaux supportรฉs sont : [DATE] , [TIME], [DATETIME], [USER] & [NUMBER].\nAu moment de l\'insertion de la signature, ces codes seront remplacรฉs par la valeur correspondante.</string> <string name="init_signature_template_button">Insรฉrer un modรจle</string> @@ -427,10 +422,12 @@ <string name="init_backup_last">Sauvegarde disponible depuis</string> <string name="init_backup_last_no">Il n\'y a pas de fichier avec une sauvegarde.</string> <string name="settings_info_offline_maps_title">Informations sur les cartes hors-ligne</string> - <string name="settings_info_offline_maps">c:geo prend en charge les cartes hors-ligne. Vous pouvez tรฉlรฉcharger des cartes depuis Mapsforge ou mรชme crรฉer vos propres cartes ร partir des donnรฉes d\'OSM.</string> + <string name="settings_info_offline_maps">c:geo prend en charge les cartes hors-ligne. Vous pouvez tรฉlรฉcharger des cartes depuis Mapsforge ou mรชme crรฉer vos propres cartes ร partir des donnรฉes d\'OSM. Vous devez d\'abord sรฉlectionner le rรฉpertoire des cartes en mode hors-ligne pour pouvoir utiliser cette fonctionnalitรฉ.</string> <string name="settings_info_themes_title">Informations sur les thรจmes de cartes</string> <string name="settings_info_themes">c:geo prend en charge des thรจmes personnalisรฉs pour les cartes en mode hors-ligne. Ils peuvent รชtre utilisรฉs pour modifier le style de couleur de la carte (par exemple d\'avoir une vue de nuit) ou mettre en รฉvidence certains objets comme les pistes cyclables ou les lignes de niveau.</string> <string name="init_mapsource_select">Choisir la source des cartes</string> + <string name="settings_title_scale_map_text">Zoom du texte</string> + <string name="settings_summary_scale_map_text">Mise ร l\'รฉchelle des textes sur la carte hors-ligne en fonction de la rรฉsolution de l\'appareil</string> <string name="init_map_directory_description">Dossier contenant les cartes hors-ligne</string> <string name="init_gpx_exportdir">Dossier d\'exportation GPX</string> <string name="init_gpx_importdir">Dossier d\'importation GPX</string> @@ -463,6 +460,9 @@ <string name="init_use_native_ua">S\'identifier comme le navigateur web Android. Peut rรฉsoudre des problรจmes de connexion avec certains opรฉrateurs mobiles.</string> <string name="init_summary_use_native_ua">S\'identifier comme le navigateur Android. Rรฉsout les problรจmes de connexion lors de l\'utilisation de certains fournisseurs d\'accรจs au rรฉseau.</string> <string name="init_rendertheme_folder">Dossier contenant les cartes hors-ligne personnelles (optionnelles).</string> + <string name="settings_open_website">Ouvrir le site dans un navigateur</string> + <string name="settings_settings">Paramรจtres</string> + <string name="settings_information">Information</string> <string name="map_source_google_map">Google Mapsย : plan</string> <string name="map_source_google_satellite">Google Mapsย : satellite</string> <string name="map_source_osm_mapnik">OSMย : rendu Mapnik</string> @@ -482,27 +482,14 @@ <string name="auth_authorize">autorisation de c:geo</string> <string name="auth_start">dรฉbut d\'autorisation</string> <string name="auth_again">redรฉmarre</string> - <string name="auth_pin_hint">code donnรฉ par Twitter</string> <string name="auth_finish">terminรฉ</string> - <string name="auth_dialog_wait">en attente de Twitterโฆ</string> - <string name="auth_dialog_pin_title">code PIN</string> - <string name="auth_dialog_pin_message">Veuillez saisir votre code PIN fourni par Twitter. Il est obligatoire pour finaliser l\'autorisation.</string> - <string name="auth_dialog_completed">c:geo est maintenant autorisรฉ ร poster sur Twitter.</string> - <string name="about_auth_1">Le processus suivant permet ร <b>c:geo</b> d\'accรฉder ร votre compte Twitter - si vous acceptez.</string> - <string name="about_auth_2">Cliquer sur le bouton \"dรฉbut d\'autorisation\" pour dรฉmarrer. Une fenรชtre de navigateur va s\'ouvrir pour vous connecter sur Twitter. Accepter pour que <b>c:geo</b> accรฉde ร votre compte. Twitter vous affichera alors une code PIN composรฉ de chiffres. Merci de coller ce code dans <b>c:geo</b> puis confirmer. C\'est tout!</string> + <string name="auth_dialog_waiting">En attente de %sโฆ</string> + <string name="auth_explain_short">Le processus suivant autorisera <b>c:geo</b> ร accรฉder ร %s.</string> + <string name="auth_explain_long">L\'appui sur \"Autoriser c:geo\" dรฉmarrera le processus. Un navigateur web ouvrira la page de %s. Vous pourrez vous connecter sur votre compte et en autoriser l\'accรจs ร <b>c:geo</b>. C\'est tout.</string> + <string name="auth_dialog_completed_twitter">c:geo est maintenant autorisรฉ ร poster sur Twitter.</string> <string name="auth_ocde">opencaching.de</string> <string name="auth_ocpl">opencaching.pl</string> - <string name="auth_authorize_oc">Autoriser c:geo</string> - <string name="auth_start_oc">Commencer l\'autorisation</string> - <string name="auth_again_oc">Recommencer</string> - <string name="auth_pin_hint_oc">Code donnรฉ par %s</string> - <string name="auth_finish_oc">Terminer</string> - <string name="auth_dialog_wait_oc">En attente de %sโฆ</string> - <string name="auth_dialog_pin_title_oc">Code PIN</string> - <string name="auth_dialog_pin_message_oc">Veuillez saisir votre code PIN fourni par %s. Il est nรฉcessaire pour finaliser l\'autorisation.</string> <string name="auth_dialog_completed_oc">c:geo est dรฉsormais autorisรฉ ร interagir avec %s.</string> - <string name="about_auth_1_oc">La procรฉdure suivante permet ร <b>c:geo</b> d\'accรฉder ร %s - si vous acceptez.</string> - <string name="about_auth_2_oc">Cliquer sur le bouton \"dรฉbut d\'autorisation\" pour dรฉmarrer. Une fenรชtre de navigateur va s\'ouvrir pour vous connecter sur %s. Accepter pour que <b>c:geo</b> accรจde ร votre compte. %s vous affichera alors un code PIN composรฉ de chiffres. Merci de recopier ce code dans <b>c:geo</b> et de confirmer. C\'est tout.</string> <string name="cache_offline">Hors ligne</string> <string name="cache_offline_refresh">Recharger</string> <string name="cache_offline_drop">Effacer</string> @@ -798,6 +785,7 @@ <string name="destination_set">Dรฉfinir une destination</string> <string name="navigation_direct_navigation">Navigation directe</string> <string name="navigation_target">Cible</string> + <string name="err_nav_no_coordinates">Impossible de dรฉmarrer la navigation en l\'absence de coordonnรฉes</string> <string name="license">Licence</string> <string name="license_show">Afficher la licence</string> <string name="license_dismiss">Rejeter</string> diff --git a/main/res/values-hu/strings.xml b/main/res/values-hu/strings.xml index d2ae86c..3c63b2e 100644 --- a/main/res/values-hu/strings.xml +++ b/main/res/values-hu/strings.xml @@ -290,7 +290,6 @@ <!-- caches lists --> <string name="list_menu">Lista</string> <string name="list_menu_create">รj lista lรฉtrehozรกsa</string> - <string name="list_menu_all_lists">Az รถsszes lรกda</string> <string name="list_menu_drop">Jelenlegi lista elvetรฉse</string> <string name="list_menu_change">Lista megvรกltoztatรกsa</string> <string name="list_menu_rename">Az aktuรกlis lista รกtnevezรฉse</string> @@ -328,7 +327,7 @@ <string name="init_login_popup_ok">Belรฉpรฉs ok.</string> <string name="init_login_popup_failed">Belรฉpรฉs sikertelen.</string> <string name="init_login_popup_failed_reason">Belรฉpรฉs sikertelen, mert </string> - <string name="init_twitter_authorize">Engedรฉlyezรฉs</string> + <string name="settings_authorize">Engedรฉlyezรฉs</string> <string name="init_signature">Alรกรญrรกs</string> <string name="init_signature_help_text">Add meg az alรกรญrรกsod amit a bejegyzรฉs szรถvegรฉben szeretnรฉl hasznรกlni.\nHasznรกlhatรณ speciรกlis cรญmkรฉk: [DATE] , [TIME], [DATETIME], [USER] & [NUMBER].\nEzek az alรกรญrรกs beillesztรฉse utรกn vรกlnak lรกthatรณvรก.</string> <string name="init_signature_template_button">Sablon beillesztรฉse</string> @@ -438,12 +437,7 @@ <string name="auth_authorize">Hozzรกfรฉrรฉs engedรฉlyezรฉse a c:geo-nak</string> <string name="auth_start">Engedรฉlyezรฉs indรญtรกsa</string> <string name="auth_again">Engedรฉlyezรฉs indรญtรกsa รบjra</string> - <string name="auth_pin_hint">PIN hozzรกrendelve a Twitter รกltal</string> <string name="auth_finish">Befejezรฉs</string> - <string name="auth_dialog_wait">Vรกrakozรกs a Twitterreโฆ</string> - <string name="auth_dialog_pin_title">PIN kรณd</string> - <string name="auth_dialog_pin_message">Kรฉrlek รญrd be a PIN kรณdot amit a Twittertลl kaptรกl. Ez szรผksรฉges lรฉpรฉs az engedรฉlyezรฉs befejezรฉsรฉhez.</string> - <string name="auth_dialog_completed">A c:geo engedรฉlyt kapott, hogy bejegyzรฉseket kรผldjรถn a Twitterre.</string> <!-- cache --> <plurals name="cache_counts"> @@ -922,8 +916,6 @@ <string name="twitter">Twitter: <a href="">@android_GC</a></string> <string name="nutshellmanual">Kรฉzikรถnyv: <a href="">A c:geo diรณhรฉjban</a></string> <string name="about_twitter">Akarod, hogy <b>c:geo</b> รบj bejegyzรฉst รญrjon Twitterre mindig mikor egy lรกdรกt megtalรกlsz?</string> - <string name="about_auth_1">A kรถvetkezล folyamat engedรฉlyezi a <b>c:geo</b>-nak, hogy hozzรกfรฉrjen a Twitterhez โ ha jรณvรกhagyod.</string> - <string name="about_auth_2">Kattints a \"c:geo engedรฉlyezรฉse\" gombra, hogy elindรญtsd a folyamatot. Ez a folyamat meg fog nyitni egy bรถngรฉszลt a Twitter weboldallal. Lรฉpj be ezen az oldalon รฉs hagyd jรณvรก, hogy a <b>c:geo</b> hozzรกfรฉrjen a felhasznรกlรณi fiรณkodhoz. Ha elfogadod, a Twitter mutatni fog egy szรกmokbรณl รกllรณ PIN kรณdot. Ezt a PIN kรณdot kell a <b>c:geo</b>-ban beillesztened รฉs jรณvรกhagynod. Ilyen egyszerลฑ.</string> <!-- status --> <string name="status_new_release" tools:ignore="UnusedResources">รj kiadรกs talรกlhatรณ.\nKattints a telepรญtรฉshez.</string> diff --git a/main/res/values-it/strings.xml b/main/res/values-it/strings.xml index f5774fe..d8142a8 100644 --- a/main/res/values-it/strings.xml +++ b/main/res/values-it/strings.xml @@ -1,1117 +1,1078 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="utf-8"?> +<!--Generated by crowdin.net--> <resources xmlns:tools="http://schemas.android.com/tools"> - - <string name="app_name">c:geo</string> - - <!-- basics --> - <string name="cache">Cache</string> - <string name="detail">Dettaglio</string> - <string name="search">Cerca</string> - <string name="settings_titlebar">c:geo Settaggi</string> - <string name="helpers">Apps utili</string> - <string name="about">Info c:geo</string> - <string name="latitude">Latitudine</string> - <string name="longitude">Longitudine</string> - - <!-- actionbar --> - <string name="action_bar_share_title">Condividi link al cache</string> - - <!-- caches --> - <string name="all_types">Tutti i tipi di cache</string> - <string name="traditional">Traditional cache</string> - <string name="multi">Multi-cache</string> - <string name="mystery">Mystery cache</string> - <string name="letterbox">Letterbox hybrid</string> - <string name="event">Event cache</string> - <string name="mega">Mega-event cache</string> - <string name="earth">Earthcache</string> - <string name="cito">Evento Cache In Trash Out</string> - <string name="webcam">Webcam cache</string> - <string name="virtual">Virtual cache</string> - <string name="wherigo">Wherigo cache</string> - <string name="lostfound">Lost & Found</string> - <string name="ape">Project Ape cache</string> - <string name="gchq">Groundspeak hq</string> - <string name="gps">Fiera GPS cache</string> - <string name="block">Groundspeak Block Party</string> - <string name="unknown">Tipo sconosciuto</string> - - <!-- cache sizes --> - <string name="cache_size_micro">micro</string> - <string name="cache_size_small">small</string> - <string name="cache_size_regular">regular</string> - <string name="cache_size_large">large</string> - <string name="cache_size_other">altro</string> - <string name="cache_size_virtual">virtual</string> - <string name="cache_size_notchosen">non selezionato</string> - <string name="cache_size_unknown">sconosciuto</string> - - <!-- waypoints --> - <string name="wp_final">Destinazione finale</string> - <string name="wp_stage">Step intermedio multi-cache</string> - <string name="wp_puzzle">Quesito da risolvere</string> - <string name="wp_pkg">Area parcheggio</string> - <string name="wp_trailhead">Partenza percorso</string> - <string name="wp_waypoint">Punto di riferimento</string> - <string name="wp_original">Coordinate originali</string> - - <!-- logs --> - <string name="log_found">Trovato</string> - <string name="log_dnf">Non trovato (DNF)</string> - <string name="log_note">Note</string> - <string name="log_published">Pubblicato</string> - <string name="log_enabled">Attivo</string> - <string name="log_disabled">Non attivo</string> - <string name="log_attend">Parteciperร </string> - <string name="log_attended">Partecipato</string> - <string name="log_retrieved">Prelevato</string> - <string name="log_placed">Inserito</string> - <string name="log_grabbed">Prelevato da qualche parte</string> - <string name="log_movecollection">Sposta in collezione</string> - <string name="log_moveinventory">Sposta in inventario</string> - <string name="log_maintained">Manutenzione effettuata</string> - <string name="log_maintenance_needed">Richiede manutenzione</string> - <string name="log_update">Coordinate aggiornate</string> - <string name="log_archived">Archiviato</string> - <string name="log_unarchived">Reinserito</string> - <string name="log_needs_archived">Necessita archiviazione</string> - <string name="log_discovered">Scoperto</string> - <string name="log_reviewer">Nota del reviewer</string> - <string name="log_retractlisting">Ritirato</string> - <string name="log_marked_missing">Segnalato come mancante</string> - <string name="log_tb_nothing">Non fare nulla</string> - <string name="log_tb_visit">Visitato</string> - <string name="log_tb_drop">Lasciato</string> - <string name="log_tb_changeall">Cambia tutto</string> - <string name="log_save">Salva</string> - <string name="log_saving">Invio logโฆ</string> - <string name="log_saving_and_uploading">Invio log e immagineโฆ</string> - <string name="log_clear">Azzera</string> - <string name="log_post">Invia log</string> - <string name="log_post_rate">Invia log + voto</string> - <string name="log_post_no_rate">Invia log senza voto</string> - <string name="log_post_not_possible">Connessioneโฆ</string> - <string name="log_add">Aggiungi</string> - <string name="log_rating">Voto</string> - <string name="log_no_rating">Nessun voto</string> - <string name="log_stars_1">1 stella</string> - <string name="log_stars_15">1.5 stelle</string> - <string name="log_stars_2">2 stelle</string> - <string name="log_stars_25">2.5 stelle</string> - <string name="log_stars_3">3 stelle</string> - <string name="log_stars_35">3.5 stelle</string> - <string name="log_stars_4">4 stelle</string> - <string name="log_stars_45">4.5 stelle</string> - <string name="log_stars_5">5 stelle</string> - <string name="log_stars_1_description">proprio brutto</string> - <string name="log_stars_15_description">abbastanza brutto</string> - <string name="log_stars_2_description">bruttino</string> - <string name="log_stars_25_description">sotto la media</string> - <string name="log_stars_3_description">nella media</string> - <string name="log_stars_35_description">non male</string> - <string name="log_stars_4_description">bene</string> - <string name="log_stars_45_description">molto bene</string> - <string name="log_stars_5_description">favoloso</string> - <string name="log_webcam">Scattata foto Webcam</string> - <string name="log_new_log">Log</string> - <string name="log_new_log_text">Testo Log</string> - <string name="log_announcement">Annuncio</string> - <string name="log_today">Oggi</string> - <string name="log_yesterday">Ieri</string> - <string name="log_smilies">Smile</string> - <string name="log_image">Immagine</string> - <string name="log_image_attach">Aggiungi immagine</string> - <string name="log_image_edit">Modifica immagine</string> - <string name="log_image_stored">Esistente</string> - <string name="log_image_camera">Nuova</string> - <string name="log_image_caption">Didascalia</string> - <string name="log_image_description">Descrizione</string> - <string name="log_image_scale">Ridimensiona</string> - - <string-array name="log_image_scales"> - <item>Dimensioni originali</item> - <item>512 px</item> - <item>640 px</item> - <item>800 px</item> - <item>1024 px</item> - </string-array> - - <!-- translation --> - <string name="translate_to_sys_lang">Traduci in %s</string> - <string name="translate_to_english">Traduci in inglese</string> - <string name="translate_length_warning">La traduzione puรฒ fallire quando c\'รจ molto testo.</string> - - <!-- errors, warnings, info toasts --> - <string name="err_none">Ok</string> - <string name="err_start">Comunicazione non avviata</string> - <string name="err_parse">Errore analizzando la pagina di login</string> - <string name="err_server">Connessione fallita con Geocaching.com (server o connessione non disponibile?)</string> - <string name="err_login">Informazioni di login non memorizzate</string> - <string name="err_login_failed">c:geo non puรฒ effettuare login.</string> - <string name="err_login_failed_toast">c:geo non puรฒ effettuare login. Attivata la modalitร offline. Verificare le informazioni di login nei settaggi o abilitare una connessione internet.</string> - <string name="err_unknown">Errore sconosciuto</string> - <string name="err_comm">Errore sconosciuto di comunicazione</string> - <string name="err_missing_auth">username e/o password non settati.</string> - <string name="err_wrong">Informazioni di login errate</string> - <string name="err_maintenance">Geocaching.com รจ in manutenzione, riprovare piรน tardi. Attivata la modalitร offline.</string> - <string name="err_license">L\'utente non ha approvato le condizione del Geocaching.com license agreement, cosรฌ c:geo non puรฒ caricare le coordinate dei cache.</string> - <string name="err_unvalidated_account">Come prima cosa devi convalidare il tuo account su Geocaching.com.</string> - <string name="err_unpublished">Il cache richiesto รจ stato ritirato</string> - <string name="err_premium_only">Cache disponibile solo per utenti premium di Geocaching.com</string> - <string name="err_detail_open">c:geo non puรฒ aprire i dettagli del cache.</string> - <string name="err_detail_cache">c:geo non puรฒ visualizzare il cache richiesto. ร veramente un geocache?</string> - <string name="err_detail_cache_find">c:geo non trova il geocache</string> - <string name="err_detail_cache_find_some">c:geo non trova quel geocache.</string> - <string name="err_detail_cache_find_any">c:geo non trova nessun geocache.</string> - <string name="err_detail_cache_forgot">c:geo ha dimenticato quale geocache hai richiesto.</string> - <string name="err_detail_google_maps_limit_reached">c:geo non riesce a scaricare le mappe statiche. Forse raggiunto il limite di google map. Riprova domani.</string> - <string name="err_detail_no_spoiler">c:geo non trova alcuna immagine spoiler per questo cache.</string> - <string name="err_detail_no_map_static">c:geo non trova alcuna mappa statica per questo cache.</string> - <string name="err_detail_not_load_map_static">c:geo non riesce a caricare la mappe statiche.</string> - <string name="err_detail_still_working">Momentaneamente occupato a svolgere un altro compito.</string> - <string name="err_watchlist_still_managing">Sto ancora gestendo la tua watchlist.</string> - <string name="err_watchlist_failed">La modifica alla tua watchlist รจ fallita.</string> - <string name="err_application_no">c:geo non trova nessuna applicazione compatibile.</string> - <string name="err_auth_initialize">c:geo ha fallito l\'inizializzazione del processo di autorizzazione.</string> - <string name="err_auth_process">Processo di autorizzazione fallito.</string> - <string name="err_cannot_log_visit">c:geo non ha abbastanza informazioni per salvare il log. Per cortesia effettuarlo dalla pagina dei dettagli completi del cache.</string> - <string name="err_download_fail">c:geo ha fallito il download dei cache perchรฉ </string> - <string name="err_dwld_details_failed">c:geo ha fallito il download dei dettagli del cache.</string> - <string name="err_load_descr_failed">c:geo non puรฒ caricare la descrizione.</string> - <string name="err_location_unknown">c:geo non conosce la posizione dei cache.</string> - <string name="err_missing_device_name">Per cortesia inserire il nome del dispositivo prima di registrarsi.</string> - <string name="err_favorite_failed">Errore nella modifica dello stato preferiti.</string> - <string name="err_select_logimage_failed">La selezione dell\'immagine per il log รจ fallita.</string> - <string name="err_acquire_image_failed">Acquisizione immagine fallita.</string> - <string name="err_tb_display">c:geo non riesce a visualizzare il trackable che vuoi. ร veramente un trackable?</string> - <string name="err_tb_details_open">c:geo non riesce ad aprire i dettagli del trackable.</string> - <string name="err_tb_forgot_saw">c:geo ha dimenticato quale trackable vedevi.</string> - <string name="err_tb_find">c:geo non trova nessun trackable</string> - <string name="err_tb_find_that">c:geo non trova quel trackable.</string> - <string name="err_waypoint_cache_unknown">c:geo non conosce a quale cache vuoi aggiungere un waypoint.</string> - <string name="err_waypoint_add_failed">c:geo non รจ riuscito ad aggiungere il tuo waypoint.</string> - <string name="err_point_unknown_position">c:geo non capisce dove ti trovi.</string> - <string name="err_point_no_position_given_title">Info richieste</string> - <string name="err_point_no_position_given">Inserisci almeno latitudine, o longitudine, o distanza e angolo. Puoi anche inserire tutti e quattro i valori.</string> - <string name="err_point_curr_position_unavailable">c:geo non ha le coordinate attuali. Attendere, pregoโฆ</string> - <string name="err_point_bear_and_dist_title">Necessiti di aiuto?</string> - <string name="err_point_bear_and_dist">Inserisci angolo e distanza. Angolo specifica un valore in gradi tra 0 e 360 relativo al nord. La distanza puรฒ avere (o no) l\'unitร di misura.</string> - <string name="err_log_load_data">c:geo non riesce a caricare i dati necessari per salvare il log della tua visita.</string> - <string name="err_log_load_data_again">c:geo non riesce a caricare i dati necessari per salvare il log della tua visita. Nuovo tentativo in corso.</string> - <string name="err_log_load_data_still">c:geo sta ancora caricando i dati necessari per salvare il log. Per cortesia attendere ancora un pochino.</string> - <string name="err_log_failed_server">c:geo non รจ riuscito ad inviare il log perchรฉ il server non risponde.</string> - <string name="err_log_post_failed">Sembra che il log non sia stato inviato. Prego verificare su Geocaching.com.</string> - <string name="err_logimage_post_failed">Sembra la l\'immagine non sia stata caricata. Si prega di controllare su Geocaching.com.</string> - <string name="err_search_address_forgot">c:geo ha dimenticato l\'indirizzo che vuoi trovare.</string> - <string name="err_parse_lat">c:geo non riesce ad interpretare la latitudine.</string> - <string name="err_parse_lon">c:geo non riesce ad interpretare la longitudine.</string> - <string name="err_parse_dist">c:geo non riesce ad interpretare la distanza.</string> - <string name="err_parse_lat_lon">c:geo non riesce ad interpretare la latitudine o la longitudine.</string> - <string name="warn_save_nothing">Non c\'รจ nulla da salvare.</string> - <string name="warn_no_cache_coord">Non ci sono cache con coordinate.</string> - <string name="warn_no_coordinates">Coordinate non fornite.</string> - <string name="warn_no_keyword">Parola chiave non fornita.</string> - <string name="warn_no_username">Nome utente non fornito.</string> - <string name="warn_search_help_title">Necessiti di aiuto?</string> - <string name="warn_search_help_address">Inserisci indirizzo o nome di luogo. Per esempio, usa un indirizzo simile a questo: \"Via Alessandro Volta, 1, Milano, Italia\", oppure solo la cittร come \"Milano\" o di un luogo famoso come ad esempio \"Colosseo\".</string> - <string name="warn_search_help_gccode">Inserisci il codice del geocache. Per esempio \"GC1VCAZ\".</string> - <string name="warn_search_help_keyword">Inserisci delle parole che supponi siano citate da qualche parte all\'interno del cache che vuoi trovare.</string> - <string name="warn_search_help_user">Inserisci il nome dell\'utente di Geocaching.com.</string> - <string name="warn_search_help_tb">Inserisci il codice del trackable. Per esempio \"TB29QMZ\".</string> - <string name="warn_log_text_fill">Prego, inserire del testo nel log.</string> - <string name="warn_load_images">c:geo non riesce a caricare immagini.</string> - <string name="warn_invalid_mapfile">La mappa selezionata non รจ mapsforge versione 0.3.0.\nMappa offline non disponibile.</string> - <string name="warn_deprecated_mapfile">Stai usando una vecchia mappa 0.2.4.\nAggiornala alla 0.3.0 appena puoi.\nIl supporto alla 0.2.4 sarร rimosso nella prossima versione.</string> - <string name="warn_nonexistant_mapfile">La mappa selezionata non esiste.\nMappa offline non disponibile.</string> - <string name="warn_rendertheme_missing">Tema mappa non trovato.</string> - <string name="info_log_posted">c:geo ha inviato il log con successo.</string> - <string name="info_log_saved">c:geo ha salvato il log.</string> - <string name="info_log_cleared">Il log รจ stato azzerato.</string> - <string name="info_log_type_changed">Il tipo di log รจ cambiato!</string> - <string name="info_select_logimage_cancelled">Selezione o cattura immagine annnulata.</string> - <string name="info_stored_image">Nuova immagine salvata su:</string> - <string name="info_storing_static_maps">Tento di salvare la static map</string> - - <!-- location service --> - <string name="loc_last">Ultima nota</string> - <string name="loc_net">Network</string> - <string name="loc_gps">GPS</string> - <string name="loc_sat">Sat</string> - <string name="loc_trying">Localizzazione in corso</string> - <string name="loc_no_addr">Indirizzo sconosciuto</string> - <string name="loc_gps_disabled">GPS non attivo</string> - - <!-- standard menu --> - <string name="menu_about">Info c:geo</string> - <string name="menu_helpers">Programmi utili</string> - <string name="menu_settings">Settaggi</string> - <string name="menu_history">Cronologia</string> - <string name="menu_filter">Filtri</string> - <string name="menu_scan_geo">Scan geocode</string> - - <!-- main screen --> - <string name="live_map_button">Mappa</string> - <string name="caches_nearby_button">Vicini</string> - <string name="advanced_search_button">Cerca</string> - <string name="stored_caches_button">Salvati</string> - <string name="any_button">Ovunque</string> - <string name="unknown_scan">Nessun geo code trovato nello scan.</string> - - <!-- caches --> - <string name="caches_no_cache">Non ci sono cache</string> - <string name="caches_more_caches">Carica altri cache</string> - <string name="caches_more_caches_no">Nessun\'altro cache</string> - <string name="caches_more_caches_loading">Caricamento dei cacheโฆ</string> - <string name="caches_more_caches_currently">attualmente</string> - <string name="caches_downloading">Download cache in corsoโฆ\nETA: </string> - <string name="caches_eta_ltm">Meno di un minuto</string> - - <plurals name="caches_eta_mins"> - <item quantity="one">minuto</item> - <item quantity="other">minuti</item> - </plurals> - - <string name="caches_store_offline">Salva per Offline</string> - <string name="caches_store_selected">Salva selezionati</string> - <string name="caches_history">Cronologia</string> - <string name="caches_on_map">Visualizza sulla mappa</string> - <string name="caches_sort">Ordina</string> - <string name="caches_sort_title">Ordina per</string> - <string name="caches_sort_distance">Distanza</string> - <string name="caches_sort_difficulty">Difficoltร </string> - <string name="caches_sort_terrain">Terreno</string> - <string name="caches_sort_size">Dimensione</string> - <string name="caches_sort_favorites">Popolaritร </string> - <string name="caches_sort_name">Nome</string> - <string name="caches_sort_geocode">Geo Code</string> - <string name="caches_sort_rating">Voto</string> - <string name="caches_sort_vote">Il tuo voto</string> - <string name="caches_sort_inventory">Oggetti trackables</string> - <string name="caches_sort_date_hidden">Data</string> - <string name="caches_sort_date_logged">Data Log</string> - <string name="caches_sort_finds">Numero ritrovamenti</string> - <string name="caches_sort_state">Stato</string> - <string name="caches_sort_storage">Data salvataggio</string> - <string name="caches_select_mode">Modo Selezione</string> - <string name="caches_select_mode_exit">Esci dal modo Selezione</string> - <string name="caches_select_invert">Inverti selezione</string> - <string name="caches_nearby">Qui vicino</string> - <string name="caches_manage">Gestisci</string> - <string name="caches_drop_selected">Elimina selezionati</string> - <string name="caches_drop_selected_ask">Vuoi rimuovere i cache selezionati dal dispositivo?</string> - <string name="caches_drop_all">Elimina tutti</string> - <string name="caches_drop_all_ask">Vuoi rimuovere tutti i cache dalla lista corrente?</string> - <string name="caches_drop_stored">Elimina i cache salvati</string> - <string name="caches_drop_progress">Eliminando caches</string> - <string name="caches_drop_all_and_list">Elimina tutti ed elimina la lista</string> - <string name="caches_delete_events">Cancella eventi passati</string> - <string name="caches_refresh_selected">Aggiorna i cache selezionati</string> - <string name="caches_refresh_all">Aggiorna tutti</string> - <string name="caches_move_selected">Muovi i cache selezionati</string> - <string name="caches_move_all">Muovi tutti</string> - <string name="caches_map_locus">Locus</string> - <string name="caches_map_locus_export">Esporta in Locus</string> - <string name="caches_recaptcha_title">reCAPTCHA</string> - <string name="caches_recaptcha_explanation">Per cortesia riporta il testo letto sull\'immagine. ร importante per scaricare le coordinate dei cache. ร tuttavia opzionale e puรฒ essere disattivato nei settaggi.</string> - <string name="caches_recaptcha_hint">Testo da immagine</string> - <string name="caches_recaptcha_continue">Continua</string> - <string name="caches_filter">Filtra</string> - <string name="caches_filter_title">Filtra per</string> - <string name="caches_filter_size">Dimensione</string> - <string name="caches_filter_type">Tipo</string> - <string name="caches_filter_track">Con oggetti trackables</string> - <string name="caches_filter_clear">Rimuovi filtri</string> - <string name="caches_filter_modified">Con coordinate modificate</string> - <string name="caches_filter_origin">Origine</string> - <string name="caches_removing_from_history">Rimozione dalla cronologiaโฆ</string> - <string name="caches_clear_offlinelogs">Cancella i log offline</string> - <string name="caches_clear_offlinelogs_progress">Cancellazione logs offline</string> - - <!-- caches lists --> - <string name="list_menu">Lista</string> - <string name="list_menu_create">Crea nuova lista</string> - <string name="list_menu_all_lists">Tutte i cache</string> - <string name="list_menu_drop">Elimina la lista corrente</string> - <string name="list_menu_change">Cambia lista</string> - <string name="list_menu_rename">Rinomina la lista corrente</string> - <string name="list_title">Seleziona una lista</string> - <string name="list_inbox">Salvate</string> - <string name="list_all_lists">Tutti i cache</string> - <string name="list_dialog_create_title">Nuova lista</string> - <string name="list_dialog_create">Crea</string> - <string name="list_dialog_cancel">Annulla</string> - <string name="list_dialog_create_ok">Lista creata</string> - <string name="list_dialog_create_err">c:geo non รจ riuscito a creare la lista</string> - <string name="list_dialog_remove_title">Rimuovi lista</string> - <string name="list_dialog_remove_description">Vuoi rimuovere la lista corrente? Tutti i cache contenuti verranno spostate nella lista base \"Salvati\".</string> - <string name="list_dialog_remove">Rimuovi</string> - <string name="list_dialog_remove_ok">Lista rimossa</string> - <string name="list_dialog_remove_err">c:geo non รจ riuscito a rimuovere la lista corrente</string> - <string name="list_dialog_rename_title">Rinomina lista</string> - <string name="list_dialog_rename">Rinomina</string> - - <!-- about --> - <string name="about_version">Versione</string> - <string name="about_changelog">Modifiche</string> - <string name="about_donate">Donazioni</string> - <string name="about_donation_more">Donazione\nsviluppo</string> - <string name="about_contributors">Contributori</string> - - <!-- init --> - <string name="init_oc">opencaching.de</string> - <string name="init_oc_de_description">Autorizza c:geo a cercare cache ed accedere/filtrare i ritrovamenti su opencaching.de</string> - <string name="init_register_oc_de">Autorizza c:geo</string> - <string name="init_gcvote">GCvote.com</string> - <string name="init_twitter">Twitter</string> - <string name="init_username">Utente</string> - <string name="init_password">Password</string> - <string name="init_login">Verifica login</string> - <string name="init_login_popup">Login</string> - <string name="init_login_popup_working">Loggingโฆ</string> - <string name="init_login_popup_ok">Login OK.</string> - <string name="init_login_popup_failed">Login fallito.</string> - <string name="init_login_popup_failed_reason">Login fallito perchรฉ </string> - <string name="init_twitter_authorize">Autorizza c:geo</string> - <string name="init_signature">Firma</string> - <string name="init_signature_help_text">Scrivi la tua firma da usare nei testi di log.\nStringhe speciali possono essere usate come: [DATE], [TIME], [DATETIME], [USER] e [NUMBER].\nSaranno espanse quando la firma viene inserita.</string> - <string name="init_signature_template_button">Stringhe speciali</string> - <string name="init_signature_template_date">Data</string> - <string name="init_signature_template_time">Ora</string> - <string name="init_signature_template_datetime">Data e Ora</string> - <string name="init_signature_template_user">Utente</string> - <string name="init_signature_template_number">Numero cache</string> - <string name="init_signature_template_owner">Proprietario</string> - <string name="init_ratingwanted">Carica il rating del cache da GCvote.com</string> - <string name="init_summary_ratingwanted">Carica il rating del cache da GCvote.com</string> - <string name="init_friendlogswanted">Carica logbook addizionale con i log dei miei amici</string> - <string name="init_summary_friendlogswanted">Carica logbook addizionale con i log dei miei amici</string> - <string name="init_openlastdetailspage">Ricorda l\'ultima pagina usata nei dettagli</string> - <string name="init_summary_openlastdetailspage">Ricorda l\'ultima pagina usata nei dettagli</string> - <string name="init_autoload">Carica automaticamente descrizione estesa</string> - <string name="init_summary_autoload">Carica automaticamente descrizione estesa</string> - <string name="init_skin">Tema chiaro\n(richiede riavvio di c:geo)</string> - <string name="init_summary_skin">Tema chiaro\n(richiede riavvio di c:geo)</string> - <string name="init_address">Visualizza indirizzo invece delle coordinate su pagina principale</string> - <string name="init_summary_address">Visualizza indirizzo invece delle coordinate su pagina principale</string> - <string name="init_captcha">Visualizza CAPTCHA se necessario (solo utenti base, non Premium)</string> - <string name="init_summary_captcha">Visualizza CAPTCHA se necessario (solo utenti base, non Premium)</string> - <string name="init_useenglish">Usa sempre English in c:geo\n(richiede riavvio)</string> - <string name="init_summary_useenglish">Usa sempre English in c:geo\n(richiede riavvio)</string> - <string name="init_exclude">Escludi i miei cache e queli che ho giร trovato</string> - <string name="init_summary_exclude">Escludi i miei cache e queli che ho giร trovato</string> - <string name="init_showwaypoints">Mostra waypoints sulla mappa</string> - <string name="init_showwaypoint_description">Se sulla mappa sono mostrati meno cache di quelli indicati, saranno mostrati anche i relativi waypoints.</string> - <string name="init_disabled">Escludi cache disattivati</string> - <string name="init_summary_disabled">Escludi cache disattivati</string> - <string name="init_offline">Salva le mappe per uso offline</string> - <string name="init_summary_offline">Salva le mappe per uso offline</string> - <string name="init_offline_wp">Salva i waypoints delle mappe per uso offline</string> - <string name="init_summary_offline_wp">Salva i waypoints delle mappe per uso offline</string> - <string name="init_save_log_img">Salva immagini contenute nei log</string> - <string name="init_summary_save_log_img">Salva immagini contenute nei log</string> - <string name="init_units">Usa miglia/piedi</string> - <string name="init_summary_units">Usa miglia/piedi</string> - <string name="init_log_offline">Attiva log offline (non visualizzerร lo schermo di log online, non invierร subito il log)</string> - <string name="init_summary_log_offline">Attiva log offline (non visualizzerร lo schermo di log online, non invierร subito il log)</string> - <string name="init_choose_list">Chiedi la lista quando salvi un cache</string> - <string name="init_summary_choose_list">Chiedi la lista quando salvi un cache</string> - <string name="init_livelist">Visualizza in che direzione sono i cache, nelle liste</string> - <string name="init_summary_livelist">Visualizza in che direzione sono i cache, nelle liste</string> - <string name="init_backup">Backup</string> - <string name="init_backup_backup">Backup</string> - <string name="init_backup_running">Creazione del backup del database dei cache in corsoโฆ</string> - <string name="init_backup_note">Si prega di notare che questa opzione farร backup o ripristino del database contenente i cache ed i waypoint, ma non i settaggi. Quindi le tue informazioni di login non lasceranno mai questo dispositivo.</string> - <string name="init_backup_restore">Ripristino</string> - <string name="init_backup_success">Il database di c:geo รจ stato salvato con successo nel file</string> - <string name="init_backup_failed">Backup del database di c:geo fallito.</string> - <string name="init_backup_unnecessary">Il database รจ vuoto, il backup non รจ necessario.</string> - <string name="init_restore_success">Ripristino completato.</string> - <string name="init_restore_failed">Ripristino fallito.</string> - <string name="init_restore_running">Ripristino del database dei cacheโฆ</string> - <string name="init_restore_confirm">Il database รจ vuoto. Vuoi ripristinare il backup?</string> - <string name="init_backup_last">Disponibile Backup delle</string> - <string name="init_backup_last_no">Non esiste il file con il backup.</string> - <string name="init_mapsource_select">Seleziona il tipo di mappa</string> - <string name="init_map_directory_description">Cartella con le mappe offline</string> - <string name="init_gpx_exportdir">Cartella di export GPX</string> - <string name="init_gpx_importdir">Cartella di import GPX</string> - <string name="init_maptrail">Mostra la scia nella Mappa</string> - <string name="init_summary_maptrail">Mostra la scia nella Mappa</string> - <string name="init_share_after_export">Apri menu condividi dopo export GPX</string> - <string name="init_trackautovisit">Setta i miei oggetti Trackables automaticamente su \"visit\" quando invio log</string> - <string name="init_summary_trackautovisit">Setta i miei oggetti Trackables automaticamente su \"visit\" quando invio log</string> - <string name="init_sigautoinsert">Inserisce automaticamente</string> - <string name="init_loaddirectionimg">Carica le immagini di direzione se necessario</string> - <string name="init_summary_loaddirectionimg">Carica le immagini di direzione se necessario</string> - <string name="init_default_navigation_tool">Navigatore preferito</string> - <string name="init_default_navigation_tool_description">Qui puoi scegliere il tuo strumento di navigazione preferito. Sarร attivato cliccando l\'icona di navigazione vicino al titolo del cache.</string> - <string name="init_default_navigation_tool_select">Scegli navigatore</string> - <string name="init_default_navigation_tool_2_description">Qui puoi scegliere il tuo secondo navigatore preferito. Sarร attivato tenendo premuto l\'icona di navigazione vicino al titolo del cache.</string> - <string name="init_debug_title">Informazioni di Debug</string> - <string name="init_debug_note">c:geo puรฒ generare molte informazioni di debug. Per quanto queste informazioni non sono generalmente utili agli utenti di c:geo, gli sviluppatori potrebbero averne bisogno per analizzare un eventuale problema. In questo caso, vi sarร chiesto di settare l\'opzione sottostante ed inviare il log.</string> - <string name="init_debug">Genera informazioni di debug</string> - <string name="init_dbonsdcard_title">Posizione Database</string> - <string name="init_dbonsdcard_note">Puoi decidere di salvare il database su memoria esterna. In questo caso risparmierai memoria interna ma potresti perdere un pochino di velocitร e c:geo non funzionerร se la tua sdcard non sarร disponibile.</string> - <string name="init_dbonsdcard">Su memoria esterna</string> - <string name="init_dbmove_dbmove">Spostamento Database</string> - <string name="init_dbmove_running">Spostamento Database</string> - <string name="init_dbmove_success">Database spostato con successo.</string> - <string name="init_dbmove_failed">Spostamento fallito</string> - <string name="init_plain_logs">Visualizza i LOG senza colori</string> - <string name="init_summary_plain_logs">Visualizza i LOG senza colori</string> - <string name="init_use_native_ua">Identifica come browser Android. Risolve alcuni problemi di login con alcuni provider di rete.</string> - <string name="init_summary_use_native_ua">Identifica come browser Android. Risolve alcuni problemi di login con alcuni provider di rete.</string> - <!-- map sources --> - <string name="map_source_google_map">Google: Map</string> - <string name="map_source_google_satellite">Google: Satellite</string> - <string name="map_source_osm_mapnik">OSM: Mapnik</string> - <string name="map_source_osm_cyclemap">OSM: Cyclemap</string> - <string name="map_source_osm_offline">Offline</string> - <string name="init_sendToCgeo">Send to c:geo</string> - <string name="init_sendToCgeo_name">Nome dispositivo</string> - <string name="init_sendToCgeo_description">\"Send to c:geo\" permette di ricevere cache direttamente dal sito geocaching.com tramite un plugin speciale per Firefox o Chrome. Prima della registrazione leggere <a href="http://send2.cgeo.org/">http://send2.cgeo.org/</a>. ร necessario registrare questo dispositivo solo se intendi usare send2cgeo. C:geo funzionerร anche senza questa registrazione e senza send2cgeo.</string> - <string name="init_sendToCgeo_register">Richiedi registrazione</string> - <string name="init_sendToCgeo_registering">Registrazione in corso a \"Send to c:geo\"โฆ</string> - <string name="init_sendToCgeo_register_ok">Registrazione terminata. Il tuo PIN code รจ ####. Usalo sul sito di c:geo per aggiungere il dispositivo al tuo browser Firefox o Chrome.</string> - <string name="init_sendToCgeo_register_fail">Registrazione fallita.</string> - <string name="sendToCgeo_download_fail">c:geo non riesce a scaricare cache. Nessuna connessione internet o server send2c:geo non attivo.</string> - <string name="sendToCgeo_no_registration">c:geo non riesce a scaricare cache. La registrazione a send2c:geo รจ scaduta. Si prega di ripeterla nei settaggi.</string> - - <!-- auth --> - <string name="auth_twitter">Twitter</string> - <string name="auth_authorize">Autorizza c:geo</string> - <string name="auth_start">Avvia autorizzazione</string> - <string name="auth_again">Avvia ancora</string> - <string name="auth_pin_hint">PIN assegnato da Twitter</string> - <string name="auth_finish">Fine</string> - <string name="auth_dialog_wait">In attesa di Twitterโฆ</string> - <string name="auth_dialog_pin_title">Codice PIN</string> - <string name="auth_dialog_pin_message">Prego inserire il codice PIN fornito dal sito Twitter. ร necessario per completare l\'autorizzazione.</string> - <string name="auth_dialog_completed">c:geo รจ ora autorizzato ad inviare a Twitter.</string> - - <!-- auth opencaching --> - <string name="auth_ocde">opencaching.de</string> - <string name="auth_authorize_oc">Autorizza c:geo</string> - <string name="auth_start_oc">Start autorizzazione</string> - <string name="auth_again_oc">Start nuovamente</string> - <string name="auth_pin_hint_oc">PIN assegnato da %s</string> - <string name="auth_finish_oc">Fine</string> - <string name="auth_dialog_wait_oc">In attesa di %sโฆ</string> - <string name="auth_dialog_pin_title_oc">PIN code</string> - <string name="auth_dialog_pin_message_oc">Prego riportare il PIN fornito dal sito %s. ร necessario per completare l\'autorizzazione.</string> - <string name="auth_dialog_completed_oc">c:geo รจ ora autorizzato ad accedere a %s.</string> - <string name="about_auth_1_oc">La procedura seguente consentirร a <b>c:geo</b></string> - <string name="about_auth_2_oc">Un click sul pulsante \"Autorizza c:geo\" inizierร la procedura. Verrร aperta la pagina %s nel browser. Effettua Login sulla pagina ed acconsenti a <b>c:geo</b></string> - - <!-- cache --> - <plurals name="cache_counts"> - <item quantity="one">Un cache</item> - <item quantity="other">%1$d cache</item> - </plurals> - - <string name="cache_offline">Offline</string> - <string name="cache_offline_refresh">Aggiorna</string> - <string name="cache_offline_drop">Elimina</string> - <string name="cache_offline_store">Salva</string> - <string name="cache_offline_stored">Salvato nel dispositivo</string> - <string name="cache_offline_not_ready">Non disponibile offline</string> - <string name="cache_offline_time_about">circa</string> - <string name="cache_offline_time_mins">minuti fa</string> - <string name="cache_offline_time_mins_few">qualche minuto fa</string> - <string name="cache_offline_time_hour">un\'ora fa</string> - <string name="cache_offline_time_hours">ore fa</string> - <string name="cache_offline_time_days">giorni fa</string> - <string name="cache_premium">Premium</string> - <string name="cache_attributes">Attributi</string> - <string name="cache_inventory">Oggetti</string> - <string name="cache_log_offline">Log Offline</string> - <string name="cache_log_images_title">Immagini Log</string> - <string name="cache_log_image_default_title">Foto</string> - <string name="cache_personal_note">Note personali</string> - <string name="cache_personal_note_edit">Modifica</string> - <string name="cache_personal_note_unstored">Cache non salvati</string> - <string name="cache_personal_note_store">Il cache verrร prima salvato per abilitare le note personali.</string> - <string name="cache_description">Descrizione</string> - <string name="cache_description_long">Descrizione estesa</string> - <string name="cache_description_table_note">La descrizione contiene una tabella formattata in modo tale che potresti aver bisogno di andare su %s per vederla correttamente.</string> - <string name="cache_watchlist_on">Questo cache รจ nella tua watchlist.</string> - <string name="cache_watchlist_not_on">Questo cache non รจ nella tua watchlist.</string> - <string name="cache_watchlist_add">Aggiungi alla watchlist</string> - <string name="cache_watchlist_remove">Rimuovi dalla watchlist</string> - <string name="cache_favpoint_on">Questo cache รจ uno dei tuoi favoriti.</string> - <string name="cache_favpoint_not_on">Questo cache non รจ uno dei tuoi favoriti.</string> - <string name="cache_favpoint_add">Aggiungi</string> - <string name="cache_favpoint_remove">Rimuovi</string> - <string name="cache_list_text">Lista:</string> - <string name="cache_list_change">Sposta</string> - <string name="cache_list_unknown">Non in una lista</string> - <string name="cache_images">Immagini</string> - <string name="cache_waypoints">Waypoints</string> - - <plurals name="waypoints"> - <item quantity="one">1 Waypoint</item> - <item quantity="other">%d Waypoint</item> - </plurals> - - <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> - <string name="cache_dialog_loading_details_status_spoilers">Caricamento immagini spoiler</string> - <string name="cache_dialog_loading_details_status_logs">Caricamento log</string> - <string name="cache_dialog_loading_details_status_waypoints">Elaborazione waypoints</string> - <string name="cache_dialog_loading_details_status_gcvote">Caricamento GCVote</string> - <string name="cache_dialog_loading_details_status_cache">Salvataggio dati</string> - <string name="cache_dialog_loading_details_status_render">Creazione pagina</string> - <string name="cache_dialog_offline_save_title">Offline</string> - <string name="cache_dialog_offline_save_message">Salvataggio del cache per uso offlineโฆ</string> - <string name="cache_dialog_offline_drop_title">Offline</string> - <string name="cache_dialog_offline_drop_message">Eliminazione del cache dalla memoria del dispositivoโฆ</string> - <string name="cache_dialog_refresh_title">Aggiorna</string> - <string name="cache_dialog_refresh_message">Ricaricamento dettagli cacheโฆ</string> - <string name="cache_dialog_watchlist_add_title">Watchlist</string> - <string name="cache_dialog_watchlist_add_message">Aggiunto il cache alla watchlist in corsoโฆ</string> - <string name="cache_dialog_watchlist_remove_title">Watchlist</string> - <string name="cache_dialog_watchlist_remove_message">Rimozione dei cache dalla tua watchlistโฆ</string> - <string name="cache_dialog_favorite_add_title">Preferiti</string> - <string name="cache_dialog_favorite_add_message">Aggiungi il cache ai tuoi preferitiโฆ</string> - <string name="cache_dialog_favorite_remove_title">Preferiti</string> - <string name="cache_dialog_favorite_remove_message">Rimozione cache dai tuoi preferitiโฆ</string> - <string name="cache_menu_navigate">Naviga</string> - <string name="cache_menu_navigation_drive">Naviga (in auto)</string> - <string name="cache_menu_navigation_walk">Naviga (a piedi)</string> - <string name="cache_menu_maps_directions">Direzioni su Google Maps</string> - <string name="cache_menu_radar">Radar</string> - <string name="cache_menu_map">Mappa</string> - <string name="cache_menu_map_static">Mappe statiche</string> - <string name="cache_menu_download_map_static">Scarica mappe statiche</string> - <string name="cache_menu_rmaps">Rmaps</string> - <string name="cache_menu_map_ext">Mappa su app esterna</string> - <string name="cache_menu_streetview">Street View</string> - <string name="cache_menu_browser">Apri nel browser</string> - <string name="cache_menu_visit">Scrivi Log</string> - <string name="cache_menu_visit_offline">Scrivi Log offline</string> - <string name="cache_menu_spoilers">Immagini spoiler</string> - <string name="cache_menu_around">Cache qui intorno</string> - <string name="cache_menu_event">Aggiungi al calendario</string> - <string name="cache_menu_details">Dettagli</string> - <string name="cache_menu_refresh">Aggiorna</string> - <string name="cache_menu_share">Condividi cache</string> - <string name="cache_menu_move_list">Muovi in un\'altra lista</string> - <string name="cache_menu_gcc">GCC</string> - <string name="cache_menu_whereyougo">WhereYouGo</string> - <string name="cache_menu_oruxmaps">OruxMaps</string> - <string name="cache_menu_cachebeacon">Cache Beacon</string> - <string name="cache_status">Stato</string> - <string name="cache_status_offline_log">Log salvato</string> - <string name="cache_status_found">Trovato</string> - <string name="cache_status_archived">Archiviato</string> - <string name="cache_status_disabled">Non attivo</string> - <string name="cache_status_premium">Solo per utenti Premium</string> - <string name="cache_status_not_premium">Per tutti gli utenti</string> - <string name="cache_status_stored">Salvato</string> - <string name="cache_status_not_stored">Non salvato</string> - <string name="cache_geocode">geo code</string> - <string name="cache_name">Nome</string> - <string name="cache_type">Tipo</string> - <string name="cache_size">Dimensione</string> - <string name="cache_distance">Distanza</string> - <string name="cache_difficulty">Difficoltร </string> - <string name="cache_terrain">Terreno</string> - <string name="cache_rating">Voto</string> - <string name="cache_own_rating">Il tuo voto</string> - <string name="cache_rating_of">di</string> - <string name="cache_favorite">Popolaritร </string> - <string name="cache_owner">Proprietario</string> - <string name="cache_hidden">Nascosto il</string> - <string name="cache_event">Data</string> - <string name="cache_location">Luogo</string> - <string name="cache_coordinates">Coordinate</string> - <string name="cache_coordinates_original">Coordinate originali</string> - <string name="cache_spoiler_images_title">Immagini spoiler</string> - <string name="cache_images_title">Immaginis</string> - <string name="cache_log_types">Tipi di Log</string> - <string name="cache_coordinates_no">Questo cache non ha coordinate.</string> - <string name="cache_clear_history">Cancella cronologia</string> - <string name="cache_remove_from_history">Rimuovi dalla cronologia</string> - <string name="cache_license">Licenza</string> - <string name="cache_image">Immagine</string> - <string name="cache_image_open_file">Apri un file</string> - <string name="cache_image_open_browser">Apri nel browser</string> - <string name="cache_share_field">Condividi</string> - <string name="cache_time_full_hours">Precise</string> - <string name="cache_listed_on">Elencato su %s</string> - - <!-- editor dialog --> - - <!-- file list base --> - <string name="file_searching_in">Ricerca file\nin</string> - <string name="file_searching_sdcard_in">Nessun file trovato nella cartella di default:\n%1$s\n\nRicerca in tutta la SD i files:\n</string> - <string name="file_list_no_files">c:geo non ha trovato file appropriati.</string> - <string name="file_searching">Ricerca file corrispondenti</string> - <string name="file_title_searching">Ricerca in corso</string> - - <!-- simple_dir_chooser --> - <string name="simple_dir_chooser_title">Scegli cartella</string> - <string name="simple_dir_chooser_current_path">Path:</string> - - <!-- gpx --> - <string name="gpx_import_loading_caches">Caricamento dei cache da file GPX</string> - <string name="gpx_import_loading_waypoints">Caricamento file waypoints</string> - <string name="gpx_import_store_static_maps">Salvataggio mappe statiche</string> - <string name="gpx_import_caches_imported">cache importati</string> - <string name="gpx_import_static_maps_skipped">Download mappe statiche interrotto</string> - <string name="gpx_import_title_static_maps">Salva mappe statiche</string> - <string name="gpx_import_title_reading_file">Lettura file</string> - <string name="gpx_import_title">Importa GPX</string> - <string name="gpx_import_title_caches_imported">Risultato</string> - <string name="gpx_import_title_caches_import_failed">Importazione fallita</string> - <string name="gpx_import_error_io">Impossibile leggere il file</string> - <string name="gpx_import_error_parser">Il formato del file non รจ compatibile</string> - <string name="gpx_import_error_unexpected">Errore inaspettato</string> - <string name="gpx_import_canceled">Importazione GPX annullata</string> - <string name="gpx_import_delete_title">Cancella file</string> - <string name="gpx_import_delete_message">Vuoi cancellare %s?</string> - - <!-- map file select --> - <string name="map_file_select_title">Seleziona il file mappa</string> - - <!-- import --> - <string name="web_import_title">Importa dal web</string> - <string name="web_import_waiting">In attesa di nuovi cache dal webโฆ</string> - <string name="web_downloading">Download in corso</string> - <string name="web_downloaded">Download terminato</string> - - <!-- popup --> - <string name="popup_more">Altri dettagli</string> - - <!-- waypoint --> - <string name="waypoint">Waypoint</string> - <string name="waypoint_cache_coordinates">Coordinate cache</string> - <string name="waypoint_custom">Custom</string> - <string name="waypoint_my_coordinates">Coordinate attuali</string> - <string name="waypoint_bearing">Angolo in gradi</string> - <string name="waypoint_distance">Distanza</string> - <string name="waypoint_name">Nome</string> - <string name="waypoint_edit">Modifica</string> - <string name="waypoint_delete">Elimina</string> - <string name="waypoint_edit_title">Modifica waypoint</string> - <string name="waypoint_add_title">Aggiungi waypoint</string> - <string name="waypoint_note">Note</string> - <string name="waypoint_visited">Visitato</string> - <string name="waypoint_save">Salva</string> - <string name="waypoint_loading">Caricamento waypointโฆ</string> - <string name="waypoint_do_not_touch_cache_coordinates">Nessuna modifica alle coordinate cache</string> - <string name="waypoint_set_as_cache_coords">Setta come coordinate cache</string> - <string name="waypoint_coordinates_has_been_reset_on_website">Le coordinates sono state resettate su web</string> - <string name="waypoint_save_and_modify_on_website">Setta come coordinate cache in c:geo e su web</string> - <string name="waypoint_reset_cache_coords">Resetta le coordinate cache</string> - <string name="waypoint_coordinates_being_reset_on_website">Le coordinate sono in fase di reset su web</string> - <string name="waypoint_reset">Reset</string> - <string name="waypoint_localy_reset_cache_coords">Resetta in c:geo</string> - <string name="waypoint_reset_local_and_remote_cache_coords">Resetta in c:geo e su web.</string> - <string name="waypoint_being_saved">Salvataggio Waypointโฆ</string> - <string name="waypoint_coordinates_couldnt_be_modified_on_website">Il sito web non supporta la modifica delle coordinate</string> - <string name="waypoint_coordinates_upload_error">Errore durante il caricamento delle coordinate su web</string> - <string name="waypoint_coordinates_uploading_to_website">Caricamento delle coordinate %s su web</string> - <string name="waypoint_coordinates_has_been_modified_on_website">Le coordinate cache su web sono state modificate in: %s.</string> - <string name="waypoint_done">Fatto</string> - <string name="waypoint_duplicate">Duplicato</string> - <string name="waypoint_copy_of">Copia di</string> - <string name="search_history">Cronologia</string> - <string name="search_history_empty">Nessuna precedente destinazione</string> - <string name="search_remove_destination">Destinazione rimossa</string> - <string name="search_clear_history">Cancella cronologia</string> - <string name="search_history_cleared">Cronologia azzerata</string> - <string name="waypoint_coordinate_formats_plain">Plain</string> - - <!-- visit --> - <string name="visit_tweet">Segnala questo ritrovamento su Twitter</string> - - <!-- map --> - <string name="map_map">Mappa</string> - <string name="map_live">Mappa Live</string> - <string name="map_view_map">Scegli mappa</string> - <string name="map_modes">Modi mappa</string> - <string name="map_trail_show">Mostra scia</string> - <string name="map_trail_hide">Nasconde scia</string> - <string name="map_circles_show">Mostra area cache</string> - <string name="map_circles_hide">Nascondi area cache</string> - <string name="map_theme_builtin">Tema predefinito</string> - <string name="map_theme_select">Scegli un tema mappa</string> - <string name="map_live_enable">Attiva online</string> - <string name="map_live_disable">Disattiva online</string> - <string name="map_static_title">Mappe statiche</string> - <string name="map_static_loading">Caricamento mappe staticheโฆ</string> - <string name="map_token_err">Dato che c:geo riesce a scaricare solo dati parziali, le coordinate dei cache potrebbero non essere accurate.</string> - <string name="map_as_list">Mostra lista dei cache</string> - <string name="map_strategy">Strategia</string> - <string name="map_strategy_title">Strategia mappa Live</string> - <string name="map_strategy_fastest">La piรน veloce</string> - <string name="map_strategy_fast">Veloce</string> - <string name="map_strategy_auto">In base alla tua velocitร </string> - <string name="map_strategy_detailed">Dettagliata</string> - <string name="live_map_notification">Nella nuova Mappa Live le coordinate potrebbero non essere sempre precise. Coordinate possibilmente imprecise sono marcate da un cerchio arancione.\nAprendo i dettagli del cache o salvando il cache per uso offline farร calcolare sempre coordinate precise.\n\nInformazioni addizionali su tutte le modifiche si possono trovare nel menu \"Info c:geo\" sulla pagina principale di questa app.</string> - <string name="live_map_note_dontshow">Non mostrare ancora</string> - - <!-- search --> - <string name="search_bar_hint">Cerca caches</string> - <string name="search_bar_desc">Cache (geo code, parole chiave), Oggetti trackables (TB-code)</string> - <string name="search_coordinates">Coordinate</string> - <string name="search_coordinates_button">Cerca per coordinate</string> - <string name="search_address">Indirizzo</string> - <string name="search_address_button">Cerca per indirizzo</string> - <string name="search_geo">Geo code</string> - <string name="search_geo_button">Cerca per geo code</string> - <string name="search_kw">Parole chiave</string> - <string name="search_kw_prefill">Parola chiave</string> - <string name="search_kw_button">Cerca per parola chiave</string> - <string name="search_fbu">Trovata dall\'utente</string> - <string name="search_fbu_prefill">Nome utente</string> - <string name="search_fbu_button">Cerca per nome utente</string> - <string name="search_hbu">Nascosta dall\'utente</string> - <string name="search_hbu_prefill">Proprietario</string> - <string name="search_hbu_button">Cerca per proprietario</string> - <string name="search_tb">Oggetto trackable</string> - <string name="search_tb_hint">Identificativo Trackable</string> - <string name="search_tb_button">Cerca per trackable</string> - <string name="search_destination">Destinazione</string> - <string name="search_direction_rel">Dalla posizione attuale</string> - <string name="search_address_started">Cerca per luoghi</string> - <string name="search_address_result">Cerca luoghi</string> - <string name="search_own_caches">Cerca i miei cache</string> - - <!-- trackable --> - <string name="trackable">Oggetto trackable</string> - <string name="trackable_details_loading">Caricamento dettagli trackableโฆ</string> - <string name="trackable_log_touch">Documenta il contatto</string> - <string name="trackable_browser_open">Apri nel Browser</string> - <string name="trackable_goal">Obbiettivo</string> - <string name="trackable_details">Dettagli</string> - <string name="trackable_image">Immagine</string> - <string name="trackable_code">TB-Code</string> - <string name="trackable_name">Nome</string> - <string name="trackable_type">Tipo</string> - <string name="trackable_owner">Proprietario</string> - <string name="trackable_spotted">Contattato</string> - <string name="trackable_spotted_in_cache">In</string> - <string name="trackable_spotted_at_user">Nelle mani di</string> - <string name="trackable_spotted_unknown_location">Posizione sconosciuta</string> - <string name="trackable_spotted_owner">Nelle mani del proprietario</string> - <string name="trackable_origin">Origine</string> - <string name="trackable_unknown">Sconosciuto</string> - <string name="trackable_released">Rilasciato</string> - <string name="trackable_distance">Portato</string> - <string name="trackable_touch">Contatto</string> - - <!-- user --> - <string name="user_menu_title">Info</string> - <string name="user_menu_view_hidden">Cache nascosti</string> - <string name="user_menu_view_found">Cache trovati</string> - <string name="user_menu_open_browser">Apri profilo nel browser</string> - <string name="user_menu_send_message">Invia messaggio</string> - - <!-- navigation --> - <string name="navigation">Navigazione</string> - <string name="compass_title">Bussola</string> - <string name="use_gps">Usa Nord solo da GPS</string> - <string name="use_compass">Usa Nord da GPS e bussola</string> - <string name="destination_select">Scegli destinazione</string> - <string name="destination_set">Attiva destinazione</string> - <string name="navigation_direct_navigation">Navigazione diretta</string> - <string name="navigation_target">Destinazione</string> - - <!-- license --> - <string name="license">Licenza</string> - <string name="license_show">Mostra licenza</string> - <string name="license_dismiss">Chiudi</string> - - <!-- helpers --> - <string name="helper_calendar_title">c:geo calendario add-on</string> - <string name="helper_calendar_missing">c:geo calendario add-on non installato</string> - <string name="helper_calendar_description">Permette di esportare gli eventi cache nel calendario del tuo dispositivo.</string> - <string name="helper_locus_title">Locus</string> - <string name="helper_locus_description">Applicazione semplice da usare che mostra mappe online permettendo di scaricarle direttamente per l\'uso offline (solo mappe raster). Supporta inoltra la registrazione di traccia, gestione dei waypoints e altre utili funzioni.</string> - <string name="helper_gpsstatus_title">GPS Status</string> - <string name="helper_gpsstatus_description">Puoi usare il radar di questa applicazione con c:geo. Offre inoltre molte informazioni addizionali legate al GPS.</string> - <string name="helper_bluetoothgps_title">Bluetooth GPS</string> - <string name="helper_bluetoothgps_description">Permette di utilizzare un GPS esterno, garantendo maggiore precisione, migliore ricezione e prolungando la durata della batteria del dispositivo.</string> - <string name="helper_barcode_title">Barcode Scanner</string> - <string name="helper_barcode_description">Ci sono script Greasemonkey e siti web che consentono di visualizzare un geocode come codice a barre. Con questa app c:geo puรฒ leggere il geocode direttamente dallo schermo del tuo computer.</string> - <string name="helper_pocketquery_title">Creatore di Pocket Query</string> - <string name="helper_pocketquery_description">Consente di creare facilmente Pocket Queries centrate sulla tua posizione attuale o un punto scelto dalla mappa. Richiede un account premium su Geocaching.com.</string> - <!-- add-ons --> - <string name="addon_missing_title">Add-On mancante</string> - <string name="addon_download_prompt">Scaricalo ora da Google Play.</string> - - <!-- export --> - <string name="export">Esporta</string> - <string name="export_exportedto">esportato in</string> - <string name="export_failed">Esportazione fallita</string> - <string name="export_fieldnotes">Field Note</string> - <string name="export_fieldnotes_info">Field Note saranno esportate in /sdcard/field-notes con data e ora corrente nel nome file.</string> - <string name="export_fieldnotes_upload">Carica su geocaching.com</string> - <string name="export_fieldnotes_uploading">Caricamentoโฆ</string> - <string name="export_fieldnotes_upload_success">Caricato su geocaching.com con successo</string> - <string name="export_fieldnotes_onlynew">Solo quelli nuovi rispetto all\'ultima esportazione</string> - <string name="export_fieldnotes_creating">Creazione Field Notesโฆ</string> - <string name="export_gpx">GPX</string> - <string name="export_gpx_info">Il file GPX sarร esportato in %1$s con data ed ora correnti come nome file.</string> - <string name="export_gpx_to">Invia il GPX esportato a</string> - - <!-- GC attributes --> - <string name="attribute_dogs_yes">Cani permessi</string> - <string name="attribute_dogs_no">Cani NON permessi</string> - <string name="attribute_bicycles_yes">Biciclette permesse</string> - <string name="attribute_bicycles_no">Biciclette NON permesse</string> - <string name="attribute_motorcycles_yes">Moto permesse</string> - <string name="attribute_motorcycles_no">Moto NON permesse</string> - <string name="attribute_quads_yes">Quad permessi</string> - <string name="attribute_quads_no">Quad NON permessi</string> - <string name="attribute_jeeps_yes">Veicoli fuoristrada permessi</string> - <string name="attribute_jeeps_no">Veicoli fuoristrada NON permessi</string> - <string name="attribute_snowmobiles_yes">Motoslitte permesse</string> - <string name="attribute_snowmobiles_no">Motoslitte NON permesse</string> - <string name="attribute_horses_yes">Cavalli permessi</string> - <string name="attribute_horses_no">Cavalli NON permessi</string> - <string name="attribute_campfires_yes">Fuochi da campo permessi</string> - <string name="attribute_campfires_no">Fuochi da campo NON permessi</string> - <string name="attribute_rv_yes">Camper/roulotte permessi</string> - <string name="attribute_rv_no">Camper/roulotte NON permessi</string> - <string name="attribute_kids_yes">Raccomandato per bambini</string> - <string name="attribute_kids_no">Non raccomandato per bambini</string> - <string name="attribute_onehour_yes">Richiede meno di un\'ora</string> - <string name="attribute_onehour_no">Richiede piรน di un\'ora</string> - <string name="attribute_scenic_yes">Panoramico</string> - <string name="attribute_scenic_no">Non panoramico</string> - <string name="attribute_hiking_yes">Trekking impegnativo</string> - <string name="attribute_hiking_no">Trekking facile</string> - <string name="attribute_climbing_yes">Arrampicata difficile</string> - <string name="attribute_climbing_no">Arrampicata facile o assente </string> - <string name="attribute_wading_yes">Puรฒ richiedere un guado</string> - <string name="attribute_wading_no">Non prevede guadi</string> - <string name="attribute_swimming_yes">Puรฒ richiedere nuoto</string> - <string name="attribute_swimming_no">Non richiede nuoto</string> - <string name="attribute_available_yes">Disponibile ad ogni ora</string> - <string name="attribute_available_no">Non disponibile ad ogni ora</string> - <string name="attribute_night_yes">Raccomandato di notte</string> - <string name="attribute_night_no">Non raccomandato di notte</string> - <string name="attribute_winter_yes">Disponibile d\'inverno</string> - <string name="attribute_winter_no">Non disponibile d\'inverno</string> - <string name="attribute_stealth_yes">Richiede invisibilitร </string> - <string name="attribute_stealth_no">Non richiede invisibilitร </string> - <string name="attribute_firstaid_yes">Necessita di manutenzione</string> - <string name="attribute_firstaid_no">Non necessita di manutenzione</string> - <string name="attribute_cow_yes">Attenzione agli animali</string> - <string name="attribute_cow_no">Non ci sono animali</string> - <string name="attribute_field_puzzle_yes">Terreno accidentato</string> - <string name="attribute_field_puzzle_no">Terreno non accidentato</string> - <string name="attribute_nightcache_yes">Cache notturno</string> - <string name="attribute_nightcache_no">Cache non notturno</string> - <string name="attribute_parkngrab_yes">Parcheggia e trova!</string> - <string name="attribute_parkngrab_no">Parcheggio lontano</string> - <string name="attribute_abandonedbuilding_yes">Struttura abbandonata</string> - <string name="attribute_abandonedbuilding_no">Struttura non abbandonata</string> - <string name="attribute_hike_short_yes">Breve trekking (meno di 1 km)</string> - <string name="attribute_hike_short_no">Trekking non breve</string> - <string name="attribute_hike_med_yes">Medio trekking (da 1 km a 10 km)</string> - <string name="attribute_hike_med_no">Trekking non medio</string> - <string name="attribute_hike_long_yes">Lungo trekking (piรน di 10 km)</string> - <string name="attribute_hike_long_no">Trekking non lungo</string> - <string name="attribute_seasonal_yes">Accesso stagionale</string> - <string name="attribute_seasonal_no">Nessun limite stagionale</string> - <string name="attribute_touristok_yes">Turistico</string> - <string name="attribute_touristok_no">Non turistico</string> - <string name="attribute_frontyard_yes">Residenza privata</string> - <string name="attribute_frontyard_no">Residenza non privata</string> - <string name="attribute_teamwork_yes">Richiesto lavoro di gruppo</string> - <string name="attribute_teamwork_no">Fattibile anche da soli</string> - <string name="attribute_landf_yes">Tour \"Lost and found\"</string> - <string name="attribute_landf_no">Non รจ un tour \"Lost and found\"</string> - <string name="attribute_partnership_yes">Cache di gruppo</string> - <string name="attribute_partnership_no">Cache non di gruppo</string> - <string name="attribute_fee_yes">Accesso o parcheggio a pagamento</string> - <string name="attribute_fee_no">Accesso o parcheggio non a pagamento</string> - <string name="attribute_rappelling_yes">Richiesta attrezzatura da arrampicata</string> - <string name="attribute_rappelling_no">Attrezzatura da arrampicata non necessaria</string> - <string name="attribute_boat_yes">Necessaria imbarcazione</string> - <string name="attribute_boat_no">Imbarcazione non necessaria</string> - <string name="attribute_scuba_yes">Richiesta attrezzatura da sub</string> - <string name="attribute_scuba_no">Attrezzatura da sub non necessaria</string> - <string name="attribute_flashlight_yes">Richiesta torcia elettrica</string> - <string name="attribute_flashlight_no">Torcia elettrica non necessaria</string> - <string name="attribute_uv_yes">Richiesta lampada UV</string> - <string name="attribute_uv_no">Lampada UV non necessaria</string> - <string name="attribute_snowshoes_yes">Richiesta calzature da neve</string> - <string name="attribute_snowshoes_no">Calzature da neve non necessarie</string> - <string name="attribute_skiis_yes">Richiesti sci da fondo</string> - <string name="attribute_skiis_no">Sci da fondo non necessari</string> - <string name="attribute_s_tool_yes">Richiesti attrezzi speciali</string> - <string name="attribute_s_tool_no">Attrezzi speciali non necessari</string> - <string name="attribute_wirelessbeacon_yes">Segnalatore radio necessario</string> - <string name="attribute_wirelessbeacon_no">Segnalatore radio non necessario</string> - <string name="attribute_treeclimbing_yes">Richiede di salire su un albero</string> - <string name="attribute_treeclimbing_no">Non richiede di salire su un albero</string> - <string name="attribute_poisonoak_yes">Piante velenose</string> - <string name="attribute_poisonoak_no">Piante non velenose</string> - <string name="attribute_dangerousanimals_yes">Animali pericolosi</string> - <string name="attribute_dangerousanimals_no">Animali non pericolosi</string> - <string name="attribute_ticks_yes">Zecche / insetti</string> - <string name="attribute_ticks_no">Non ci sono zecche / insetti</string> - <string name="attribute_mine_yes">Miniere abbandonate</string> - <string name="attribute_mine_no">Miniere non abbandonate</string> - <string name="attribute_cliff_yes">Strapiombo / caduta massi</string> - <string name="attribute_cliff_no">Nessun strapiombo / caduta massi</string> - <string name="attribute_hunting_yes">Zona di caccia</string> - <string name="attribute_hunting_no">Zona non di caccia</string> - <string name="attribute_danger_yes">Area pericolosa</string> - <string name="attribute_danger_no">Area non pericolosa</string> - <string name="attribute_thorn_yes">Rovi</string> - <string name="attribute_thorn_no">Senza rovi</string> - <string name="attribute_wheelchair_yes">Accessibile con sedia a rotelle</string> - <string name="attribute_wheelchair_no">Non accessibile con sedia a rotelle</string> - <string name="attribute_parking_yes">Parcheggio</string> - <string name="attribute_parking_no">Parcheggio non disponibile</string> - <string name="attribute_public_yes">Servito da trasporto pubblico</string> - <string name="attribute_public_no">Non servito da trasporto pubblico</string> - <string name="attribute_water_yes">Vicino ad acqua potabile</string> - <string name="attribute_water_no">Lontano da acqua potabile</string> - <string name="attribute_restrooms_yes">Vicino ad alloggi pubblici</string> - <string name="attribute_restrooms_no">Lontano da alloggi pubblici</string> - <string name="attribute_phone_yes">Vicino a telefono pubblico</string> - <string name="attribute_phone_no">Lontano da telefoni</string> - <string name="attribute_picnic_yes">Vicino a zona picnic</string> - <string name="attribute_picnic_no">Zone picnic non vicine</string> - <string name="attribute_camping_yes">Campeggio disponibile</string> - <string name="attribute_camping_no">Campeggio non disponibile</string> - <string name="attribute_stroller_yes">Accessibile con passeggino</string> - <string name="attribute_stroller_no">Non accessibile con passeggino</string> - <string name="attribute_fuel_yes">Vicino a pompa carburante</string> - <string name="attribute_fuel_no">Lontano da pompa carburante</string> - <string name="attribute_food_yes">Vicino a punto ristoro</string> - <string name="attribute_food_no">Lontano da punti ristoro</string> - <string name="attribute_oc_only_yes">Loggabile solo su Opencaching</string> - <string name="attribute_oc_only_no">Loggabile non solo su Opencaching</string> - <string name="attribute_link_only_yes">Hyperlink solo verso un altro portale di cache</string> - <string name="attribute_link_only_no">Non solo hyperlink ad un altro portale di cache</string> - <string name="attribute_letterbox_yes">Lettera (richiede francobollo)</string> - <string name="attribute_letterbox_no">No lettera (non richiede francobollo)</string> - <string name="attribute_railway_yes">Ferrovia attiva nelle vicinanze</string> - <string name="attribute_railway_no">Nessuna ferrovia nelle vicinanze</string> - <string name="attribute_syringe_yes">Pronto soccorso disponibile</string> - <string name="attribute_syringe_no">Pronto soccorso non disponibile</string> - <string name="attribute_swamp_yes">Paludoso</string> - <string name="attribute_swamp_no">Non paludoso</string> - <string name="attribute_hills_yes">Area collinare</string> - <string name="attribute_hills_no">Area non collinare</string> - <string name="attribute_easy_climbing_yes">Facile scalata</string> - <string name="attribute_easy_climbing_no">Nessuna facile scalata</string> - <string name="attribute_poi_yes">Punto di interesse</string> - <string name="attribute_poi_no">Nessun punto di interesse</string> - <string name="attribute_moving_target_yes">Obiettivo in movimento</string> - <string name="attribute_moving_target_no">Obiettivo non in movimento</string> - <string name="attribute_webcam_yes">Webcam</string> - <string name="attribute_webcam_no">No webcam</string> - <string name="attribute_inside_yes">Con aree interne (cave, edifici etc.)</string> - <string name="attribute_inside_no">Senza aree interne</string> - <string name="attribute_in_water_yes">In acqua</string> - <string name="attribute_in_water_no">Non in acqua</string> - <string name="attribute_no_gps_yes">Senza GPS (lettere, cistes, carta e bussolaโฆ)</string> - <string name="attribute_no_gps_no">Con GPS</string> - <string name="attribute_overnight_yes">Necessario permanere di notte</string> - <string name="attribute_overnight_no">Permanenza notturna non necessaria</string> - <string name="attribute_specific_times_yes">Disponibile solo in certi orari</string> - <string name="attribute_specific_times_no">Disponibile a tutte le ore</string> - <string name="attribute_day_yes">Solo di giorno</string> - <string name="attribute_day_no">Non solo di giorno</string> - <string name="attribute_tide_yes">Marea</string> - <string name="attribute_tide_no">Senza marea</string> - <string name="attribute_all_seasons_yes">Tutte le stagioni</string> - <string name="attribute_all_seasons_no">Non in tutte le stagioni</string> - <string name="attribute_breeding_yes">Stagione di riproduzione / natura protetta</string> - <string name="attribute_breeding_no">Disponibile anche in stagione di riproduzione / natura protetta</string> - <string name="attribute_snow_proof_yes">Nascondiglio a prova di neve</string> - <string name="attribute_snow_proof_no">Nascondiglio non a prova di neve</string> - <string name="attribute_compass_yes">Bussola</string> - <string name="attribute_compass_no">Senza bussola</string> - <string name="attribute_cave_yes">Equipaggiamento da caverna</string> - <string name="attribute_cave_no">Senza equipaggiamento da caverna</string> - <string name="attribute_aircraft_yes">Aircraft</string> - <string name="attribute_aircraft_no">Senza aircraft</string> - <string name="attribute_investigation_yes">Investigazione</string> - <string name="attribute_investigation_no">Senza investigazione</string> - <string name="attribute_puzzle_yes">Puzzle / Mystery</string> - <string name="attribute_puzzle_no">No puzzle / mystery</string> - <string name="attribute_arithmetic_yes">Problema aritmetico</string> - <string name="attribute_arithmetic_no">Problema non aritmetico</string> - <string name="attribute_other_cache_yes">Cache di altro tipo</string> - <string name="attribute_other_cache_no">Cache non di altro tipo</string> - <string name="attribute_ask_owner_yes">Chiedere al proprietario per le condizioni di partenza</string> - <string name="attribute_ask_owner_no">Non chiedere al proprietario per le condizioni di partenza</string> - <string name="attribute_unknown_yes">Attributo sconosciuto</string> - <string name="attribute_unknown_no">Senza attributo sconosciuto</string> - <string name="attribute_geotour_yes">Parte di un GeoTour</string> - <string name="attribute_geotour_no">Non fa parte di un GeoTour</string> - - <!-- next things --> - <string name="settings_gc_legal_note">Per usare i servizi di Geocaching.com, si applicano i termini e le condizioni del Contratto Groundspeak che deve essere approvato dall\'utente.</string> - <string name="quote">Per rendere il geocaching piรน facile e rendere gli utenti piรน pigri.</string> - <string name="powered_by">carnero</string> - <!-- Note: Links here are just for appearance. See AboutActivity to make changes --> - <string name="support">Supporto: <a href="">support@cgeo.org</a></string> - <string name="website">Sito: <a href="">cgeo.org</a></string> - <string name="facebook">Facebook: <a href="">pagina c:geo </a></string> - <string name="twitter">Twitter: <a href="">@android_GC</a></string> - <string name="nutshellmanual">Manuale: <a href="">c:geo in a Nutshell</a></string> - <string name="market">Android: <a href="">c:geo su Google Play</a></string> - <string name="about_twitter">Puรฒ <b>c:geo</b> pubblicare su Twitter ogni volta che logghi un cache?</string> - <string name="about_auth_1">La procesura seguente autorizza <b>c:geo</b> ad accedere a Twitter - se confermato.</string> - <string name="about_auth_2">Clicca sul pulsante \"Autorizza c:geo\" per iniziare. Questa procedura aprirร il browser sulla pagina Twitter. Fai Login su questa pagina e autorizza <b>c:geo</b> ad accedere al tuo account. Se accettato, Twitter mostrerร un PIN code numerico. Questo PIN deve essere riportato in <b>c:geo</b> e confermato.</string> - - <!-- status --> - <string name="status_new_release" tools:ignore="UnusedResources">Una nuova versione รจ disponibile.\nClicca per installarla.</string> - <string name="status_new_nightly" tools:ignore="UnusedResources">Una nuova versione nightly รจ disponibile.\nClicca per installarla.</string> - <string name="status_new_rc" tools:ignore="UnusedResources">Una nuova release candidate รจ disponibile.\nClicca per installarla.</string> - <string name="status_geocaching_change" tools:ignore="UnusedResources">Modifiche recenti al sito geocaching hanno disattivato c:geo.\nCi stiamo lavorando, riprova piรน tardi.</string> - <string name="status_geocaching_livemap" tools:ignore="UnusedResources">Modifiche recenti al sito geocaching hanno disattivato la mappa live.\nCi stiamo lavorando, riprova piรน tardi.</string> + <string name="app_name">c:geo</string> + <string name="cache">Cache</string> + <string name="detail">Dettaglio</string> + <string name="search">Cerca</string> + <string name="helpers">Apps utili</string> + <string name="about">Info c:geo</string> + <string name="latitude">Latitudine</string> + <string name="longitude">Longitudine</string> + <string name="action_bar_share_title">Condividi link al cache</string> + <string name="settings_titlebar">Impostazioni di c:geo</string> + <string name="all_types">Tutti i tipi di cache</string> + <string name="traditional">Traditional cache</string> + <string name="multi">Multi-cache</string> + <string name="mystery">Mystery cache</string> + <string name="letterbox">Letterbox hybrid</string> + <string name="event">Cache Evento</string> + <string name="mega">Mega-event cache</string> + <string name="earth">Earthcache</string> + <string name="cito">Evento Cache In Trash Out</string> + <string name="webcam">Webcam cache</string> + <string name="virtual">Cache Virtuale</string> + <string name="wherigo">Wherigo cache</string> + <string name="lostfound">Lost and Found</string> + <string name="ape">Project Ape cache</string> + <string name="gchq">Groundspeak HQ</string> + <string name="gps">Fiera GPS cache</string> + <string name="block">Groundspeak Block Party</string> + <string name="unknown">Tipo sconosciuto</string> + <string name="cache_size_micro">micro</string> + <string name="cache_size_small">small</string> + <string name="cache_size_regular">regular</string> + <string name="cache_size_large">large</string> + <string name="cache_size_other">altro</string> + <string name="cache_size_virtual">virtual</string> + <string name="cache_size_notchosen">non selezionato</string> + <string name="cache_size_unknown">sconosciuto</string> + <string name="wp_final">Destinazione finale</string> + <string name="wp_stage">Step intermedio multi-cache</string> + <string name="wp_puzzle">Quesito da risolvere</string> + <string name="wp_pkg">Area parcheggio</string> + <string name="wp_trailhead">Partenza percorso</string> + <string name="wp_waypoint">Punto di riferimento</string> + <string name="wp_original">Coordinate originali</string> + <string name="log_found">Trovato</string> + <string name="log_dnf">Non trovato (DNF)</string> + <string name="log_note">Note</string> + <string name="log_published">Pubblicato</string> + <string name="log_enabled">Attivo</string> + <string name="log_disabled">Non attivo</string> + <string name="log_attend">Parteciperร </string> + <string name="log_attended">Partecipato</string> + <string name="log_retrieved">Prelevato</string> + <string name="log_placed">Inserito</string> + <string name="log_grabbed">Prelevato da qualche parte</string> + <string name="log_movecollection">Sposta in collezione</string> + <string name="log_moveinventory">Sposta in inventario</string> + <string name="log_maintained">Manutenzione effettuata</string> + <string name="log_maintenance_needed">Richiede manutenzione</string> + <string name="log_update">Coordinate aggiornate</string> + <string name="log_archived">Archiviato</string> + <string name="log_unarchived">Reinserito</string> + <string name="log_needs_archived">Necessita archiviazione</string> + <string name="log_discovered">Scoperto</string> + <string name="log_reviewer">Nota del revisore</string> + <string name="log_retractlisting">Ritirato</string> + <string name="log_marked_missing">Segnalato come mancante</string> + <string name="log_tb_nothing">Non fare nulla</string> + <string name="log_tb_visit">Visitato</string> + <string name="log_tb_drop">Lasciato</string> + <string name="log_tb_changeall">Cambia tutto</string> + <string name="log_save">Salva</string> + <string name="log_saving">Invio logโฆ</string> + <string name="log_saving_and_uploading">Invio log e immagineโฆ</string> + <string name="log_clear">Azzera</string> + <string name="log_post">Invia log</string> + <string name="log_post_rate">Invia log + voto</string> + <string name="log_post_no_rate">Invia log senza voto</string> + <string name="log_post_not_possible">Connessioneโฆ</string> + <string name="log_add">Aggiungi</string> + <string name="log_rating">Voto</string> + <string name="log_no_rating">Nessun voto</string> + <string name="log_stars_1">1 stella</string> + <string name="log_stars_15">1.5 stelle</string> + <string name="log_stars_2">2 stelle</string> + <string name="log_stars_25">2.5 stelle</string> + <string name="log_stars_3">3 stelle</string> + <string name="log_stars_35">3.5 stelle</string> + <string name="log_stars_4">4 stelle</string> + <string name="log_stars_45">4.5 stelle</string> + <string name="log_stars_5">5 stelle</string> + <string name="log_stars_1_description">proprio brutto</string> + <string name="log_stars_15_description">abbastanza brutto</string> + <string name="log_stars_2_description">bruttino</string> + <string name="log_stars_25_description">sotto la media</string> + <string name="log_stars_3_description">nella media</string> + <string name="log_stars_35_description">non male</string> + <string name="log_stars_4_description">bene</string> + <string name="log_stars_45_description">molto bene</string> + <string name="log_stars_5_description">favoloso</string> + <string name="log_webcam">Scattata foto Webcam</string> + <string name="log_new_log">Log</string> + <string name="log_new_log_text">Testo Log</string> + <string name="log_announcement">Annuncio</string> + <string name="log_today">Oggi</string> + <string name="log_yesterday">Ieri</string> + <string name="log_smilies">Faccine</string> + <string name="log_image">Immagine</string> + <string name="log_image_attach">Aggiungi immagine</string> + <string name="log_image_edit">Modifica immagine</string> + <string name="log_image_stored">Esistente</string> + <string name="log_image_camera">Nuova</string> + <string name="log_image_caption">Didascalia</string> + <string name="log_image_description">Descrizione</string> + <string name="log_image_scale">Ridimensiona</string> + <string name="log_password_title">Log Password:</string> + <string name="log_hint_log_password">Inserisci la password per il log</string> + <string name="translate_to_sys_lang">Traduci in %s</string> + <string name="translate_to_english">Traduci in inglese</string> + <string name="translate_length_warning">La traduzione puรฒ fallire quando c\'รจ molto testo.</string> + <string name="err_none">OK</string> + <string name="err_start">Comunicazione non avviata</string> + <string name="err_parse">Errore analizzando la pagina di login</string> + <string name="err_server">Connessione fallita con Geocaching.com (server o connessione non disponibile?)</string> + <string name="err_login">Informazioni di login non memorizzate</string> + <string name="err_login_failed">c:geo non puรฒ effettuare login.</string> + <string name="err_login_failed_toast">c:geo non puรฒ effettuare login. Attivata la modalitร offline. Verificare le informazioni di login nelle impostazioni o abilitare una connessione internet.</string> + <string name="err_unknown">Errore sconosciuto</string> + <string name="err_comm">Errore sconosciuto di comunicazione</string> + <string name="err_missing_auth">username e/o password non settati.</string> + <string name="err_wrong">Informazioni di login errate</string> + <string name="err_maintenance">Geocaching.com รจ in manutenzione, riprovare piรน tardi. Attivata la modalitร offline.</string> + <string name="err_license">L\'utente non ha approvato le condizioni del contratto Geocaching.com. Cosรฌ c:geo non puรฒ caricare le coordinate dei cache.</string> + <string name="err_unvalidated_account">Come prima cosa devi convalidare il tuo account su Geocaching.com.</string> + <string name="err_unpublished">Il cache richiesto รจ stato ritirato</string> + <string name="err_premium_only">Cache disponibile solo per utenti premium di Geocaching.com</string> + <string name="err_detail_open">c:geo non puรฒ aprire i dettagli del cache.</string> + <string name="err_detail_cache">c:geo non puรฒ visualizzare il cache richiesto. ร veramente un geocache?</string> + <string name="err_detail_cache_find">c:geo non trova il geocache</string> + <string name="err_detail_cache_find_some">c:geo non trova quel geocache.</string> + <string name="err_detail_cache_find_any">c:geo non trova nessun geocache.</string> + <string name="err_detail_cache_forgot">c:geo ha dimenticato quale geocache avevi richiesto.</string> + <string name="err_detail_google_maps_limit_reached">c:geo non riesce a scaricare le mappe statiche. Forse raggiunto il limite di google map. Riprova domani.</string> + <string name="err_detail_no_spoiler">c:geo non trova alcuna immagine spoiler per questo cache.</string> + <string name="err_detail_no_map_static">c:geo non trova alcuna mappa statica per questo cache.</string> + <string name="err_detail_not_load_map_static">c:geo non riesce a caricare la mappe statiche.</string> + <string name="err_detail_still_working">Momentaneamente occupato a svolgere un altro compito.</string> + <string name="err_watchlist_still_managing">Sto ancora gestendo la tua watchlist.</string> + <string name="err_watchlist_failed">La modifica alla tua watchlist รจ fallita.</string> + <string name="err_application_no">c:geo non trova nessuna applicazione compatibile.</string> + <string name="err_auth_initialize">c:geo ha fallito l\'inizializzazione del processo di autorizzazione.</string> + <string name="err_auth_process">Processo di autorizzazione fallito.</string> + <string name="err_cannot_log_visit">c:geo non ha abbastanza informazioni per salvare il log. Per cortesia riprova dalla pagina dei dettagli completi del cache.</string> + <string name="err_download_fail">c:geo ha fallito il download dei cache.</string> + <string name="err_dwld_details_failed">c:geo ha fallito il download dei dettagli del cache.</string> + <string name="err_load_descr_failed">c:geo non puรฒ caricare la descrizione.</string> + <string name="err_location_unknown">c:geo non conosce la posizione dei cache.</string> + <string name="err_missing_device_name">Per cortesia inserire il nome del dispositivo prima di registrarsi.</string> + <string name="err_favorite_failed">Errore nella modifica dello stato preferiti.</string> + <string name="err_select_logimage_failed">La selezione dell\'immagine per il log รจ fallita.</string> + <string name="err_acquire_image_failed">Acquisizione immagine fallita.</string> + <string name="err_tb_display">c:geo non riesce a visualizzare il trackable che vuoi. ร veramente un trackable?</string> + <string name="err_tb_details_open">c:geo non riesce ad aprire i dettagli del trackable.</string> + <string name="err_tb_forgot_saw">c:geo ha dimenticato quale trackable vedevi.</string> + <string name="err_tb_find">c:geo non trova nessun trackable</string> + <string name="err_tb_find_that">c:geo non trova quel trackable.</string> + <string name="err_waypoint_cache_unknown">c:geo non conosce a quale cache vuoi aggiungere un waypoint.</string> + <string name="err_waypoint_add_failed">c:geo non รจ riuscito ad aggiungere il tuo waypoint.</string> + <string name="err_point_unknown_position">c:geo non capisce dove ti trovi.</string> + <string name="err_point_no_position_given_title">Info richieste</string> + <string name="err_point_no_position_given">Inserisci almeno latitudine e longitudine, o distanza e angolo. Puoi anche inserire tutti e quattro i valori.</string> + <string name="err_point_curr_position_unavailable">c:geo non ha le coordinate attuali. Attendere, pregoโฆ</string> + <string name="err_point_bear_and_dist_title">Necessiti di aiuto?</string> + <string name="err_point_bear_and_dist">Inserisci angolo e distanza. Angolo specifica un valore in gradi tra 0 e 360 relativo al nord. La distanza non richiede unitร di misura.</string> + <string name="err_log_load_data">c:geo non riesce a caricare i dati necessari per salvare il log della tua visita.</string> + <string name="err_log_load_data_again">c:geo non riesce a caricare i dati necessari per salvare il log della tua visita. Nuovo tentativo in corso.</string> + <string name="err_log_load_data_still">c:geo sta ancora caricando i dati necessari per salvare il log. Per cortesia attendere ancora un pochino.</string> + <string name="err_log_failed_server">c:geo non รจ riuscito ad inviare il log perchรฉ il server non risponde.</string> + <string name="err_log_post_failed">Sembra che il log non sia stato inviato. Prego verificare su Geocaching.com.</string> + <string name="err_logimage_post_failed">Sembra che l\'immagine del tuo log non sia stata caricata. Si prega di controllare su Geocaching.com.</string> + <string name="err_search_address_forgot">c:geo ha dimenticato l\'indirizzo che vuoi trovare.</string> + <string name="err_parse_lat">c:geo non riesce ad interpretare la latitudine.</string> + <string name="err_parse_lon">c:geo non riesce ad interpretare la longitudine.</string> + <string name="err_parse_dist">c:geo non riesce ad interpretare la distanza.</string> + <string name="err_parse_lat_lon">c:geo non riesce ad interpretare la latitudine o la longitudine.</string> + <string name="warn_save_nothing">Non c\'รจ nulla da salvare.</string> + <string name="warn_no_cache_coord">Non ci sono cache con coordinate.</string> + <string name="warn_no_coordinates">Coordinate non fornite.</string> + <string name="warn_no_keyword">Parola chiave non fornita.</string> + <string name="warn_no_username">Nome utente non fornito.</string> + <string name="warn_search_help_title">Necessiti di aiuto?</string> + <string name="warn_search_help_address">Inserisci indirizzo o nome di luogo. Per esempio, usa un indirizzo simile a questo: \"Via Alessandro Volta 1, Milano, Italia\", oppure solo la cittร come \"Milano\" o di un luogo famoso come ad esempio \"Colosseo\".</string> + <string name="warn_search_help_gccode">Inserisci il codice del geocache. Per esempio \"GC1VCAZ\".</string> + <string name="warn_search_help_keyword">Inserisci delle parole che supponi siano citate da qualche parte all\'interno del cache che vuoi trovare.</string> + <string name="warn_search_help_user">Inserisci il nome dell\'utente di Geocaching.com.</string> + <string name="warn_search_help_tb">Inserisci il codice del trackable. Per esempio \"TB29QMZ\".</string> + <string name="warn_log_text_fill">Prego, inserire del testo nel log.</string> + <string name="warn_load_images">c:geo non riesce a caricare immagini.</string> + <string name="warn_invalid_mapfile">La mappa selezionata non รจ mapsforge versione 0.3.0.\nMappa offline non disponibile.</string> + <string name="warn_deprecated_mapfile">Stai usando una vecchia mappa 0.2.4.\nAggiornala alla 0.3.0 appena puoi.\nIl supporto alla 0.2.4 sarร rimosso nella prossima versione.</string> + <string name="warn_nonexistant_mapfile">La mappa selezionata non esiste.\nMappa offline non disponibile.</string> + <string name="warn_rendertheme_missing">Tema mappa non trovato.</string> + <string name="info_log_posted">c:geo ha inviato il log con successo.</string> + <string name="info_log_saved">c:geo ha salvato il log.</string> + <string name="info_log_cleared">Il log รจ stato azzerato.</string> + <string name="info_log_type_changed">Il tipo di log รจ cambiato!</string> + <string name="info_select_logimage_cancelled">Selezione o cattura immagine annulata.</string> + <string name="info_stored_image">Nuova immagine salvata su:</string> + <string name="info_storing_static_maps">Tento di salvare le mappe statiche</string> + <string name="loc_last">Ultima nota</string> + <string name="loc_net">Network</string> + <string name="loc_gps">GPS</string> + <string name="loc_sat">Sat</string> + <string name="loc_trying">Localizzazione in corso</string> + <string name="loc_no_addr">Indirizzo sconosciuto</string> + <string name="loc_gps_disabled">GPS non attivo</string> + <string name="menu_about">Info su c:geo</string> + <string name="menu_helpers">Programmi utili</string> + <string name="menu_settings">Impostazioni</string> + <string name="menu_history">Cronologia</string> + <string name="menu_filter">Filtri</string> + <string name="menu_scan_geo">Scansiona geocode</string> + <string name="live_map_button">Mappa</string> + <string name="caches_nearby_button">Vicini</string> + <string name="advanced_search_button">Cerca</string> + <string name="stored_caches_button">Salvati</string> + <string name="any_button">Ovunque</string> + <string name="unknown_scan">Nessun geocode trovato nello scan.</string> + <string name="caches_no_cache">Non ci sono cache</string> + <string name="caches_more_caches">Carica altri cache</string> + <string name="caches_more_caches_no">Nessun\'altro cache</string> + <string name="caches_more_caches_loading">Caricamento dei cacheโฆ</string> + <string name="caches_more_caches_currently">attualmente</string> + <string name="caches_downloading">Download cache in corsoโฆ\nETA: </string> + <string name="caches_eta_ltm">Meno di un minuto</string> + <string name="caches_store_offline">Salva per Offline</string> + <string name="caches_store_selected">Salva selezionati</string> + <string name="caches_history">Cronologia</string> + <string name="caches_on_map">Visualizza sulla mappa</string> + <string name="caches_sort">Ordina</string> + <string name="caches_sort_title">Ordina per</string> + <string name="caches_sort_distance">Distanza</string> + <string name="caches_sort_difficulty">Difficoltร </string> + <string name="caches_sort_terrain">Terreno</string> + <string name="caches_sort_size">Dimensione</string> + <string name="caches_sort_favorites">Popolaritร </string> + <string name="caches_sort_name">Nome</string> + <string name="caches_sort_geocode">Geo Code</string> + <string name="caches_sort_rating">Voto</string> + <string name="caches_sort_vote">Il tuo voto</string> + <string name="caches_sort_inventory">Oggetti trackables</string> + <string name="caches_sort_date_hidden">Data</string> + <string name="caches_sort_date_logged">Data Log</string> + <string name="caches_sort_finds">Numero ritrovamenti</string> + <string name="caches_sort_state">Stato</string> + <string name="caches_sort_storage">Data salvataggio</string> + <string name="caches_select_mode">Modo Selezione</string> + <string name="caches_select_mode_exit">Esci dal modo Selezione</string> + <string name="caches_select_invert">Inverti selezione</string> + <string name="caches_nearby">Qui vicino</string> + <string name="caches_manage">Gestisci</string> + <string name="caches_drop_selected">Elimina selezionati</string> + <string name="caches_drop_selected_ask">Vuoi rimuovere i cache selezionati dal dispositivo?</string> + <string name="caches_drop_all">Elimina tutti</string> + <string name="caches_drop_all_ask">Vuoi rimuovere tutti i cache dalla lista corrente?</string> + <string name="caches_drop_stored">Elimina i cache salvati</string> + <string name="caches_drop_progress">Eliminazione dei cache</string> + <string name="caches_drop_all_and_list">Elimina tutti ed elimina la lista</string> + <string name="caches_delete_events">Cancella eventi passati</string> + <string name="caches_refresh_selected">Aggiorna i cache selezionati</string> + <string name="caches_refresh_all">Aggiorna tutti</string> + <string name="caches_move_selected">Muovi i cache selezionati</string> + <string name="caches_move_all">Muovi tutti</string> + <string name="caches_map_locus">Locus</string> + <string name="caches_map_locus_export">Esporta in Locus</string> + <string name="caches_recaptcha_title">reCAPTCHA</string> + <string name="caches_recaptcha_explanation">Per cortesia riporta il testo letto sull\'immagine. ร importante per scaricare le coordinate dei cache. ร tuttavia opzionale e puรฒ essere disattivato nei settaggi.</string> + <string name="caches_recaptcha_hint">Testo da immagine</string> + <string name="caches_recaptcha_continue">Continua</string> + <string name="caches_filter">Filtra</string> + <string name="caches_filter_title">Filtra per</string> + <string name="caches_filter_size">Dimensione</string> + <string name="caches_filter_type">Tipo</string> + <string name="caches_filter_track">Con oggetti trackables</string> + <string name="caches_filter_clear">Rimuovi filtri</string> + <string name="caches_filter_modified">Con coordinate modificate</string> + <string name="caches_filter_origin">Origine</string> + <string name="caches_filter_distance">Distanza</string> + <string name="caches_removing_from_history">Rimozione dalla cronologiaโฆ</string> + <string name="caches_clear_offlinelogs">Cancella i log offline</string> + <string name="caches_clear_offlinelogs_progress">Cancellazione logs offline</string> + <string name="list_menu">Lista</string> + <string name="list_menu_create">Crea nuova lista</string> + <string name="list_menu_drop">Elimina la lista corrente</string> + <string name="list_menu_change">Cambia lista</string> + <string name="list_menu_rename">Rinomina la lista corrente</string> + <string name="list_title">Seleziona una lista</string> + <string name="list_inbox">Salvate</string> + <string name="list_all_lists">Tutti i cache</string> + <string name="list_dialog_create_title">Nuova lista</string> + <string name="list_dialog_create">Crea</string> + <string name="list_dialog_cancel">Annulla</string> + <string name="list_dialog_create_ok">Lista creata</string> + <string name="list_dialog_create_err">c:geo non รจ riuscito a creare la lista</string> + <string name="list_dialog_remove_title">Rimuovi lista</string> + <string name="list_dialog_remove_description">Vuoi rimuovere la lista corrente? Tutti i cache contenuti verranno spostati nella lista base \"Salvati\".</string> + <string name="list_dialog_remove">Rimuovi</string> + <string name="list_dialog_remove_ok">Lista rimossa</string> + <string name="list_dialog_remove_err">c:geo non รจ riuscito a rimuovere la lista corrente</string> + <string name="list_dialog_rename_title">Rinomina lista</string> + <string name="list_dialog_rename">Rinomina</string> + <string name="about_version">Versione</string> + <string name="about_changelog">Modifiche</string> + <string name="about_donate">Donazioni</string> + <string name="about_donation_more">Donazione\nsviluppo</string> + <string name="about_contributors">Contributori</string> + <string name="about_license">Licenza</string> + <string name="about_apache_license"><a href="">Licenza Apache, versione 2.0</a></string> + <string name="about_help">Guida</string> + <string name="settings_title_services">Servizi</string> + <string name="settings_title_appearance">Aspetto</string> + <string name="settings_title_cachedetails">Dettagli cache</string> + <string name="settings_title_offlinedata">Dati offline</string> + <string name="settings_title_logging">Registro Log</string> + <string name="settings_title_map">Mappa</string> + <string name="settings_title_map_data">Dati mappa</string> + <string name="settings_title_map_content">Contenuto Mappa</string> + <string name="settings_title_gpx">GPX</string> + <string name="settings_title_basicmembers">Membri Basic</string> + <string name="settings_title_navigation">Navigazione</string> + <string name="settings_title_system">Sistema</string> + <string name="settings_title_navigation_menu">Menu di navigazione</string> + <string name="settings_category_browser">Browser</string> + <string name="settings_category_geocaching">Geocaching</string> + <string name="settings_category_social">Social media</string> + <string name="settings_category_logging_other">Altre opzioni di log</string> + <string name="settings_goto_url_button">altro โฆ</string> + <string name="settings_title_gc">Geocaching.com</string> + <string name="settings_activate_gc">Attiva</string> + <string name="settings_gc_legal_note">Per usare i servizi di Geocaching.com, si applicano i termini e le condizioni del Contratto Groundspeak che deve essere approvato dall\'utente.</string> + <string name="settings_info_facebook_login_title">Facebook Login</string> + <string name="settings_info_facebook_login">Con il tuo account di Facebook non puoi fare login su geocaching.com. Ma c\'รจ una soluzione semplice โฆ</string> + <string name="settings_authorize">Autorizza c:geo</string> + <string name="settings_reauthorize">Autorizza nuovamente c:geo</string> + <string name="init_oc">opencaching.de</string> + <string name="settings_activate_oc">Attiva</string> + <string name="init_oc_de_description">Autorizza c:geo a cercare cache ed accedere/filtrare i ritrovamenti su opencaching.de</string> + <string name="init_oc_pl">Opencaching.pl</string> + <string name="settings_activate_oc_pl">Attiva</string> + <string name="init_oc_pl_description">Autorizza c:geo a cercare cache ed accedere/filtrare i ritrovamenti su opencaching.de.</string> + <string name="init_gcvote">GCvote.com</string> + <string name="init_twitter">Twitter</string> + <string name="settings_activate_twitter">Attiva</string> + <string name="init_username">Utente</string> + <string name="init_password">Password</string> + <string name="init_login">Verifica login</string> + <string name="init_login_popup">Login</string> + <string name="init_login_popup_working">Loggingโฆ</string> + <string name="init_login_popup_ok">Login OK.</string> + <string name="init_login_popup_failed">Login fallito.</string> + <string name="init_login_popup_failed_reason">Login fallito: </string> + <string name="init_login_popup_not_authorized">Non autorizzato</string> + <string name="init_signature">Firma</string> + <string name="init_signature_help_text">Scrivi la tua firma da usare nei testi di log.\nStringhe speciali possono essere usate come: [DATE], [TIME], [DATETIME], [USER] e [NUMBER].\nSaranno espanse quando la firma viene inserita.</string> + <string name="init_signature_template_button">Stringhe speciali</string> + <string name="init_signature_template_date">Data</string> + <string name="init_signature_template_time">Ora</string> + <string name="init_signature_template_datetime">Data e Ora</string> + <string name="init_signature_template_user">Utente</string> + <string name="init_signature_template_number">Numero cache</string> + <string name="init_signature_template_owner">Proprietario</string> + <string name="init_ratingwanted">Rating 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">L\'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> + <string name="init_summary_autoload">Carica automaticamente descrizione estesa</string> + <string name="init_skin">Tema chiaro</string> + <string name="init_summary_skin">Usa tema chiaro\n(richiede riavvio di c:geo)</string> + <string name="init_address">Visualizza indirizzo</string> + <string name="init_summary_address">Visualizza indirizzo invece delle coordinate su pagina principale</string> + <string name="init_captcha">Visualizza CAPTCHA</string> + <string name="init_summary_captcha">Visualizza CAPTCHA se necessario (solo utenti base, non Premium)</string> + <string name="init_useenglish">Usa English in c:geo</string> + <string name="init_summary_useenglish">Usa sempre English in c:geo\n(richiede riavvio)</string> + <string name="init_exclude">Escludi i cache miei e trovati</string> + <string name="init_summary_exclude">Escludi i miei cache e queli che ho giร trovato</string> + <string name="init_showwaypoints">Mostra waypoints</string> + <string name="init_showwaypoint_description">Se sulla mappa si vedono meno cache del numero indicato, saranno mostrati anche i loro waypoints.</string> + <string name="init_disabled">Escludi disattivati</string> + <string name="init_summary_disabled">Escludi cache disattivati</string> + <string name="init_offline">Mappe statiche</string> + <string name="init_summary_offline">Salva le mappe statiche per uso offline</string> + <string name="init_offline_wp">Mappe statiche (WP)</string> + <string name="init_summary_offline_wp">Salva i waypoints delle mappe per uso offline</string> + <string name="init_save_log_img">Salva immagini</string> + <string name="init_summary_save_log_img">Salva immagini contenute nei log</string> + <string name="init_units">Usa sistema imperiale</string> + <string name="init_summary_units">Usa miglia/piedi invece del sistema metrico</string> + <string name="init_log_offline">Log offline</string> + <string name="init_summary_log_offline">Attiva log offline (non visualizzerร lo schermo di log online, non invierร subito il log)</string> + <string name="init_choose_list">Chiedi lista</string> + <string name="init_summary_choose_list">Chiedi la lista quando salvi un cache</string> + <string name="init_livelist">Visualizza direzione</string> + <string name="init_summary_livelist">Visualizza in che direzione sono i cache, nelle liste</string> + <string name="init_backup">Backup</string> + <string name="init_backup_backup">Backup</string> + <string name="init_backup_running">Creazione del backup del database dei cache in corsoโฆ</string> + <string name="init_backup_note">Si prega di notare che questa opzione farร backup o ripristino del database contenente i cache ed i waypoint, ma non le impostazioni. Quindi le tue informazioni di login non lasceranno mai questo dispositivo.</string> + <string name="init_backup_restore">Ripristino</string> + <string name="init_backup_success">Il database di c:geo รจ stato salvato con successo nel file: </string> + <string name="init_backup_failed">Backup del database di c:geo fallito.</string> + <string name="init_backup_unnecessary">Il database รจ vuoto, il backup non รจ necessario.</string> + <string name="init_restore_success">Ripristino completato.</string> + <string name="init_restore_failed">Ripristino fallito.</string> + <string name="init_restore_running">Ripristino del database dei cacheโฆ</string> + <string name="init_restore_confirm">Il database รจ vuoto. Vuoi ripristinare il backup?</string> + <string name="init_backup_last">Disponibile Backup di </string> + <string name="init_backup_last_no">Non esiste il file con il backup.</string> + <string name="settings_info_offline_maps_title">Informazioni su mappe Offline</string> + <string name="settings_info_offline_maps">c:Geo supporta le mappe per l\'utilizzo offline. Puoi scaricare le mappe da Mapsforge o addirittura creare le tue mappe dai dati di OSM. ร necessario selezionare la directory locale dove cercare le mappe offline per attivare questa funzionalitร .</string> + <string name="settings_info_themes_title">Informazioni sui temi mappa</string> + <string name="settings_info_themes">c:geo supporta i temi personalizzati per mappe offline. Questi possono essere usati per modificare lo stile di colore della mappa (ad esempio per avere una mappa notturna) o per evidenziare alcuni oggetti come piste ciclabili o linee di altitudine.</string> + <string name="init_mapsource_select">Seleziona il tipo di mappa</string> + <string name="settings_title_scale_map_text">Ridimensiona testo mappa</string> + <string name="settings_summary_scale_map_text">Ridimensiona il testo della mappa offline a seconda del dpi del dispositivo</string> + <string name="init_map_directory_description">Cartella con le mappe offline</string> + <string name="init_gpx_exportdir">Cartella di export GPX</string> + <string name="init_gpx_importdir">Cartella di import GPX</string> + <string name="init_maptrail">Mostra scia</string> + <string name="init_summary_maptrail">Mostra la scia nella Mappa</string> + <string name="init_share_after_export">Apri menu condivisione dopo export GPX</string> + <string name="init_trackautovisit">Visita TB</string> + <string name="init_summary_trackautovisit">Setta i miei oggetti Trackables automaticamente su \"visit\" quando invio log</string> + <string name="init_sigautoinsert">Inserisce automaticamente</string> + <string name="init_loaddirectionimg">Immagine di direzione</string> + <string name="init_summary_loaddirectionimg">Carica le immagini di direzione se necessario</string> + <string name="init_default_navigation_tool">Navigatore preferito</string> + <string name="init_secondary_navigation_tool">Navigazione secondaria</string> + <string name="init_default_navigation_tool_description">Qui puoi scegliere il tuo strumento di navigazione preferito. Sarร attivato cliccando l\'icona di navigazione vicino al titolo del cache.</string> + <string name="init_default_navigation_tool_select">Scegli navigatore</string> + <string name="init_default_navigation_tool_2_description">Qui puoi scegliere il tuo secondo navigatore preferito. Sarร attivato tenendo premuto l\'icona di navigazione vicino al titolo del cache.</string> + <string name="init_navigation_menu_description">Qui รจ possibile selezionare quale dei metodi disponibili di navigazione sarร visualizzato nel menu di navigazione per un cache o un waypoint. Gli strumenti non installati su questo dispositivo sono disabilitati.</string> + <string name="init_debug_title">Informazioni di Debug</string> + <string name="init_debug_note">c:geo puรฒ generare molte informazioni di debug. Per quanto queste informazioni non sono generalmente utili agli utenti di c:geo, gli sviluppatori potrebbero averne bisogno per analizzare un eventuale problema. In questo caso, vi sarร chiesto di settare l\'opzione sottostante ed inviare il log.</string> + <string name="init_debug">Attiva informazioni di debug</string> + <string name="init_dbonsdcard_title">Posizione Database</string> + <string name="init_dbonsdcard_note">Puoi decidere di salvare il database su memoria esterna. In questo caso risparmierai memoria interna ma potresti perdere un pochino di velocitร e c:geo non funzionerร se la tua scheda SD non sarร disponibile.</string> + <string name="init_dbonsdcard">Su memoria esterna</string> + <string name="init_dbmove_dbmove">Spostamento Database</string> + <string name="init_dbmove_running">Spostamento Database</string> + <string name="init_dbmove_success">Database spostato con successo.</string> + <string name="init_dbmove_failed">Spostamento fallito</string> + <string name="init_plain_logs">LOG semplificati</string> + <string name="init_summary_plain_logs">Visualizza i LOG senza colori</string> + <string name="init_use_native_ua">Browser Android</string> + <string name="init_summary_use_native_ua">Identifica come browser Android. Risolve alcuni problemi di login con alcuni provider di rete.</string> + <string name="init_rendertheme_folder">Directory per i temi mappa</string> + <string name="settings_open_website">Apri sito</string> + <string name="settings_settings">Impostazioni</string> + <string name="settings_information">Informazioni</string> + <string name="map_source_google_map">Google: Map</string> + <string name="map_source_google_satellite">Google: Satellite</string> + <string name="map_source_osm_mapnik">OSM: Mapnik</string> + <string name="map_source_osm_cyclemap">OSM: Cyclemap</string> + <string name="map_source_osm_offline">Offline</string> + <string name="init_sendToCgeo">Send to c:geo</string> + <string name="settings_info_send2cgeo_title">Informazioni su send2cgeo</string> + <string name="init_sendToCgeo_name">Nome dispositivo</string> + <string name="init_sendToCgeo_description">\"Send to c:geo\" permette di ricevere cache direttamente dal sito geocaching.com tramite un plugin speciale per Firefox o Chrome. Prima della registrazione leggere <a href="http://send2.cgeo.org/">http://send2.cgeo.org/</a>. ร necessario registrare questo dispositivo solo se intendi usare send2cgeo. C:geo funzionerร anche senza questa registrazione e senza send2cgeo.</string> + <string name="init_sendToCgeo_register">Richiedi registrazione</string> + <string name="init_sendToCgeo_registering">Registrazione in corso a \"Send to c:geo\"โฆ</string> + <string name="init_sendToCgeo_register_ok">Registrazione terminata. Il tuo PIN code รจ ####. Usalo sul sito di c:geo per aggiungere il dispositivo al tuo browser Firefox o Chrome.</string> + <string name="init_sendToCgeo_register_fail">Registrazione fallita.</string> + <string name="sendToCgeo_download_fail">c:geo non riesce a scaricare cache. Nessuna connessione internet o server send2c:geo non attivo.</string> + <string name="sendToCgeo_no_registration">c:geo non riesce a scaricare cache. La registrazione a send2c:geo รจ scaduta. Si prega di ripeterla nelle impostazioni.</string> + <string name="auth_twitter">Twitter</string> + <string name="auth_authorize">Autorizza c:geo</string> + <string name="auth_start">Avvia autorizzazione</string> + <string name="auth_again">Avvia ancora</string> + <string name="auth_finish">Fine</string> + <string name="auth_dialog_waiting">In attesa di %sโฆ</string> + <string name="auth_explain_short">Il processo seguente permetterร a <b>c:geo</b> di accedere a %s.</string> + <string name="auth_explain_long">Premendo il pulsante \"autorizza c:geo\" avrร inizio il processo. Verrร aperto un browser web con la pagina %s. Accedere alla pagina e lasciare che <b>c:geo</b> acceda al tuo account.</string> + <string name="auth_dialog_completed_twitter">c:geo รจ ora autorizzato a pubblicare su Twitter.</string> + <string name="auth_ocde">opencaching.de</string> + <string name="auth_ocpl">opencaching.pl</string> + <string name="auth_dialog_completed_oc">c:geo รจ ora autorizzato ad accedere a %s.</string> + <string name="cache_offline">Offline</string> + <string name="cache_offline_refresh">Aggiorna</string> + <string name="cache_offline_drop">Elimina</string> + <string name="cache_offline_store">Salva</string> + <string name="cache_offline_stored">Salvato nel dispositivo</string> + <string name="cache_offline_not_ready">Non disponibile offline</string> + <string name="cache_offline_time_about">circa</string> + <string name="cache_offline_time_mins">minuti fa</string> + <string name="cache_offline_time_mins_few">qualche minuto fa</string> + <string name="cache_offline_time_hour">un\'ora fa</string> + <string name="cache_offline_time_hours">ore fa</string> + <string name="cache_offline_time_days">giorni fa</string> + <string name="cache_premium">Premium</string> + <string name="cache_attributes">Attributi</string> + <string name="cache_inventory">Oggetti</string> + <string name="cache_log_offline">Log Offline</string> + <string name="cache_log_images_title">Immagini Log</string> + <string name="cache_log_image_default_title">Foto</string> + <string name="cache_personal_note">Note personali</string> + <string name="cache_personal_note_edit">Modifica</string> + <string name="cache_personal_note_upload">Carica</string> + <string name="cache_personal_note_uploading">Nota personale in caricamento</string> + <string name="cache_personal_note_upload_done">Nota personale caricata</string> + <string name="cache_personal_note_upload_cancelled">Caricamento nota personale annullato</string> + <string name="cache_personal_note_unstored">Cache non salvati</string> + <string name="cache_personal_note_store">Il cache verrร prima salvato per abilitare le note personali.</string> + <string name="cache_description">Descrizione</string> + <string name="cache_description_long">Descrizione estesa</string> + <string name="cache_description_table_note">La descrizione contiene una tabella formattata in modo tale che potresti aver bisogno di andare su %s per vederla correttamente.</string> + <string name="cache_watchlist_on">Questo cache รจ nella tua watchlist.</string> + <string name="cache_watchlist_not_on">Questo cache non รจ nella tua watchlist.</string> + <string name="cache_watchlist_add">Aggiungi alla watchlist</string> + <string name="cache_watchlist_remove">Rimuovi dalla watchlist</string> + <string name="cache_favpoint_on">Questo cache รจ uno dei tuoi favoriti.</string> + <string name="cache_favpoint_not_on">Questo cache non รจ uno dei tuoi favoriti.</string> + <string name="cache_favpoint_add">Aggiungi</string> + <string name="cache_favpoint_remove">Rimuovi</string> + <string name="cache_list_text">Lista:</string> + <string name="cache_list_change">Sposta</string> + <string name="cache_list_unknown">Non in una lista</string> + <string name="cache_images">Immagini</string> + <string name="cache_waypoints">Waypoints</string> + <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> + <string name="cache_dialog_loading_details_status_spoilers">Caricamento immagini spoiler</string> + <string name="cache_dialog_loading_details_status_logs">Caricamento log</string> + <string name="cache_dialog_loading_details_status_waypoints">Elaborazione waypoints</string> + <string name="cache_dialog_loading_details_status_gcvote">Caricamento GCVote</string> + <string name="cache_dialog_loading_details_status_cache">Salvataggio dati</string> + <string name="cache_dialog_loading_details_status_render">Creazione pagina</string> + <string name="cache_dialog_offline_save_title">Offline</string> + <string name="cache_dialog_offline_save_message">Salvataggio del cache per uso offlineโฆ</string> + <string name="cache_dialog_offline_drop_title">Offline</string> + <string name="cache_dialog_offline_drop_message">Eliminazione del cache dalla memoria del dispositivoโฆ</string> + <string name="cache_dialog_refresh_title">Aggiorna</string> + <string name="cache_dialog_refresh_message">Ricaricamento dettagli cacheโฆ</string> + <string name="cache_dialog_watchlist_add_title">Watchlist</string> + <string name="cache_dialog_watchlist_add_message">Aggiunto il cache alla watchlist in corsoโฆ</string> + <string name="cache_dialog_watchlist_remove_title">Watchlist</string> + <string name="cache_dialog_watchlist_remove_message">Rimozione dei cache dalla tua watchlistโฆ</string> + <string name="cache_dialog_favorite_add_title">Preferiti</string> + <string name="cache_dialog_favorite_add_message">Aggiungi il cache ai tuoi preferitiโฆ</string> + <string name="cache_dialog_favorite_remove_title">Preferiti</string> + <string name="cache_dialog_favorite_remove_message">Rimozione cache dai tuoi preferitiโฆ</string> + <string name="cache_menu_navigate">Naviga</string> + <string name="cache_menu_navigation_drive">Naviga (in auto)</string> + <string name="cache_menu_navigation_walk">Naviga (a piedi)</string> + <string name="cache_menu_navigation_bike">Naviga (in moto)</string> + <string name="cache_menu_maps_directions">Direzioni su Google Maps</string> + <string name="cache_menu_radar">Radar</string> + <string name="cache_menu_map">Mappa c:geo</string> + <string name="cache_menu_map_static">Mappe statiche</string> + <string name="cache_menu_download_map_static">Scarica mappe statiche</string> + <string name="cache_menu_rmaps">Rmaps</string> + <string name="cache_menu_map_ext">Mappa su app esterna</string> + <string name="cache_menu_streetview">Street View</string> + <string name="cache_menu_browser">Apri nel browser</string> + <string name="cache_menu_visit">Scrivi Log</string> + <string name="cache_menu_visit_offline">Scrivi Log offline</string> + <string name="cache_menu_spoilers">Immagini spoiler</string> + <string name="cache_menu_around">Cache qui intorno</string> + <string name="cache_menu_event">Aggiungi al calendario</string> + <string name="cache_menu_details">Dettagli</string> + <string name="cache_menu_refresh">Aggiorna</string> + <string name="cache_menu_share">Condividi cache</string> + <string name="cache_menu_move_list">Muovi in un\'altra lista</string> + <string name="cache_menu_gcc">GCC</string> + <string name="cache_menu_whereyougo">WhereYouGo</string> + <string name="cache_menu_oruxmaps">OruxMaps</string> + <string name="cache_menu_cachebeacon">Cache Beacon</string> + <string name="cache_menu_navigon">Navigon</string> + <string name="cache_status">Stato</string> + <string name="cache_status_offline_log">Log salvato</string> + <string name="cache_status_found">Trovato</string> + <string name="cache_status_archived">Archiviato</string> + <string name="cache_status_disabled">Non attivo</string> + <string name="cache_status_premium">Solo per utenti Premium</string> + <string name="cache_status_not_premium">Per tutti gli utenti</string> + <string name="cache_status_stored">Salvato</string> + <string name="cache_status_not_stored">Non salvato</string> + <string name="cache_geocode">Geo code</string> + <string name="cache_name">Nome</string> + <string name="cache_type">Tipo</string> + <string name="cache_size">Dimensione</string> + <string name="cache_distance">Distanza</string> + <string name="cache_difficulty">Difficoltร </string> + <string name="cache_terrain">Terreno</string> + <string name="cache_rating">Voto</string> + <string name="cache_own_rating">Il tuo voto</string> + <string name="cache_rating_of">di</string> + <string name="cache_favorite">Popolaritร </string> + <string name="cache_owner">Proprietario</string> + <string name="cache_hidden">Nascosto il</string> + <string name="cache_event">Data</string> + <string name="cache_location">Luogo</string> + <string name="cache_coordinates">Coordinate</string> + <string name="cache_coordinates_original">Coordinate originali</string> + <string name="cache_spoiler_images_title">Immagini spoiler</string> + <string name="cache_images_title">Immagini</string> + <string name="cache_log_types">Tipi di Log</string> + <string name="cache_coordinates_no">Questo cache non ha coordinate.</string> + <string name="cache_clear_history">Cancella cronologia</string> + <string name="cache_remove_from_history">Rimuovi dalla cronologia</string> + <string name="cache_license">Licenza</string> + <string name="cache_image">Immagine</string> + <string name="cache_image_open_file">Apri come file</string> + <string name="cache_image_open_browser">Apri nel browser</string> + <string name="cache_share_field">Condividi</string> + <string name="cache_time_full_hours">Precise</string> + <string name="cache_listed_on">Elencato su %s</string> + <string name="file_searching_in">Ricerca file\nin</string> + <string name="file_searching_sdcard_in">Nessun file trovato nella cartella di default:\n%1$s\n\nRicerca in tutta la SD dei file:\n</string> + <string name="file_list_no_files">c:geo non ha trovato file appropriati.</string> + <string name="file_searching">Ricerca file corrispondenti</string> + <string name="file_title_searching">Ricerca in corso</string> + <string name="simple_dir_chooser_title">Scegli cartella</string> + <string name="simple_dir_chooser_current_path">Path:</string> + <string name="gpx_import_loading_caches">Caricamento dei cache da file GPX</string> + <string name="gpx_import_loading_waypoints">Caricamento file waypoints</string> + <string name="gpx_import_store_static_maps">Salvataggio mappe statiche</string> + <string name="gpx_import_caches_imported">cache importati</string> + <string name="gpx_import_static_maps_skipped">Download mappe statiche interrotto</string> + <string name="gpx_import_title_static_maps">Salva mappe statiche</string> + <string name="gpx_import_title_reading_file">Lettura file</string> + <string name="gpx_import_title">Importa GPX</string> + <string name="gpx_import_title_caches_imported">Risultato</string> + <string name="gpx_import_title_caches_import_failed">Importazione fallita</string> + <string name="gpx_import_error_io">Impossibile leggere il file</string> + <string name="gpx_import_error_parser">Il formato del file non รจ compatibile</string> + <string name="gpx_import_error_unexpected">Errore inaspettato</string> + <string name="gpx_import_canceled">Importazione GPX annullata</string> + <string name="gpx_import_delete_title">Cancella file</string> + <string name="gpx_import_delete_message">Vuoi cancellare %s?</string> + <string name="gpx_import_select_list_title">Importa GPX nella lista</string> + <string name="map_file_select_title">Seleziona il file mappa</string> + <string name="web_import_title">Importa dal web</string> + <string name="web_import_waiting">In attesa di nuovi cache dal webโฆ</string> + <string name="web_downloading">Download in corso</string> + <string name="web_downloaded">Download terminato</string> + <string name="popup_more">Altri dettagli</string> + <string name="waypoint">Waypoint</string> + <string name="waypoint_cache_coordinates">Coordinate cache</string> + <string name="waypoint_custom">Custom</string> + <string name="waypoint_my_coordinates">Coordinate attuali</string> + <string name="waypoint_bearing">Angolo in gradi</string> + <string name="waypoint_distance">Distanza</string> + <string name="waypoint_name">Nome</string> + <string name="waypoint_edit">Modifica</string> + <string name="waypoint_delete">Elimina</string> + <string name="waypoint_edit_title">Modifica waypoint</string> + <string name="waypoint_add_title">Aggiungi waypoint</string> + <string name="waypoint_note">Note</string> + <string name="waypoint_visited">Visitato</string> + <string name="waypoint_save">Salva</string> + <string name="waypoint_loading">Caricamento waypointโฆ</string> + <string name="waypoint_do_not_touch_cache_coordinates">Nessuna modifica alle coordinate cache</string> + <string name="waypoint_set_as_cache_coords">Setta come coordinate cache in c:geo</string> + <string name="waypoint_save_and_modify_on_website">Setta come coordinate cache in c:geo e su web</string> + <string name="waypoint_reset_cache_coords">Resetta coordinate originali</string> + <string name="waypoint_coordinates_has_been_reset_on_website">Le coordinates sono state resettate su web</string> + <string name="waypoint_coordinates_being_reset_on_website">Le coordinate sono in fase di reset su web</string> + <string name="waypoint_reset">Reset</string> + <string name="waypoint_localy_reset_cache_coords">Resetta in c:geo</string> + <string name="waypoint_reset_local_and_remote_cache_coords">Resetta in c:geo e su web.</string> + <string name="waypoint_being_saved">Salvataggio Waypointโฆ</string> + <string name="waypoint_coordinates_couldnt_be_modified_on_website">Il sito web non supporta la modifica delle coordinate</string> + <string name="waypoint_coordinates_upload_error">Errore durante il caricamento delle coordinate su web</string> + <string name="waypoint_coordinates_uploading_to_website">Caricamento delle coordinate %s su web</string> + <string name="waypoint_coordinates_has_been_modified_on_website">Le coordinate cache su web sono state modificate in: %s.</string> + <string name="waypoint_done">Fatto</string> + <string name="waypoint_duplicate">Duplicato</string> + <string name="waypoint_copy_of">Copia di</string> + <string name="search_history">Cronologia</string> + <string name="search_history_empty">Nessuna precedente destinazione</string> + <string name="search_remove_destination">Destinazione rimossa</string> + <string name="search_clear_history">Cancella cronologia</string> + <string name="search_history_cleared">Cronologia azzerata</string> + <string name="waypoint_coordinate_formats_plain">Plain</string> + <string name="visit_tweet">Segnala questo ritrovamento su Twitter</string> + <string name="map_map">Mappa</string> + <string name="map_live">Mappa Live</string> + <string name="map_view_map">Scegli mappa</string> + <string name="map_modes">Modi mappa</string> + <string name="map_trail_show">Mostra scia</string> + <string name="map_trail_hide">Nasconde scia</string> + <string name="map_circles_show">Mostra area cache</string> + <string name="map_circles_hide">Nascondi area cache</string> + <string name="map_mycaches_show">Visualizza cache tuoi o che hai trovato</string> + <string name="map_mycaches_hide">Nascondi i tuoi cache o che hai trovato</string> + <string name="map_theme_builtin">Tema predefinito</string> + <string name="map_theme_select">Scegli un tema mappa</string> + <string name="map_live_enable">Attiva live</string> + <string name="map_live_disable">Disattiva live</string> + <string name="map_static_title">Mappe statiche</string> + <string name="map_static_loading">Caricamento mappe staticheโฆ</string> + <string name="map_token_err">Dato che c:geo riesce a scaricare solo dati parziali, le coordinate dei cache potrebbero non essere accurate.</string> + <string name="map_as_list">Mostra lista dei cache</string> + <string name="map_strategy">Strategia</string> + <string name="map_strategy_title">Strategia mappa Live</string> + <string name="map_strategy_fastest">La piรน veloce</string> + <string name="map_strategy_fast">Veloce</string> + <string name="map_strategy_auto">In base alla tua velocitร di movimento</string> + <string name="map_strategy_detailed">Dettagliata</string> + <string name="live_map_notification">Nella nuova Mappa Live le coordinate potrebbero non essere sempre precise. Coordinate possibilmente imprecise sono marcate da un cerchio arancione.\nAprendo i dettagli del cache o salvando il cache per uso offline farร calcolare sempre coordinate precise.\n\nInformazioni addizionali su tutte le modifiche si possono trovare nel menu \"Info su c:geo\" sulla pagina principale di questa app.</string> + <string name="live_map_note_dontshow">Non mostrare ancora</string> + <string name="search_bar_hint">Cerca cache</string> + <string name="search_bar_desc">Cache (geo code, parole chiave), oggetti Trackables (TB-code)</string> + <string name="search_coordinates">Coordinate</string> + <string name="search_coordinates_button">Cerca per coordinate</string> + <string name="search_address">Indirizzo</string> + <string name="search_address_button">Cerca per indirizzo</string> + <string name="search_geo">Geo code</string> + <string name="search_geo_button">Cerca per geo code</string> + <string name="search_kw">Parole chiave</string> + <string name="search_kw_prefill">Parola chiave</string> + <string name="search_kw_button">Cerca per parola chiave</string> + <string name="search_fbu">Trovata dall\'utente</string> + <string name="search_fbu_prefill">Nome utente</string> + <string name="search_fbu_button">Cerca per nome utente</string> + <string name="search_hbu">Nascosta dall\'utente</string> + <string name="search_hbu_prefill">Proprietario</string> + <string name="search_hbu_button">Cerca per proprietario</string> + <string name="search_tb">Oggetto Trackable</string> + <string name="search_tb_hint">Identificativo Trackable</string> + <string name="search_tb_button">Cerca per trackable</string> + <string name="search_destination">Destinazione</string> + <string name="search_direction_rel">Dalla posizione attuale</string> + <string name="search_address_started">Cerca per luoghi</string> + <string name="search_address_result">Cerca luoghi</string> + <string name="search_own_caches">Cerca i miei cache</string> + <string name="trackable">Oggetto Trackable</string> + <string name="trackable_details_loading">Caricamento dettagli Trackableโฆ</string> + <string name="trackable_log_touch">Documenta il contatto</string> + <string name="trackable_browser_open">Apri nel Browser</string> + <string name="trackable_goal">Obiettivo</string> + <string name="trackable_details">Dettagli</string> + <string name="trackable_image">Immagine</string> + <string name="trackable_code">TB-Code</string> + <string name="trackable_name">Nome</string> + <string name="trackable_type">Tipo</string> + <string name="trackable_owner">Proprietario</string> + <string name="trackable_spotted">Contattato</string> + <string name="trackable_spotted_in_cache">In</string> + <string name="trackable_spotted_at_user">Nelle mani di</string> + <string name="trackable_spotted_unknown_location">Posizione sconosciuta</string> + <string name="trackable_spotted_owner">Nelle mani del proprietario</string> + <string name="trackable_origin">Origine</string> + <string name="trackable_unknown">Sconosciuto</string> + <string name="trackable_released">Rilasciato</string> + <string name="trackable_distance">Portato</string> + <string name="trackable_touch">Contatto</string> + <string name="trackable_not_activated">Trackable non attivato</string> + <string name="geokret_type_traditional">Tradizionale</string> + <string name="geokret_type_book_or_media">Libro o media elettronici</string> + <string name="geokret_type_human">Umano</string> + <string name="geokret_type_coin">Moneta</string> + <string name="geokret_type_post">Posta</string> + <string name="user_menu_title">Info</string> + <string name="user_menu_view_hidden">Cache nascosti</string> + <string name="user_menu_view_found">Cache trovati</string> + <string name="user_menu_open_browser">Apri profilo nel browser</string> + <string name="user_menu_send_message">Invia messaggio</string> + <string name="navigation">Navigazione</string> + <string name="compass_title">Bussola</string> + <string name="use_gps">Usa Nord solo da GPS</string> + <string name="use_compass">Usa Nord da GPS e bussola</string> + <string name="destination_select">Scegli destinazione</string> + <string name="destination_set">Attiva destinazione</string> + <string name="navigation_direct_navigation">Navigazione diretta</string> + <string name="navigation_target">Destinazione</string> + <string name="err_nav_no_coordinates">Non รจ possibile avviare la navigazione senza coordinate</string> + <string name="license">Licenza</string> + <string name="license_show">Mostra licenza</string> + <string name="license_dismiss">Chiudi</string> + <string name="helper_calendar_title">c:geo calendario add-on</string> + <string name="helper_calendar_missing">c:geo calendario add-on non installato</string> + <string name="helper_calendar_description">Permette di esportare gli eventi cache nel calendario del tuo dispositivo.</string> + <string name="helper_locus_title">Locus</string> + <string name="helper_locus_description">Applicazione semplice da usare che mostra mappe online permettendo di scaricarle direttamente per l\'uso offline (solo mappe raster). Supporta inoltra la registrazione di traccia, gestione dei waypoints e altre utili funzioni.</string> + <string name="helper_gpsstatus_title">GPS Status</string> + <string name="helper_gpsstatus_description">Puoi usare il radar di questa applicazione con c:geo. Offre inoltre molte informazioni addizionali legate al GPS.</string> + <string name="helper_bluetoothgps_title">Bluetooth GPS</string> + <string name="helper_bluetoothgps_description">Permette di utilizzare un GPS esterno, garantendo maggiore precisione, migliore ricezione e prolungando la durata della batteria del tuo dispositivo.</string> + <string name="helper_barcode_title">Barcode Scanner</string> + <string name="helper_barcode_description">Ci sono script Greasemonkey e siti web che consentono di visualizzare un geocode come codice a barre. Con questa app c:geo puรฒ leggere il geocode direttamente dallo schermo del tuo computer.</string> + <string name="helper_pocketquery_title">Creatore di Pocket Query</string> + <string name="helper_pocketquery_description">Consente di creare facilmente Pocket Queries centrate sulla tua posizione attuale o un punto scelto dalla mappa. Richiede un account premium su Geocaching.com.</string> + <string name="addon_missing_title">Add-On mancante</string> + <string name="addon_download_prompt">Scaricalo ora da Google Play.</string> + <string name="export">Esporta</string> + <string name="export_exportedto">esportato in</string> + <string name="export_failed">Esportazione fallita</string> + <string name="export_fieldnotes">Field Note</string> + <string name="export_fieldnotes_info">Field Note saranno esportate in /sdcard/field-notes con data e ora corrente nel nome file.</string> + <string name="export_fieldnotes_upload">Carica su geocaching.com</string> + <string name="export_fieldnotes_uploading">Caricamentoโฆ</string> + <string name="export_fieldnotes_upload_success">Caricato su geocaching.com con successo</string> + <string name="export_fieldnotes_onlynew">Solo quelli nuovi rispetto all\'ultima esportazione</string> + <string name="export_fieldnotes_creating">Creazione Field Notesโฆ</string> + <string name="export_gpx">GPX</string> + <string name="export_gpx_info">Il file GPX sarร esportato in %1$s con data ed ora correnti come nome file.</string> + <string name="export_gpx_to">Invia il GPX esportato a</string> + <string name="attribute_dogs_yes">Cani permessi</string> + <string name="attribute_dogs_no">Cani NON permessi</string> + <string name="attribute_bicycles_yes">Biciclette permesse</string> + <string name="attribute_bicycles_no">Biciclette NON permesse</string> + <string name="attribute_motorcycles_yes">Moto permesse</string> + <string name="attribute_motorcycles_no">Moto NON permesse</string> + <string name="attribute_quads_yes">Quad permessi</string> + <string name="attribute_quads_no">Quad NON permessi</string> + <string name="attribute_jeeps_yes">Veicoli fuoristrada permessi</string> + <string name="attribute_jeeps_no">Veicoli fuoristrada NON permessi</string> + <string name="attribute_snowmobiles_yes">Motoslitte permesse</string> + <string name="attribute_snowmobiles_no">Motoslitte NON permesse</string> + <string name="attribute_horses_yes">Cavalli permessi</string> + <string name="attribute_horses_no">Cavalli NON permessi</string> + <string name="attribute_campfires_yes">Fuochi da campo permessi</string> + <string name="attribute_campfires_no">Fuochi da campo NON permessi</string> + <string name="attribute_rv_yes">Camper/roulotte permessi</string> + <string name="attribute_rv_no">Camper/roulotte NON permessi</string> + <string name="attribute_kids_yes">Raccomandato per bambini</string> + <string name="attribute_kids_no">Non raccomandato per bambini</string> + <string name="attribute_onehour_yes">Richiede meno di un\'ora</string> + <string name="attribute_onehour_no">Richiede piรน di un\'ora</string> + <string name="attribute_scenic_yes">Panoramico</string> + <string name="attribute_scenic_no">Non panoramico</string> + <string name="attribute_hiking_yes">Trekking impegnativo</string> + <string name="attribute_hiking_no">Trekking facile</string> + <string name="attribute_climbing_yes">Arrampicata difficile</string> + <string name="attribute_climbing_no">Arrampicata facile o assente </string> + <string name="attribute_wading_yes">Puรฒ richiedere un guado</string> + <string name="attribute_wading_no">Non prevede guadi</string> + <string name="attribute_swimming_yes">Puรฒ richiedere nuoto</string> + <string name="attribute_swimming_no">Non richiede nuoto</string> + <string name="attribute_available_yes">Disponibile ad ogni ora del giorno</string> + <string name="attribute_available_no">Non disponibile ad ogni ora del giorno</string> + <string name="attribute_night_yes">Raccomandato di notte</string> + <string name="attribute_night_no">Non raccomandato di notte</string> + <string name="attribute_winter_yes">Disponibile d\'inverno</string> + <string name="attribute_winter_no">Non disponibile d\'inverno</string> + <string name="attribute_stealth_yes">Richiede invisibilitร </string> + <string name="attribute_stealth_no">Non richiede invisibilitร </string> + <string name="attribute_firstaid_yes">Necessita di manutenzione</string> + <string name="attribute_firstaid_no">Non necessita di manutenzione</string> + <string name="attribute_cow_yes">Attenzione agli animali selvatici</string> + <string name="attribute_cow_no">Non ci sono animali selvatici</string> + <string name="attribute_field_puzzle_yes">Terreno accidentato</string> + <string name="attribute_field_puzzle_no">Terreno non accidentato</string> + <string name="attribute_nightcache_yes">Cache notturno</string> + <string name="attribute_nightcache_no">Cache non notturno</string> + <string name="attribute_parkngrab_yes">Parcheggia e trova! (park and grab)</string> + <string name="attribute_parkngrab_no">Parcheggio lontano</string> + <string name="attribute_abandonedbuilding_yes">Struttura abbandonata</string> + <string name="attribute_abandonedbuilding_no">Struttura non abbandonata</string> + <string name="attribute_hike_short_yes">Breve trekking (meno di 1 km)</string> + <string name="attribute_hike_short_no">Trekking non breve</string> + <string name="attribute_hike_med_yes">Medio trekking (da 1 km a 10 km)</string> + <string name="attribute_hike_med_no">Trekking non medio</string> + <string name="attribute_hike_long_yes">Lungo trekking (piรน di 10 km)</string> + <string name="attribute_hike_long_no">Trekking non lungo</string> + <string name="attribute_seasonal_yes">Accesso stagionale</string> + <string name="attribute_seasonal_no">Nessun limite stagionale</string> + <string name="attribute_touristok_yes">Turistico</string> + <string name="attribute_touristok_no">Non turistico</string> + <string name="attribute_frontyard_yes">Residenza privata</string> + <string name="attribute_frontyard_no">Residenza non privata</string> + <string name="attribute_teamwork_yes">Richiesto lavoro di gruppo</string> + <string name="attribute_teamwork_no">Fattibile anche da soli</string> + <string name="attribute_landf_yes">Tour \"Lost and found\"</string> + <string name="attribute_landf_no">Non รจ un tour \"Lost and found\"</string> + <string name="attribute_partnership_yes">Cache di gruppo</string> + <string name="attribute_partnership_no">Cache non di gruppo</string> + <string name="attribute_fee_yes">Accesso o parcheggio a pagamento</string> + <string name="attribute_fee_no">Accesso o parcheggio non a pagamento</string> + <string name="attribute_rappelling_yes">Richiesta attrezzatura da arrampicata</string> + <string name="attribute_rappelling_no">Attrezzatura da arrampicata non necessaria</string> + <string name="attribute_boat_yes">Necessaria imbarcazione</string> + <string name="attribute_boat_no">Imbarcazione non necessaria</string> + <string name="attribute_scuba_yes">Richiesta attrezzatura da sub</string> + <string name="attribute_scuba_no">Attrezzatura da sub non necessaria</string> + <string name="attribute_flashlight_yes">Richiesta torcia elettrica</string> + <string name="attribute_flashlight_no">Torcia elettrica non necessaria</string> + <string name="attribute_uv_yes">Richiesta lampada UV</string> + <string name="attribute_uv_no">Lampada UV non necessaria</string> + <string name="attribute_snowshoes_yes">Richieste calzature da neve</string> + <string name="attribute_snowshoes_no">Calzature da neve non necessarie</string> + <string name="attribute_skiis_yes">Richiesti sci da fondo</string> + <string name="attribute_skiis_no">Sci da fondo non necessari</string> + <string name="attribute_s_tool_yes">Richiesti attrezzi speciali</string> + <string name="attribute_s_tool_no">Attrezzi speciali non necessari</string> + <string name="attribute_wirelessbeacon_yes">Segnalatore radio necessario</string> + <string name="attribute_wirelessbeacon_no">Segnalatore radio non necessario</string> + <string name="attribute_treeclimbing_yes">Richiede di salire su un albero</string> + <string name="attribute_treeclimbing_no">Non richiede di salire su un albero</string> + <string name="attribute_poisonoak_yes">Piante velenose</string> + <string name="attribute_poisonoak_no">Piante non velenose</string> + <string name="attribute_dangerousanimals_yes">Animali pericolosi</string> + <string name="attribute_dangerousanimals_no">Animali non pericolosi</string> + <string name="attribute_ticks_yes">Zecche / insetti</string> + <string name="attribute_ticks_no">Non ci sono zecche / insetti</string> + <string name="attribute_mine_yes">Miniere abbandonate</string> + <string name="attribute_mine_no">Miniere non abbandonate</string> + <string name="attribute_cliff_yes">Strapiombo / caduta massi</string> + <string name="attribute_cliff_no">Nessun strapiombo / caduta massi</string> + <string name="attribute_hunting_yes">Zona di caccia</string> + <string name="attribute_hunting_no">Zona non di caccia</string> + <string name="attribute_danger_yes">Area pericolosa</string> + <string name="attribute_danger_no">Area non pericolosa</string> + <string name="attribute_thorn_yes">Rovi</string> + <string name="attribute_thorn_no">Senza rovi</string> + <string name="attribute_wheelchair_yes">Accessibile con sedia a rotelle</string> + <string name="attribute_wheelchair_no">Non accessibile con sedia a rotelle</string> + <string name="attribute_parking_yes">Parcheggio</string> + <string name="attribute_parking_no">Parcheggio non disponibile</string> + <string name="attribute_public_yes">Servito da trasporto pubblico</string> + <string name="attribute_public_no">Non servito da trasporto pubblico</string> + <string name="attribute_water_yes">Vicino ad acqua potabile</string> + <string name="attribute_water_no">Lontano da acqua potabile</string> + <string name="attribute_restrooms_yes">Vicino ad alloggi pubblici</string> + <string name="attribute_restrooms_no">Lontano da alloggi pubblici</string> + <string name="attribute_phone_yes">Vicino a telefono pubblico</string> + <string name="attribute_phone_no">Lontano da telefoni</string> + <string name="attribute_picnic_yes">Vicino a zona picnic</string> + <string name="attribute_picnic_no">Zone picnic non vicine</string> + <string name="attribute_camping_yes">Campeggio disponibile</string> + <string name="attribute_camping_no">Campeggio non disponibile</string> + <string name="attribute_stroller_yes">Accessibile con passeggino</string> + <string name="attribute_stroller_no">Non accessibile con passeggino</string> + <string name="attribute_fuel_yes">Vicino a pompa carburante</string> + <string name="attribute_fuel_no">Lontano da pompa carburante</string> + <string name="attribute_food_yes">Vicino a punto ristoro</string> + <string name="attribute_food_no">Lontano da punti ristoro</string> + <string name="attribute_oc_only_yes">Loggabile solo su Opencaching</string> + <string name="attribute_oc_only_no">Loggabile non solo su Opencaching</string> + <string name="attribute_link_only_yes">Hyperlink solo verso un altro portale di cache</string> + <string name="attribute_link_only_no">Non solo hyperlink ad un altro portale di cache</string> + <string name="attribute_letterbox_yes">Lettera (richiede francobollo)</string> + <string name="attribute_letterbox_no">No lettera (non richiede francobollo)</string> + <string name="attribute_railway_yes">Ferrovia attiva nelle vicinanze</string> + <string name="attribute_railway_no">Nessuna ferrovia nelle vicinanze</string> + <string name="attribute_syringe_yes">Pronto soccorso disponibile</string> + <string name="attribute_syringe_no">Pronto soccorso non disponibile</string> + <string name="attribute_swamp_yes">Paludoso</string> + <string name="attribute_swamp_no">Non paludoso</string> + <string name="attribute_hills_yes">Area collinare</string> + <string name="attribute_hills_no">Area non collinare</string> + <string name="attribute_easy_climbing_yes">Facile scalata</string> + <string name="attribute_easy_climbing_no">Non รจ una facile scalata</string> + <string name="attribute_poi_yes">Punto di interesse</string> + <string name="attribute_poi_no">Non รจ un punto di interesse</string> + <string name="attribute_moving_target_yes">Obiettivo in movimento</string> + <string name="attribute_moving_target_no">Obiettivo non in movimento</string> + <string name="attribute_webcam_yes">Webcam</string> + <string name="attribute_webcam_no">No webcam</string> + <string name="attribute_inside_yes">Con aree interne (cave, edifici etc.)</string> + <string name="attribute_inside_no">Senza aree interne ad edifici</string> + <string name="attribute_in_water_yes">In acqua</string> + <string name="attribute_in_water_no">Non in acqua</string> + <string name="attribute_no_gps_yes">Senza GPS (lettere, carta e bussolaโฆ)</string> + <string name="attribute_no_gps_no">Con GPS</string> + <string name="attribute_overnight_yes">Necessario permanere di notte</string> + <string name="attribute_overnight_no">Permanenza notturna non necessaria</string> + <string name="attribute_specific_times_yes">Disponibile solo in certi orari</string> + <string name="attribute_specific_times_no">Disponibile a tutte le ore</string> + <string name="attribute_day_yes">Solo di giorno</string> + <string name="attribute_day_no">Non solo di giorno</string> + <string name="attribute_tide_yes">Marea</string> + <string name="attribute_tide_no">Senza marea</string> + <string name="attribute_all_seasons_yes">Tutte le stagioni</string> + <string name="attribute_all_seasons_no">Non in tutte le stagioni</string> + <string name="attribute_breeding_yes">Stagione di riproduzione / natura protetta</string> + <string name="attribute_breeding_no">Disponibile anche in stagione di riproduzione / natura protetta</string> + <string name="attribute_snow_proof_yes">Nascondiglio a prova di neve</string> + <string name="attribute_snow_proof_no">Nascondiglio non a prova di neve</string> + <string name="attribute_compass_yes">Bussola</string> + <string name="attribute_compass_no">Senza bussola</string> + <string name="attribute_cave_yes">Equipaggiamento da caverna</string> + <string name="attribute_cave_no">Senza equipaggiamento da caverna</string> + <string name="attribute_aircraft_yes">Aereo</string> + <string name="attribute_aircraft_no">Senza aereo</string> + <string name="attribute_investigation_yes">Investigazione richiesta</string> + <string name="attribute_investigation_no">Investigazione non richiesta</string> + <string name="attribute_puzzle_yes">Puzzle / Mystery</string> + <string name="attribute_puzzle_no">No puzzle / mystery</string> + <string name="attribute_arithmetic_yes">Problema aritmetico</string> + <string name="attribute_arithmetic_no">Problema non aritmetico</string> + <string name="attribute_other_cache_yes">Cache di altro tipo</string> + <string name="attribute_other_cache_no">Cache non di altro tipo</string> + <string name="attribute_ask_owner_yes">Chiedere al proprietario per le condizioni di partenza</string> + <string name="attribute_ask_owner_no">Non chiedere al proprietario per le condizioni di partenza</string> + <string name="attribute_unknown_yes">Attributo sconosciuto</string> + <string name="attribute_unknown_no">Senza attributo sconosciuto</string> + <string name="attribute_geotour_yes">Parte di un GeoTour</string> + <string name="attribute_geotour_no">Non fa parte di un GeoTour</string> + <string name="quote">Per rendere il geocaching piรน facile e gli utenti piรน pigri.</string> + <string name="powered_by">carnero</string> + <string name="support">Supporto: <a href="">support@cgeo.org</a></string> + <string name="website">Sito: <a href="">cgeo.org</a></string> + <string name="facebook">Facebook: <a href="">c:geo page</a></string> + <string name="twitter">Twitter: <a href="">@android_GC</a></string> + <string name="nutshellmanual">Manuale: <a href="">c:geo in a Nutshell</a></string> + <string name="market">Android: <a href="">c:geo su Google Play</a></string> + <string name="about_twitter">Puรฒ <b>c:geo</b> pubblicare su Twitter ogni volta che logghi un cache?</string> + <string name="faq">FAQ: <a href="">faq.cgeo.org</a></string> + <string name="status_new_release" tools:ignore="UnusedResources">Una nuova versione รจ disponibile.\nClicca per installarla.</string> + <string name="status_new_nightly" tools:ignore="UnusedResources">Una nuova versione nightly รจ disponibile.\nClicca per installarla.</string> + <string name="status_new_rc" tools:ignore="UnusedResources">Una nuova release candidate รจ disponibile.\nClicca per installarla.</string> + <string name="status_geocaching_change" tools:ignore="UnusedResources">Modifiche recenti al sito geocaching hanno disattivato c:geo.\nCi stiamo lavorando, riprova piรน tardi.</string> + <string name="status_geocaching_livemap" tools:ignore="UnusedResources">Modifiche recenti al sito geocaching hanno disattivato la mappa live.\nCi stiamo lavorando, riprova piรน tardi.</string> <string name="status_closeout_warning" tools:ignore="UnusedResources">Sembra che tu stia utilizzando una versione di Android precedente alla 2.1. Le future versioni di c:geo potrebbero non supportare il tuo dispositivo.</string> - - <!-- text-to-speech for compass view --> - <string name="tts_service">Bussola parlante</string> - <string name="tts_start">Start voce</string> - <string name="tts_stop">Stop voce</string> - <string name="tts_one_kilometer">un chilometro</string> - <plurals name="tts_kilometers"> - <item quantity="one">un chilometro</item> - <item quantity="other">%s chilometri</item> - </plurals> - <string name="tts_one_meter">un metro</string> - <plurals name="tts_meters"> - <item quantity="one">un metro</item> - <item quantity="other">%s metri</item> - </plurals> - <string name="tts_one_mile">un miglio</string> - <plurals name="tts_miles"> - <item quantity="one">un miglio</item> - <item quantity="other">%s miglia</item> - </plurals> - <string name="tts_one_foot">un piede</string> - <plurals name="tts_feet"> - <item quantity="one">un piede</item> - <item quantity="other">%s piedi</item> - </plurals> - <string name="tts_one_oclock">a ore una</string> - <string name="tts_oclock">a ore %s</string> - - <!-- various --> - <string name="clipboard_copy_ok">Copiato nella clipboard</string> - - <plurals name="days_ago"> - <item quantity="one">ieri</item> - <item quantity="other">%d giorni fa</item> - </plurals> - + <string name="tts_service">Bussola parlante</string> + <string name="tts_start">Start voce</string> + <string name="tts_stop">Stop voce</string> + <string name="err_tts_lang_not_supported">Il linguaggio attivo non รจ supportato dal modulo di sintesi vocale.</string> + <string name="tts_one_kilometer">un chilometro</string> + <string name="tts_one_meter">un metro</string> + <string name="tts_one_mile">un miglio</string> + <string name="tts_one_foot">un piede</string> + <string name="tts_one_oclock">a ore una</string> + <string name="tts_oclock">a ore %s</string> + <string name="clipboard_copy_ok">Copiato nella clipboard</string> + <string-array name="log_image_scales"> + <item>Dimensioni originali</item> + <item>512 px</item> + <item>640 px</item> + <item>800 px</item> + <item>1024 px</item> + </string-array> + <plurals name="caches_eta_mins"> + <item quantity="one">minuto</item> + <item quantity="other">minuti</item> + </plurals> + <plurals name="cache_counts"> + <item quantity="one">Un cache</item> + <item quantity="other">%1$d cache</item> + </plurals> + <plurals name="waypoints"> + <item quantity="one">1 Waypoint</item> + <item quantity="other">%d Waypoint</item> + </plurals> + <plurals name="tts_kilometers"> + <item quantity="one">un chilometro</item> + <item quantity="other">%s chilometri</item> + </plurals> + <plurals name="tts_meters"> + <item quantity="one">un metro</item> + <item quantity="other">%s metri</item> + </plurals> + <plurals name="tts_miles"> + <item quantity="one">un miglio</item> + <item quantity="other">%s miglia</item> + </plurals> + <plurals name="tts_feet"> + <item quantity="one">un piede</item> + <item quantity="other">%s piedi</item> + </plurals> + <plurals name="days_ago"> + <item quantity="one">ieri</item> + <item quantity="other">%d giorni fa</item> + </plurals> </resources> diff --git a/main/res/values-ja/strings.xml b/main/res/values-ja/strings.xml index 377b2b4..fab02c2 100644 --- a/main/res/values-ja/strings.xml +++ b/main/res/values-ja/strings.xml @@ -332,7 +332,6 @@ <!-- caches lists --> <string name="list_menu">ใชในใ</string> <string name="list_menu_create">ๆฐใใใชในใใไฝๆ</string> - <string name="list_menu_all_lists">ๅ
จใฆใฎใญใฃใใทใฅ</string> <string name="list_menu_drop">ใใฎใชในใใๆถๅป</string> <string name="list_menu_change">ๅฅใฎใชในใใซใใ</string> <string name="list_menu_rename">ใใฎใชในใๅใๅคๆด</string> @@ -386,8 +385,8 @@ <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">ๆๅนๅ</string> <string name="init_oc_de_description">ใญใฃใใทใฅใๆค็ดขใใใ่ฆใคใใใญใฃใใทใฅใซใขใฏใปใน/ใใฃใซใฟใชใณใฐใใใใใใใใซc:geoใซopencaching.deใ่ช่จผใใใใ</string> - <string name="init_register_oc_de">c:geoใ่ช่จผ</string> - <string name="init_reregister_oc_de">ๅๅบฆc:geoใ่ช่จผ</string> + <string name="settings_authorize">c:geoใ่ช่จผ</string> + <string name="settings_reauthorize">ๅๅบฆc:geoใ่ช่จผ</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">ๆๅนๅ</string> @@ -400,8 +399,6 @@ <string name="init_login_popup_failed">ใญใฐใคใณๅคฑๆ</string> <string name="init_login_popup_failed_reason">ใญใฐใคใณใซๅคฑๆใใพใใใๅๅ : </string> <string name="init_login_popup_not_authorized">่ช่จผใงใใพใใใงใใ</string> - <string name="init_twitter_authorize">c:geoใ่ช่จผ</string> - <string name="init_twitter_reauthorize">ๅๅบฆc:geoใ่ช่จผ</string> <string name="init_signature">็ฝฒๅ</string> <string name="init_signature_help_text">ใญใฐๆฌๆใงไฝฟใ็ฝฒๅใๅ
ฅๅใใฆใใ ใใใ\n็นๅฅใชๆๅญใจใใฆใ[DATE]ใ[TIME]ใ[DATETIME]ใ[USER]ใ[NUMBER]ใใใใพใใ\nใใใใฏ็ฝฒๅใฎๆฟๅ
ฅๆใซใๆฅไปใๆ้ใๆฅๆใใฆใผใถๅใ่ฆใคใใใญใฃใใทใฅๆฐ+1ใซๅคๆใใใพใใ</string> <string name="init_signature_template_button">ใใณใใฌใผใใๆฟๅ
ฅ</string> @@ -519,28 +516,11 @@ <string name="auth_authorize">c:geoใ่ช่จผ</string> <string name="auth_start">่ช่จผใ้ๅง</string> <string name="auth_again">ๅๅบฆ่ช่จผใ้ๅง</string> - <string name="auth_pin_hint">TwitterใฎPINใณใผใ</string> <string name="auth_finish">ๅฎไบ</string> - <string name="auth_dialog_wait">Twitterใใใฎ่ฟ็ญใๅพ
ใฃใฆใใพใโฆ</string> - <string name="auth_dialog_pin_title">PINใณใผใ</string> - <string name="auth_dialog_pin_message">Twitterใฎใตใคใใง่กจ็คบใใใPINใณใผใใๅ
ฅๅใใฆใใ ใใใ่ช่จผใๅฎไบใใใใใซๅฟ
่ฆใงใใ</string> - <string name="auth_dialog_completed">c:geoใฏTwitterใซใในใใใใใใฎ่ช่จผใๅใใพใใใ</string> - <string name="about_auth_1"><b>c:geo</b>ใTwitterใซใขใฏใปในใใ่จฑๅฏใๅพใใซใฏๆฌกใฎใใใซใใฆใใ ใใใ</string> - <string name="about_auth_2">ใ่ช่จผใ้ๅงใใใใใฟใณใๆผใใจใใฉใฆใถใงTwitterใฎใใผใธใ้ใใพใใใใฎใใผใธใซใญใฐใคใณใใใฐ<b>c:geo</b>ใใใชใใฎใขใซใฆใณใใซใขใฏใปใซใใ่จฑๅฏใๅพใใใพใใใญใฐใคใณใซๆๅใใใๆฐๅญใฎPINใณใผใใ่กจ็คบใใใใฎใงใใใฎไธใฎๅ
ฅๅๆฌใซใณใใผ&ใใผในใใใฆใๅฎไบใใใฟใณใๆผใใฆใใ ใใใ</string> <!-- auth opencaching --> <string name="auth_ocde">opencaching.de</string> - <string name="auth_authorize_oc">c:geoใ่ช่จผ</string> - <string name="auth_start_oc">่ช่จผใ้ๅง</string> - <string name="auth_again_oc">ๅๅบฆ่ช่จผใ้ๅง</string> - <string name="auth_pin_hint_oc">%sใฎPINใณใผใ</string> - <string name="auth_finish_oc">ๅฎไบ</string> - <string name="auth_dialog_wait_oc">%sใใใฎ่ฟ็ญใๅพ
ใฃใฆใใพใโฆ</string> - <string name="auth_dialog_pin_title_oc">PINใณใผใ</string> - <string name="auth_dialog_pin_message_oc">%sใฎใตใคใใง่กจ็คบใใใPINใณใผใใๅ
ฅๅใใฆใใ ใใใ่ช่จผใๅฎไบใใใใใซๅฟ
่ฆใงใใ</string> <string name="auth_dialog_completed_oc">c:geoใฏ%sใจ้ฃๆบใใใใใฎ่ช่จผใๅใใพใใใ</string> - <string name="about_auth_1_oc"><b>c:geo</b>ใ%sใซใขใฏใปในใใ่จฑๅฏใๅพใใซใฏๆฌกใฎใใใซใใฆใใ ใใใ</string> - <string name="about_auth_2_oc">ใ่ช่จผใ้ๅงใใใใใฟใณใๆผใใจใใฉใฆใถใง%sใฎใใผใธใ้ใใพใใใใฎใใผใธใซใญใฐใคใณใใใฐ<b>c:geo</b>ใใใชใใฎใขใซใฆใณใใซใขใฏใปใซใใ่จฑๅฏใๅพใใใพใใใญใฐใคใณใซๆๅใใใๆฐๅญใฎPINใณใผใใ่กจ็คบใใใใฎใงใใใฎไธใฎๅ
ฅๅๆฌใซใณใใผ&ใใผในใใใฆใๅฎไบใใใฟใณใๆผใใฆใใ ใใใ</string> <!-- cache --> <plurals name="cache_counts"> diff --git a/main/res/values-nb/strings.xml b/main/res/values-nb/strings.xml index d49583e..57545e6 100644 --- a/main/res/values-nb/strings.xml +++ b/main/res/values-nb/strings.xml @@ -196,7 +196,7 @@ <string name="init_login_popup_ok">Innlogging fullfรธrt.</string> <string name="init_login_popup_failed">Innlogging mislyktes.</string> <string name="init_login_popup_failed_reason">Innlogging mislyktes p.g.a.</string> - <string name="init_twitter_authorize">Autoriser c:geo</string> + <string name="settings_authorize">Autoriser c:geo</string> <string name="init_signature">Signatur</string> <string name="init_skin">Hvitt tema</string> <string name="init_summary_skin">Hvitt tema</string> @@ -220,12 +220,7 @@ <string name="auth_authorize">Autoriser c:geo</string> <string name="auth_start">Start autorisasjon</string> <string name="auth_again">Prรธv igjen</string> - <string name="auth_pin_hint">PIN-kode oppgitt av Twitter</string> <string name="auth_finish">Fullfรธr</string> - <string name="auth_dialog_wait">venter pรฅ Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN-kode</string> - <string name="auth_dialog_pin_message">Vennligst tast inn PIN-koden oppgitt av Twitter. Det er obligatorisk at du fullfรธrer autorisasjonen.</string> - <string name="auth_dialog_completed">c:geo kan nรฅ poste pรฅ Twitter.</string> <!-- cache --> <plurals name="cache_counts"> @@ -389,7 +384,5 @@ <string name="website">web-side: <a href="http://cgeo.org/">cgeo.org</a></string> <string name="facebook">facebook: <a href="http://www.facebook.com/pages/cgeo/297269860090">c:geo page</a></string> <string name="about_twitter">รnsker du at <b>c:geo</b> skal poste en status pรฅ Twitter hver gang du logger ett funn via <b>c:geo</b>?</string> - <string name="about_auth_1">Den fรธlgende prosessen tillater <b>c:geo</b> tilgang til Twitter - hvis bruker samtykker.</string> - <string name="about_auth_2">Trykk pรฅ \"Start autorisasjon\" knappen for รฅ starte prosessen. Denne prosessen vil รฅpne Twitter i web-leseren. Logg inn, og tillat <b>c:geo</b> tilgang til kontoen din. Hvis du aksepterer, vil Twitter oppgi en numerisk PIN-kode. Denne PIN-koden mรฅ sรฅ limes inn i <b>c:geo</b>. Verre er det ikke.</string> </resources> diff --git a/main/res/values-nl/strings.xml b/main/res/values-nl/strings.xml index bdecc02..19829d4 100644 --- a/main/res/values-nl/strings.xml +++ b/main/res/values-nl/strings.xml @@ -305,7 +305,6 @@ <!-- caches lists --> <string name="list_menu">Lijst</string> <string name="list_menu_create">Maak nieuwe lijst</string> - <string name="list_menu_all_lists">Alle caches</string> <string name="list_menu_drop">Verwijder huidige lijst</string> <string name="list_menu_change">Pas lijst aan</string> <string name="list_menu_rename">Hernoem huidige lijst</string> @@ -344,7 +343,7 @@ <string name="init_login_popup_ok">Ingelogd.</string> <string name="init_login_popup_failed">Inloggen mislukt.</string> <string name="init_login_popup_failed_reason">Inloggen mislukt omdat </string> - <string name="init_twitter_authorize">c:geo Autoriseren</string> + <string name="settings_authorize">c:geo Autoriseren</string> <string name="init_signature">Handtekening</string> <string name="init_signature_help_text">Maak een handtekening om te gebruiken in logs.\nSpeciale teksten die gebruikt kunnen worden zijn: [DATE] , [TIME], [DATETIME], [USER] & [NUMBER].\nDeze worden ingevuld op het moment dat de handtekening ingevoegd word.</string> <string name="init_signature_template_button">Voeg template toe</string> @@ -456,12 +455,7 @@ <string name="auth_authorize">c:geo Autoriseren</string> <string name="auth_start">Start autorisatie</string> <string name="auth_again">Nogmaals starten</string> - <string name="auth_pin_hint">Door Twitter toegekende pin</string> <string name="auth_finish">Afronden</string> - <string name="auth_dialog_wait">Wachten op Twitterโฆ</string> - <string name="auth_dialog_pin_title">Pin code</string> - <string name="auth_dialog_pin_message">Voer de door de Twitter website verstrekte PIN code in. Deze is verplicht om de autorisatie af te ronden.</string> - <string name="auth_dialog_completed">c:geo Is nu geautoriseerd om naar Twitter te posten.</string> <!-- cache --> <plurals name="cache_counts"> @@ -1018,8 +1012,6 @@ <string name="twitter">Twitter: <a href="">@android_GC</a></string> <string name="nutshellmanual">Handleiding: <a href="">c:geo in een notendop</a></string> <string name="about_twitter">Moet <b>c:geo</b> elke cache vondst publiceren naar Twitter?</string> - <string name="about_auth_1">Het volgende proces staat <b>c:geo</b> toe om Twitter toegang te verkrijgen bij goedkeuring.</string> - <string name="about_auth_2">Klik op de \"autoriseer c:geo\" knop om het proces te starten. Dit proces zal een browser openen met een Twitter pagina. Login op deze pagina en sta <b>c:geo</b> toegang tot je account toe. Bij goedkeuring laat Twitter een numerieke PIN code zien. Deze PIN dien je te plakken en te bevestigen in <b>c:geo</b>.</string> <!-- status (used via string based resource loading) --> <string name="status_new_release" tools:ignore="UnusedResources">Nieuwe release beschikbaar.\nTik om te installeren.</string> diff --git a/main/res/values-pl/strings.xml b/main/res/values-pl/strings.xml index 9b1bc87..967098f 100644 --- a/main/res/values-pl/strings.xml +++ b/main/res/values-pl/strings.xml @@ -326,7 +326,6 @@ <!-- caches lists --> <string name="list_menu">Lista</string> <string name="list_menu_create">Utwรณrz nowฤ
listฤ</string> - <string name="list_menu_all_lists">Wszystkie skrzynki</string> <string name="list_menu_drop">Usuล aktualnฤ
listฤ</string> <string name="list_menu_change">Zmieล listฤ</string> <string name="list_menu_rename">Zmieล nazwฤ aktualnej listy</string> @@ -381,7 +380,7 @@ <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Aktywuj</string> <string name="init_oc_de_description">Autoryzuj c:geo z opencaching.de aby wyszukiwaฤ skrzynki i mieฤ dostฤp/filtrowaฤ znalezione skrzynki.</string> - <string name="init_register_oc_de">Autoryzuj c:geo</string> + <string name="settings_authorize">Autoryzuj c:geo</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Aktywuj</string> @@ -394,7 +393,6 @@ <string name="init_login_popup_failed">Logowanie nie powiodลo siฤ</string> <string name="init_login_popup_failed_reason">Logowanie nie powiodลo siฤ, poniewaลผ </string> <string name="init_login_popup_not_authorized">Brak autoryzacji</string> - <string name="init_twitter_authorize">Autoryzacja c:geo</string> <string name="init_signature">Podpis</string> <string name="init_signature_help_text">Wprowadลบ Twรณj podpis, ktรณry bฤdzie uลผywany przy wpisie do dziennika.\nWyraลผenia specjalne, ktรณre mogฤ
byฤ uลผyte to: [DATE] , [TIME], [DATETIME], [USER] & [NUMBER].\nBฤdฤ
one zastฤpowane w momencie wstawiania podpisu.</string> <string name="init_signature_template_button">Wstaw szablon</string> @@ -514,26 +512,11 @@ <string name="auth_authorize">Autoryzacja c:geo</string> <string name="auth_start">Rozpoczynam autoryzacjฤ</string> <string name="auth_again">Rozpoczynam ponownie autoryzacjฤ</string> - <string name="auth_pin_hint">PIN nadany przez Twitter</string> <string name="auth_finish">Gotowe</string> - <string name="auth_dialog_wait">Czekam na Twitterโฆ</string> - <string name="auth_dialog_pin_title">Kod PIN</string> - <string name="auth_dialog_pin_message">Proszฤ wpisaฤ kod PIN dostarczony przez stronฤ Twitter. To jest obowiฤ
zkowe do ukoลczenia autoryzacji.</string> - <string name="auth_dialog_completed">c:geo jest teraz upowaลผniony do postu na Twitter.</string> <!-- auth opencaching --> <string name="auth_ocde">opencaching.de</string> - <string name="auth_authorize_oc">Autoryzuj c:geo</string> - <string name="auth_start_oc">Rozpocznij autoryzacjฤ</string> - <string name="auth_again_oc">Sprรณbuj ponownie</string> - <string name="auth_pin_hint_oc">PIN przypisany przez %s</string> - <string name="auth_finish_oc">Zakoลcz</string> - <string name="auth_dialog_wait_oc">Czekam na %sโฆ</string> - <string name="auth_dialog_pin_title_oc">Kod PIN</string> - <string name="auth_dialog_pin_message_oc">Proszฤ wpisz kod PIN dostarczony przez stronฤ %s. Jest to konieczne by zakoลczyฤ autoryzacjฤ.</string> <string name="auth_dialog_completed_oc">c:geo zostaล zautoryzowany by komunikowaฤ siฤ z %s.</string> - <string name="about_auth_1_oc">Nastฤpujฤ
cy proces pozwoliล <b>c:geo</b> aby uzyskaฤ dostฤp do %s - jeลli wyraลผono zgodฤ.</string> - <string name="about_auth_2_oc">Klikniฤcie na przycisk \"autoryzuj c:geo\" rozpocznie proces. Zostanie otwarta przeglฤ
darka ze stronฤ
%s. Zaloguj siฤ i pozwรณl <b>c:geo</b> uzyskaฤ dostฤp do Twojego konta. Po zaakceptowaniu, %s pokaลผe kod numeryczny PIN. Ten kod PIN musi byฤ wklejony do <b>c:geo</b> i potwierdzony. To wszystko.</string> <!-- cache --> <plurals name="cache_counts"> @@ -1121,8 +1104,6 @@ <string name="nutshellmanual">Podrฤcznik: <a href="">c:geo skrรณcona instrukcja obsลugi</a></string> <string name="market">Android: <a href="">c:geo w Google Play</a></string> <string name="about_twitter">Czy chczesz aby <b>c:geo</b> publikowaล nowy status na Twitter za kaลผdym razem kiedy znajdziesz skrzynkฤ?</string> - <string name="about_auth_1">Poniลผszy proces pozwala <b>c:geo</b> uzyskaฤ dostฤp do Twitter za Twoim pozwoleniem.</string> - <string name="about_auth_2">Klikniฤcie na \"Autoryzacja c:geo\" spowoduje rozpoczฤcie procesu. Ten proces spowoduje otwarcie przeglฤ
darki internetowej na stronie Twitter. Zaloguj siฤ na tej stronie i pozwรณl <b>c:geo</b> uzyskaฤ dostฤp do Twojego konta. Jeลli zostanie zaakceptowany, Twitter wyลwietli kod numeryczny PIN. Kod PIN musi zostaฤ wklejony do <b>c:geo</b> i potwierdzony. To wszystko.</string> <!-- status (used via string based resource loading) --> <string name="status_new_release" tools:ignore="UnusedResources">Dostฤpna nowa wersja.\nKliknij aby zainstalowaฤ.</string> diff --git a/main/res/values-pt/strings.xml b/main/res/values-pt/strings.xml index acd15a3..d0fdd9e 100644 --- a/main/res/values-pt/strings.xml +++ b/main/res/values-pt/strings.xml @@ -293,13 +293,12 @@ <string name="caches_clear_offlinelogs_progress">A limpar registos offline</string> <string name="list_menu">Listas</string> <string name="list_menu_create">Criar nova lista</string> - <string name="list_menu_all_lists">caches todas</string> <string name="list_menu_drop">Apagar lista actual</string> <string name="list_menu_change">Mudar de lista</string> <string name="list_menu_rename">Mudar o nome da lista corrente.</string> <string name="list_title">Escolha uma lista</string> <string name="list_inbox">Arquivadas</string> - <string name="list_all_lists">caches todas</string> + <string name="list_all_lists">Todas as caches</string> <string name="list_dialog_create_title">Nova lista</string> <string name="list_dialog_create">Criar</string> <string name="list_dialog_cancel">Cancelar</string> @@ -346,13 +345,11 @@ <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Activar</string> <string name="init_oc_de_description">Autorizar c:geo com opencaching.de para pesquisar por caches e aceder/filtrar as suas caches encontradas.</string> - <string name="init_register_oc_de">Autorizar c:geo</string> - <string name="init_reregister_oc_de">Reautorizar c:geo</string> + <string name="settings_authorize">Autorizar c:geo</string> + <string name="settings_reauthorize">Reautorizar c:geo</string> <string name="init_oc_pl">Opencaching.pl</string> <string name="settings_activate_oc_pl">Activar</string> <string name="init_oc_pl_description">Autorizar c:geo com opencaching.pl para pesquisar por caches e aceder/filtrar as suas caches encontradas.</string> - <string name="init_register_oc_pl">Autorizar c:geo</string> - <string name="init_reregister_oc_pl">Reautorizar c:geo</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Activar</string> @@ -365,8 +362,6 @@ <string name="init_login_popup_failed">Login falhado.</string> <string name="init_login_popup_failed_reason">Login falhado porque </string> <string name="init_login_popup_not_authorized">Nรฃo autorizado</string> - <string name="init_twitter_authorize">Autorize o c:geo</string> - <string name="init_twitter_reauthorize">Reautorizar c:geo</string> <string name="init_signature">Assinatura</string> <string name="init_signature_help_text">Escreva a sua assinatura, para adicionar ao texto de registo na cache.\nPode usar algumas palavras-chave: [DATE] , [TIME], [USER] & [NUMBER].\nEstas serรฃo expandidas quando a assinatura for inserida.</string> <string name="init_signature_template_button">Inserir modelo</string> @@ -427,10 +422,12 @@ <string name="init_backup_last">Disponรญvel backup de</string> <string name="init_backup_last_no">Nรฃo existe nenhum ficheiro de backup.</string> <string name="settings_info_offline_maps_title">Informaรงรตes sobre Offline Maps</string> - <string name="settings_info_offline_maps">c: geo suporta mapas para uso offline. Pode baixar mapas de Mapsforge ou atรฉ mesmo criar seus prรณprios mapas a partir de dados OSM.</string> + <string name="settings_info_offline_maps">c:geo supports maps for offline use. You can download maps from Mapsforge or even create your own maps from OSM data. You need to select the offline map directory first to to get offline map support.</string> <string name="settings_info_themes_title">Informaรงรตes sobre Map Themes</string> <string name="settings_info_themes">c: geo suporta temas customizados para os mapas off-line. Estes podem ser usados โโpara alterar o estilo de cores do mapa (por exemplo, ter um mapa para visรฃo nocturna) ou para realรงar certos objetos, como ciclovias ou linhas de altura dentro do mapa.</string> <string name="init_mapsource_select">Seleccione a fonte de mapa</string> + <string name="settings_title_scale_map_text">Scale Map Text</string> + <string name="settings_summary_scale_map_text">Scale text labels on offline map according to device dpi</string> <string name="init_map_directory_description">Directรณrio com os mapas offline</string> <string name="init_gpx_exportdir">Directรณrio para exportar GPX</string> <string name="init_gpx_importdir">Directรณrio para importar GPX</string> @@ -463,6 +460,9 @@ <string name="init_use_native_ua">Identificar como se fosse o browser do Android. Resolve os problemas de login em alguns provedores de rede.</string> <string name="init_summary_use_native_ua">Identificar como se fosse o browser do Android. Resolve os problemas de login em alguns provedores de rede.</string> <string name="init_rendertheme_folder">Directรณrio de Temas de Mapas</string> + <string name="settings_open_website">Abrir o website</string> + <string name="settings_settings">Definiรงรตes</string> + <string name="settings_information">Informaรงรตes</string> <string name="map_source_google_map">Google: Mapa</string> <string name="map_source_google_satellite">Google: Satรฉlite</string> <string name="map_source_osm_mapnik">OSM: Mapnik</string> @@ -482,27 +482,14 @@ <string name="auth_authorize">Autorizar c:geo</string> <string name="auth_start">Iniciar autorizaรงรฃo</string> <string name="auth_again">Iniciar de novo</string> - <string name="auth_pin_hint">PIN atribuรญdo pelo Twitter</string> <string name="auth_finish">Fim</string> - <string name="auth_dialog_wait">A esperar pelo Twitterโฆ</string> - <string name="auth_dialog_pin_title">Cรณdigo PIN</string> - <string name="auth_dialog_pin_message">Por favor insira o cรณdigo PIN fornecido pelo site do Twitter. ร imperativo para que se complete a autorizaรงรฃo.</string> - <string name="auth_dialog_completed">O c:geo estรก agora autorizado a publicar no Twitter.</string> - <string name="about_auth_1">O processo seguinte permite <b>c:geo</b> aceder ao Twitter - se concordar.</string> - <string name="about_auth_2">Um clique sobre o botรฃo \"autorizar c:geo \" irรก iniciar o processo. Este processo irรก abrir um navegador com uma pรกgina no Twitter. Entre nesta pรกgina e permita o <b>c:geo</b> aceder ร sua conta. Se isso for aceite, o Twitter vai mostrar um cรณdigo PIN numรฉrico. Este PIN deve ser colado em <b>c:geo</b> e confirmado. ร tudo.</string> + <string name="auth_dialog_waiting">Esperando por %sโฆ</string> + <string name="auth_explain_short">O processo a seguir permitirรก que <b>c:geo</b> acesse o %s.</string> + <string name="auth_explain_long">Pressing the \"authorize c:geo\" button will start the process. This process will open up a web browser with a %s page. Log in on this page and allow <b>c:geo</b> to access your account. That\'s all.</string> + <string name="auth_dialog_completed_twitter">O c:geo estรก agora autorizado a publicar no Twitter.</string> <string name="auth_ocde">opencaching.de</string> <string name="auth_ocpl">Opencaching.pl</string> - <string name="auth_authorize_oc">Autorizar c:geo</string> - <string name="auth_start_oc">Comeรงar autorizaรงรฃo</string> - <string name="auth_again_oc">Iniciar de novo</string> - <string name="auth_pin_hint_oc">PIN atribuรญdo por %s</string> - <string name="auth_finish_oc">Fim</string> - <string name="auth_dialog_wait_oc">A esperar pot %sโฆ</string> - <string name="auth_dialog_pin_title_oc">Cรณdigo PIN</string> - <string name="auth_dialog_pin_message_oc">Por favor insira o cรณdigo PIN fornecido pelo site %s. ร imperativo para que se complete a autorizaรงรฃo.</string> <string name="auth_dialog_completed_oc">c:geo estรก agora autorizado a interagir com %s.</string> - <string name="about_auth_1_oc">O processo seguinte permite <b>c:geo</b> aceder ao Twitter - se concordar.</string> - <string name="about_auth_2_oc">Um clique sobre o botรฃo \"autorizar c:geo \" irรก iniciar o processo. Este processo irรก abrir um navegador com uma pรกgina em %s. Entre nesta pรกgina e permita o <b>c:geo</b> aceder ร sua conta. Se isso for aceite, %s vai mostrar um cรณdigo PIN numรฉrico. Este PIN deve ser colado em <b>c:geo</b> e confirmado. ร tudo.</string> <string name="cache_offline">Arquivo</string> <string name="cache_offline_refresh">Actualizar</string> <string name="cache_offline_drop">Apagar</string> @@ -798,6 +785,7 @@ <string name="destination_set">Definir destino</string> <string name="navigation_direct_navigation">Navegaรงรฃo directa</string> <string name="navigation_target">Destino</string> + <string name="err_nav_no_coordinates">Nรฃo pode iniciar a navegaรงรฃo sem coordenadas</string> <string name="license">Licenรงa</string> <string name="license_show">Mostrar licenรงa</string> <string name="license_dismiss">Dispensar</string> @@ -1029,7 +1017,7 @@ <string name="twitter">Twitter: <a href="">@android_GC</a></string> <string name="nutshellmanual">Manual: <a href="">o essencial do c:geo</a></string> <string name="market">Android: <a href="">c:geo no Google Play</a></string> - <string name="about_twitter">O <b>c:geo</b> deve publicar no Twitter de cada vez que uma cache for registada?</string> + <string name="about_twitter">O <b>c:geo</b> deve publicar no Twitter de cada vez que uma cache foi registrada?</string> <string name="faq">FAQ: <a href="">faq.cgeo.org</a></string> <string name="status_new_release" tools:ignore="UnusedResources">Nova versรฃo disponรญvel.\nClique para instalar.</string> <string name="status_new_nightly" tools:ignore="UnusedResources">Nova \'nightly build\' disponรญvel.\nClique para instalar.</string> diff --git a/main/res/values-sk/strings.xml b/main/res/values-sk/strings.xml index de25c00..948ebf7 100644 --- a/main/res/values-sk/strings.xml +++ b/main/res/values-sk/strings.xml @@ -298,7 +298,6 @@ <!-- caches lists --> <string name="list_menu">Zoznam</string> <string name="list_menu_create">Vytvoriลฅ novรฝ zoznam</string> - <string name="list_menu_all_lists">Vลกetky skrรฝลกe</string> <string name="list_menu_drop">Zahodiลฅ aktuรกlny zoznam</string> <string name="list_menu_change">Zmeniลฅ zoznam</string> <string name="list_menu_rename">Premenovaลฅย tento zoznam</string> @@ -336,7 +335,7 @@ <string name="init_login_popup_ok">Prihlรกsenie รบspeลกnรฉ</string> <string name="init_login_popup_failed">Prihlรกsenie neรบspeลกnรฉ</string> <string name="init_login_popup_failed_reason">Prihlรกsenie neรบspeลกnรฉ: </string> - <string name="init_twitter_authorize">Autorizovaลฅ c:geo</string> + <string name="settings_authorize">Autorizovaลฅ c:geo</string> <string name="init_signature">Podpis</string> <string name="init_signature_help_text">Zapรญลกte vรกลก podpis, ktorรฝ chcete pouลพiลฅ v texte zรกznamov.\nMรดลพete pouลพiลฅ ลกpeciรกlne slovรก: [DATE] , [TIME], [DATETIME], [USER] a [NUMBER].\nTieto budรบ nahradenรฉ pri vloลพenรญ podpisu.</string> <string name="init_signature_template_button">Vloลพiลฅ ลกablรณnu</string> @@ -446,12 +445,7 @@ <string name="auth_authorize">autorizovaลฅ c:geo</string> <string name="auth_start">Zahรกjiลฅ autorizรกciu</string> <string name="auth_again">Znovu autorizovaลฅ</string> - <string name="auth_pin_hint">PIN pridelenรฝ Twitterom</string> <string name="auth_finish">Dokonฤiลฅ</string> - <string name="auth_dialog_wait">ฤakanie na Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN kรณd</string> - <string name="auth_dialog_pin_message">Prosรญm, napรญลกte PIN kรณd, ktorรฝ vรกm zobrazil Twitter. Je to potrebnรฉ pre dokonฤenie autorizรกcie.</string> - <string name="auth_dialog_completed">c:geo teraz mรดลพe posielaลฅ sprรกvy na vรกลก Twitter.</string> <!-- cache --> <plurals name="cache_counts"> @@ -937,8 +931,6 @@ <string name="twitter">Twitter: <a href="">@android_GC</a></string> <string name="nutshellmanual">Manuรกl: <a href="">c:geo v kocke</a></string> <string name="about_twitter">Chcete, aby <b>c:geo</b> napรญsalo na vรกลก Twitter vลพdy keฤ zapรญลกete nรกjdenie skrรฝลกe?</string> - <string name="about_auth_1">Pomocou nasledujรบceho procesu mรดลพete aplikรกcii <b>c:geo</b> umoลพniลฅ odosielanie prรญspevkov na vรกลก Twitter. </string> - <string name="about_auth_2">ลคuknutรญm na tlaฤidlo โZahรกjiลฅ autorizรกciuโ celรฝ proces zaฤne. Tento proces otvorรญ webovรบ strรกnku Twitteru, kde sa sa prihlรกsite a tlaฤidlom โAuthorize appโ umoลพnรญte aplikรกcii <b>c:geo</b> prรญstup k vรกลกmu Twitter รบฤtu. Potom ฤo ลฅuknete na โAuthorize appโ, Twitter vรกm pridelรญ PIN kรณd. Tento kรณd skopรญrujte a vloลพte do aplikรกcie <b>c:geo</b>. A potvrฤte. To je vลกetko.</string> <!-- status --> <string name="status_new_release" tools:ignore="UnusedResources">Je dostupnรฉ novรฉ vydanie.\nKliknite pre inลกtalรกciu.</string> diff --git a/main/res/values-sl/strings.xml b/main/res/values-sl/strings.xml index 11bf1a0..c42be97 100644 --- a/main/res/values-sl/strings.xml +++ b/main/res/values-sl/strings.xml @@ -335,7 +335,6 @@ <!-- caches lists --> <string name="list_menu">Seznam</string> <string name="list_menu_create">Ustvari nov seznam</string> - <string name="list_menu_all_lists">Vsi zakladi</string> <string name="list_menu_drop">Izbriลกi trenutni seznam</string> <string name="list_menu_change">Spremeni seznam</string> <string name="list_menu_rename">Preimenuj trenutni seznam</string> @@ -395,13 +394,11 @@ <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Aktiviraj</string> <string name="init_oc_de_description">Poveลพi c:geo z opencaching.de za iskanje zakladov in dostop in filter najdenih zakladov.</string> - <string name="init_register_oc_de">Poveลพi c:geo z opencaching.de</string> - <string name="init_reregister_oc_de">Ponovno poveลพi c:geo</string> + <string name="settings_authorize">Poveลพi c:geo</string> + <string name="settings_reauthorize">Ponovno poveลพi c:geo</string> <string name="init_oc_pl">Opencaching.pl</string> <string name="settings_activate_oc_pl">Aktiviraj</string> <string name="init_oc_pl_description">Poveลพi c:geo z opencaching.pl za iskanje zakladov in dostop in filter najdenih zakladov.</string> - <string name="init_register_oc_pl">Poveลพi c:geo z opencaching.pl</string> - <string name="init_reregister_oc_pl">Ponovno poveลพi c:geo</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Aktiviraj</string> @@ -414,8 +411,6 @@ <string name="init_login_popup_failed">Prijava neuspeลกna</string> <string name="init_login_popup_failed_reason">Prijava neuspeลกna:</string> <string name="init_login_popup_not_authorized">Ni avtoriziran</string> - <string name="init_twitter_authorize">Poveลพi c:geo s Twitterjem</string> - <string name="init_twitter_reauthorize">Ponovno poveลพi c:geo s Twitterjem</string> <string name="init_signature">Podpis</string> <string name="init_signature_help_text">Vnesite podpis, ki bo uporabljen b baลกih zapisih obiskov.\nPosebni nizi, ki jih lahko uporabite so: [DATE] - datum, [TIME] - ura, [DATETIME] - datum in ura, [USER] - uporabniลกko ime in [NUMBER] - ลกtevilo najdb.\nTi nizi bodo zamenjani s pravimi podatki ob vpisu.</string> <string name="init_signature_template_button">Vnesi predlogo</string> @@ -535,29 +530,12 @@ <string name="auth_authorize">Poveลพi c:geo s Twitterjem</string> <string name="auth_start">Zaฤni z avtorizacijo</string> <string name="auth_again">Ponovno zaฤni</string> - <string name="auth_pin_hint">PIN, ki ga dodeli Twitter</string> <string name="auth_finish">Konฤaj</string> - <string name="auth_dialog_wait">ฤakam na Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN koda</string> - <string name="auth_dialog_pin_message">Vnesite PIN kodo, ki ste jo dobili na spletni strani Twitterja.</string> - <string name="auth_dialog_completed">c:geo je sedaj povezan s Twitterjem za objavo sporoฤil.</string> - <string name="about_auth_1">Sledeฤi postopek omogoฤa <b>c:geotu</b> povezavo s Twitterjem.</string> - <string name="about_auth_2">Klik na gumb \"Poveลพi c:geo\" bo zaฤel s postopkom avtorizacije. Med postopkom se bo odprl brskalnik s Twitterjem. V brskalniku se prijavite v Twitter in dovolite aplikaciji <b>c:geo</b> da dostopa do vaลกega raฤuna. Ko to potrdite, vam bo Twitter izpisal PIN kodo. To kodo prepiลกite v <b>c:geo</b> in potrdite.</string> <!-- auth opencaching --> <string name="auth_ocde">opencaching.de</string> <string name="auth_ocpl">opencaching.pl</string> - <string name="auth_authorize_oc">Poveลพi c:geo</string> - <string name="auth_start_oc">Zaฤni z avtorizacijo</string> - <string name="auth_again_oc">Ponovno zaฤni</string> - <string name="auth_pin_hint_oc">PIN, ki ga dodeli %s</string> - <string name="auth_finish_oc">Konฤaj</string> - <string name="auth_dialog_wait_oc">ฤakam na %sโฆ</string> - <string name="auth_dialog_pin_title_oc">PIN koda</string> - <string name="auth_dialog_pin_message_oc">Vnesite PIN kodo, ki ste jo dobili na spletni strani %s.</string> <string name="auth_dialog_completed_oc">c:geo je sedaj povezan z %s.</string> - <string name="about_auth_1_oc">Sledeฤi postopek omogoฤa <b>c:geotu</b> povezavo z %s.</string> - <string name="about_auth_2_oc">Klik na gumb \"Poveลพi c:geo\" bo zaฤel s postopkom avtorizacije. Med postopkom se bo odprl brskalnik s stranjo %s. V brskalniku se prijavite na to stran in dovolite aplikaciji <b>c:geo</b> da dostopa do vaลกega raฤuna. Ko to potrdite, vam bo %s izpisal PIN kodo. To kodo prepiลกite v <b>c:geo</b> in potrdite.</string> <!-- cache --> <plurals name="cache_counts"> @@ -1171,4 +1149,4 @@ <item quantity="other">Pred %d dnevi</item> </plurals> -</resources>
\ No newline at end of file +</resources> diff --git a/main/res/values-sv/strings.xml b/main/res/values-sv/strings.xml index 6abc9a1..a232c06 100644 --- a/main/res/values-sv/strings.xml +++ b/main/res/values-sv/strings.xml @@ -333,7 +333,6 @@ <!-- caches lists --> <string name="list_menu">Listor</string> <string name="list_menu_create">Skapa en ny lista</string> - <string name="list_menu_all_lists">Alla cacher</string> <string name="list_menu_drop">Ta bort den hรคr listan</string> <string name="list_menu_change">Byt lista</string> <string name="list_menu_rename">Byt namn pรฅ den hรคr listan</string> @@ -393,13 +392,11 @@ <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Aktivera</string> <string name="init_oc_de_description">Anvรคnd c:geo med opencaching.de fรถr att sรถka efter cacher samt fรถr att filtrera dina funna cacher.</string> - <string name="init_register_oc_de">Konfigurera inloggning</string> - <string name="init_reregister_oc_de">Konfigurera inloggning igen</string> + <string name="settings_authorize">Konfigurera inloggning</string> + <string name="settings_reauthorize">Konfigurera inloggning igen</string> <string name="init_oc_pl">Opencaching.pl</string> <string name="settings_activate_oc_pl">Aktivera</string> <string name="init_oc_pl_description">Anvรคnd c:geo med opencaching.pl fรถr att sรถka efter cacher samt fรถr att filtrera dina funna cacher.</string> - <string name="init_register_oc_pl">Konfigurera inloggning</string> - <string name="init_reregister_oc_pl">Konfigurera inloggning igen</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Aktivera</string> @@ -412,8 +409,6 @@ <string name="init_login_popup_failed">Inloggning misslyckades</string> <string name="init_login_popup_failed_reason">Inloggning misslyckades:</string> <string name="init_login_popup_not_authorized">Ej godkรคnd</string> - <string name="init_twitter_authorize">Instรคllningar fรถr Twitter</string> - <string name="init_twitter_reauthorize">รndra instรคllningar fรถr Twitter</string> <string name="init_signature">Signatur</string> <string name="init_signature_help_text">Skriv den signatur som du vill anvรคnda i dina loggtexter.\nDet finns nรฅgra speciella texter som kan anvรคndas och som expanderas nรคr signaturen lรคggs in: [DATE] , [TIME], [USER] & [NUMBER].</string> <string name="init_signature_template_button">Infoga makro</string> @@ -510,6 +505,9 @@ <string name="init_use_native_ua">Identifiering</string> <string name="init_summary_use_native_ua">Identifiera som en Android webblรคsare. Lรถser problem med inloggning vid uppkoppling via vissa operatรถrer.</string> <string name="init_rendertheme_folder">Katalog fรถr kartteman</string> + <string name="settings_open_website">รppna hemsida</string> + <string name="settings_settings">Instรคllningar</string> + <string name="settings_information">Information</string> <!-- map sources --> <string name="map_source_google_map">Google: Map</string> @@ -533,29 +531,12 @@ <string name="auth_authorize">Koppla c:geo mot Twitter</string> <string name="auth_start">Pรฅbรถrja koppling mot Twitter</string> <string name="auth_again">Koppla mot Twitter igen</string> - <string name="auth_pin_hint">PIN erhรฅllen frรฅn Twitter</string> <string name="auth_finish">Bekrรคfta PIN</string> - <string name="auth_dialog_wait">Vรคntar pรฅ Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN kod</string> - <string name="auth_dialog_pin_message">Vรคnligen skriv in PIN koden du fick pรฅ Twitters hemsida. Den krรคvs fรถr att slutfรถra kopplingen.</string> - <string name="auth_dialog_completed">c:geo รคr nu godkรคnd att posta pรฅ Twitter.</string> - <string name="about_auth_1">Nedan tillรฅter du <b>c:geo</b> att ansluta till Twitter.</string> - <string name="about_auth_2">Klicka pรฅ \"Pรฅbรถrja koppling mot Twitter\" om du vill koppla ihop <b>c:geo</b> med Twitter. Twitters hemsida kommer att รถppnas i en webblรคsare. Logga in pรฅ den sidan och tillรฅt <b>c:geo</b> att ansluta till ditt konto. Nรคr du godkรคnt sรฅ kommer Twitter att visa en PIN kod. Kom ihรฅg denna PIN kod, stรคng webblรคsaren och skriv in PIN koden i <b>c:geo</b> och bekrรคfta.</string> <!-- auth opencaching --> <string name="auth_ocde">opencaching.de</string> <string name="auth_ocpl">opencaching.pl</string> - <string name="auth_authorize_oc">Tillรฅt c:geo</string> - <string name="auth_start_oc">Starta godkรคnnande</string> - <string name="auth_again_oc">Starta igen</string> - <string name="auth_pin_hint_oc">PIN erhรฅllen frรฅn %s</string> - <string name="auth_finish_oc">Slutfรถr</string> - <string name="auth_dialog_wait_oc">Vรคntar pรฅ %sโฆ</string> - <string name="auth_dialog_pin_title_oc">PIN kod</string> - <string name="auth_dialog_pin_message_oc">Vรคnlig ange PIN koden som du fรฅtt frรฅn %s. Den krรคvs fรถr att slutfรถra godkรคnnandet.</string> <string name="auth_dialog_completed_oc">c:geo รคr nu godkรคnd fรถr att kommunicera med %s.</string> - <string name="about_auth_1_oc">Nedan tillรฅter du <b>c:geo</b> att kommunicera med %s.</string> - <string name="about_auth_2_oc">Klicka pรฅ \"Tillรฅt c:geo\" nedan fรถr att koppla ihop <b>c:geo</b> med %s. Logga in pรฅ den sida som kommer att รถppnas i din webblรคsare. Tillรฅt sedan <b>c:geo</b> att komma รฅt till konto. Efter detta kommer %s att visa en numerisk PIN kod. Denna PIN kod mรฅste sedan anges i <b>c:geo</b> och godkรคnnas.</string> <!-- cache --> <plurals name="cache_counts"> @@ -991,4 +972,4 @@ <item quantity="other">%d dagar sedan</item> </plurals> -</resources>
\ No newline at end of file +</resources> diff --git a/main/res/values/changelog_master.xml b/main/res/values/changelog_master.xml index 09ed0f5..c01be4a 100644 --- a/main/res/values/changelog_master.xml +++ b/main/res/values/changelog_master.xml @@ -1,5 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <!-- changelog for the master branch --> - <string name="changelog_master" translatable="false"></string> + <string name="changelog_master" translatable="false"> + <b>Next feature release</b>\n + <b>New Features:</b>\n + ยท Popup on map shows date of event caches\n + ยท \n + \n + <b>Bugfixes:</b>\n + ยท \n + </string> </resources> diff --git a/main/res/values/preference_keys.xml b/main/res/values/preference_keys.xml index e82c9d6..38012f5 100644 --- a/main/res/values/preference_keys.xml +++ b/main/res/values/preference_keys.xml @@ -38,6 +38,7 @@ <string name="pref_choose_list">choose_list</string> <string name="pref_mapsource">mapsource</string> <string name="pref_mapDirectory">mapDirectory</string> + <string name="pref_mapsforge_scale_text">mapsforgeScaleText</string> <string name="pref_renderthemepath">renderthemepath</string> <string name="pref_showwaypointsthreshold">waypointsthreshold</string> <string name="pref_maptrail">maptrail</string> @@ -112,4 +113,9 @@ <string name="pref_ocpl_tokenpublic">ocpl_tokenpublic</string> <string name="pref_temp_ocpl_token_secret">ocpl-temp-token-secret</string> <string name="pref_temp_ocpl_token_public">ocpl-temp-token-public</string> + <string name="pref_fakekey_gc_website">fakekey_gc_website</string> + <string name="pref_fakekey_ocde_website">fakekey_ocde_website</string> + <string name="pref_fakekey_ocpl_website">fakekey_ocpl_website</string> + <string name="pref_fakekey_gcvote_website">fakekey_gcvote_website</string> + <string name="pref_fakekey_sendtocgeo_website">fakekey_sendtocgeo_website</string> </resources> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 554ab0e..39b61d3 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -333,7 +333,6 @@ <!-- caches lists --> <string name="list_menu">List</string> <string name="list_menu_create">Create new list</string> - <string name="list_menu_all_lists">All caches</string> <string name="list_menu_drop">Drop current list</string> <string name="list_menu_change">Change list</string> <string name="list_menu_rename">Rename current list</string> @@ -390,16 +389,14 @@ <string name="settings_gc_legal_note">With using the service of geocaching.com, you accept the Groundspeak Terms of Use.</string> <string name="settings_info_facebook_login_title">Facebook Login</string> <string name="settings_info_facebook_login">You can\'t make c:geo login to geocaching.com with your Facebook account. But there is a simple workaround โฆ</string> + <string name="settings_authorize">Authorize c:geo</string> + <string name="settings_reauthorize">Authorize c:geo again</string> <string name="init_oc">Opencaching.de</string> <string name="settings_activate_oc">Activate</string> <string name="init_oc_de_description">Authorize c:geo with opencaching.de to search for caches and access/filter your found caches.</string> - <string name="init_register_oc_de">Authorize c:geo</string> - <string name="init_reregister_oc_de">Authorize c:geo again</string> <string name="init_oc_pl">Opencaching.pl</string> <string name="settings_activate_oc_pl">Activate</string> <string name="init_oc_pl_description">Authorize c:geo with opencaching.pl to search for caches and access/filter your found caches.</string> - <string name="init_register_oc_pl">Authorize c:geo</string> - <string name="init_reregister_oc_pl">Authorize c:geo again</string> <string name="init_gcvote">GCvote.com</string> <string name="init_twitter">Twitter</string> <string name="settings_activate_twitter">Activate</string> @@ -412,8 +409,6 @@ <string name="init_login_popup_failed">Login failed</string> <string name="init_login_popup_failed_reason">Login failed:</string> <string name="init_login_popup_not_authorized">Not authorized</string> - <string name="init_twitter_authorize">Authorize c:geo</string> - <string name="init_twitter_reauthorize">Authorize c:geo again</string> <string name="init_signature">Signature</string> <string name="init_signature_help_text">Enter a signature to be appended to your logs.\nSpecial strings that can be used are: [DATE] , [TIME], [DATETIME], [USER] & [NUMBER].\nThese will be expanded when the signature is inserted.</string> <string name="init_signature_template_button">Insert Template</string> @@ -478,6 +473,8 @@ <string name="settings_info_themes_title">Info on Map Themes</string> <string name="settings_info_themes">c:geo supports custom themes for offline maps. These can be used to change the color style of the map (e.g. to have a nightview map) or to highlight certain objects like cycle paths or height lines within the map.</string> <string name="init_mapsource_select">Select Map Source</string> + <string name="settings_title_scale_map_text">Scale Map Text</string> + <string name="settings_summary_scale_map_text">Scale text labels on offline map according to device dpi</string> <string name="init_map_directory_description">Directory with offline maps</string> <string name="init_gpx_exportdir">GPX Export Directory</string> <string name="init_gpx_importdir">GPX Import Directory</string> @@ -510,7 +507,10 @@ <string name="init_use_native_ua">Android browser</string> <string name="init_summary_use_native_ua">Identify as Android browser. Solves login problems when using certain network providers.</string> <string name="init_rendertheme_folder">Map Themes Directory</string> - + <string name="settings_open_website">Open website</string> + <string name="settings_settings">Settings</string> + <string name="settings_information">Information</string> + <!-- map sources --> <string name="map_source_google_map">Google: Map</string> <string name="map_source_google_satellite">Google: Satellite</string> @@ -528,34 +528,23 @@ <string name="sendToCgeo_download_fail">c:geo failed to download caches. No internet connection, or send2c:geo is down.</string> <string name="sendToCgeo_no_registration">c:geo failed to download caches. Registration for send2c:geo expired. Please register in settings.</string> - <!-- auth twitter --> + <!-- auth generic --> <string name="auth_twitter">Twitter</string> <string name="auth_authorize">Authorize c:geo</string> <string name="auth_start">Start authorization</string> <string name="auth_again">Start again</string> - <string name="auth_pin_hint">PIN assigned by Twitter</string> <string name="auth_finish">Finish</string> - <string name="auth_dialog_wait">Waiting for Twitterโฆ</string> - <string name="auth_dialog_pin_title">PIN code</string> - <string name="auth_dialog_pin_message">Please type in the PIN code provided by Twitter. It is required to complete authorization.</string> - <string name="auth_dialog_completed">c:geo is now authorized to post on Twitter.</string> - <string name="about_auth_1">The following process will allow <b>c:geo</b> to access Twitter.</string> - <string name="about_auth_2">Pressing the \"authorize c:geo\" button will start the process. This process will open up a web browser with a Twitter page. Log in on this page and allow <b>c:geo</b> to access your account. After this, Twitter will show up a numeric PIN code. This PIN must be pasted into <b>c:geo</b> and confirmed. That\'s all.</string> + <string name="auth_dialog_waiting">Waiting for %sโฆ</string> + <string name="auth_explain_short">The following process will allow <b>c:geo</b> to access %s.</string> + <string name="auth_explain_long">Pressing the \"authorize c:geo\" button will start the process. This process will open up a web browser with a %s page. Log in on this page and allow <b>c:geo</b> to access your account. That\'s all.</string> + + <!-- auth Twitter --> + <string name="auth_dialog_completed_twitter">c:geo is now authorized to post on Twitter.</string> <!-- auth opencaching --> <string name="auth_ocde">opencaching.de</string> <string name="auth_ocpl">opencaching.pl</string> - <string name="auth_authorize_oc">Authorize c:geo</string> - <string name="auth_start_oc">Start authorization</string> - <string name="auth_again_oc">Start again</string> - <string name="auth_pin_hint_oc">PIN assigned by %s</string> - <string name="auth_finish_oc">Finish</string> - <string name="auth_dialog_wait_oc">Waiting for %sโฆ</string> - <string name="auth_dialog_pin_title_oc">PIN code</string> - <string name="auth_dialog_pin_message_oc">Please type in PIN code provided by the %s website. It is required to complete authorization.</string> <string name="auth_dialog_completed_oc">c:geo is now authorized to interact with %s.</string> - <string name="about_auth_1_oc">The following process allows <b>c:geo</b> to access %s.</string> - <string name="about_auth_2_oc">Pressing the \"authorize c:geo\" button will start the process. This process will open up a web browser with a %s page. Log in on this page and allow <b>c:geo</b> to access your account. After this, %s will show up a numeric PIN code. This PIN must be pasted into <b>c:geo</b> and confirmed. That\'s all.</string> <!-- cache --> <plurals name="cache_counts"> @@ -894,6 +883,7 @@ <string name="destination_set">Set destination</string> <string name="navigation_direct_navigation">Direct Navigation</string> <string name="navigation_target">Target</string> + <string name="err_nav_no_coordinates">Cannot start navigation with no coordinates</string> <!-- license --> <string name="license">License</string> diff --git a/main/res/xml/preferences.xml b/main/res/xml/preferences.xml index 7ea3b59..6001783 100644 --- a/main/res/xml/preferences.xml +++ b/main/res/xml/preferences.xml @@ -1,564 +1,531 @@ <?xml version="1.0" encoding="UTF-8"?> -<PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android" +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cgeo="http://schemas.android.com/apk/res/cgeo.geocaching" android:key="@string/pref_fakekey_main_screen" > <PreferenceScreen - android:title="@string/settings_title_services" android:icon="?attr/settings_cloud" - android:key="@string/pref_fakekey_services_screen" > - - <PreferenceCategory - android:title="@string/settings_category_geocaching" > - - <PreferenceScreen - android:title="@string/settings_title_gc" > - - <cgeo.geocaching.settings.CheckBoxWithPopupPreference - android:key="@string/pref_connectorGCActive" - android:title="@string/settings_activate_gc" - cgeo:title="@string/settings_title_gc" - cgeo:text="@string/settings_gc_legal_note" - cgeo:url="@string/settings_gc_legal_note_url" - cgeo:urlButton="@string/settings_goto_url_button" - android:defaultValue="true" /> - <EditTextPreference - android:key="@string/pref_username" - android:title="@string/init_username" - android:dialogTitle="@string/init_username" - android:hint="@string/init_username" - android:dependency="@string/pref_connectorGCActive" - android:singleLine="true" - android:imeOptions="actionDone" /> - <cgeo.geocaching.settings.EditPasswordPreference - android:key="@string/pref_password" - android:title="@string/init_password" - android:dialogTitle="@string/init_password" - android:hint="@string/init_password" - android:inputType="textPassword" - android:dependency="@string/pref_connectorGCActive" - android:singleLine="true" - android:imeOptions="actionDone" /> - <cgeo.geocaching.settings.CheckGcCredentialsPreference - android:title="@string/init_login" - android:dependency="@string/pref_connectorGCActive" /> - <PreferenceScreen - android:title="@string/settings_title_basicmembers" - android:key="@string/pref_fakekey_basicmembers_screen" - android:dependency="@string/pref_connectorGCActive" > - <CheckBoxPreference - android:key="@string/pref_showcaptcha" - android:title="@string/init_captcha" - android:summary="@string/init_summary_captcha" - android:defaultValue="false" /> - <CheckBoxPreference - android:key="@string/pref_loaddirectionimg" - android:title="@string/init_loaddirectionimg" - android:summary="@string/init_summary_loaddirectionimg" - android:defaultValue="true" /> - </PreferenceScreen> - <cgeo.geocaching.settings.InfoPreference - android:title="@string/settings_info_facebook_login_title" - android:text="@string/settings_info_facebook_login" - cgeo:url="@string/settings_facebook_login_url" - cgeo:urlButton="@string/settings_goto_url_button" /> - - </PreferenceScreen> - - <PreferenceScreen - android:title="@string/init_oc" > - - <CheckBoxPreference - android:key="@string/pref_connectorOCActive" - android:title="@string/settings_activate_oc" - android:defaultValue="false" /> - <cgeo.geocaching.settings.TextPreference - android:layout="@layout/text_preference" - android:text="@string/init_oc_de_description" - android:dependency="@string/pref_connectorOCActive" /> - <cgeo.geocaching.settings.AuthorizeOcPreference - android:key="@string/pref_fakekey_ocde_authorization" - android:dependency="@string/pref_connectorOCActive" /> - - </PreferenceScreen> - - <PreferenceScreen - android:title="@string/init_oc_pl" > - - <CheckBoxPreference - android:key="@string/pref_connectorOCPLActive" - android:title="@string/settings_activate_oc_pl" - android:defaultValue="false" /> - <cgeo.geocaching.settings.TextPreference - android:layout="@layout/text_preference" - android:text="@string/init_oc_pl_description" - android:dependency="@string/pref_connectorOCPLActive" /> - <cgeo.geocaching.settings.AuthorizeOcPreference - android:key="@string/pref_fakekey_ocpl_authorization" - android:dependency="@string/pref_connectorOCPLActive" /> - - </PreferenceScreen> - - <PreferenceScreen - android:title="@string/init_gcvote" > - - <cgeo.geocaching.settings.EditPasswordPreference - android:key="@string/pref_pass_vote" - android:title="@string/init_password" - android:dialogTitle="@string/init_password" - android:hint="@string/init_password" - android:inputType="textPassword" - android:singleLine="true" - android:imeOptions="actionDone" /> - - </PreferenceScreen> - - <PreferenceScreen - android:title="@string/init_sendToCgeo" > - - <cgeo.geocaching.settings.InfoPreference - android:title="@string/settings_info_send2cgeo_title" - android:text="@string/init_sendToCgeo_description" - cgeo:url="@string/settings_send2cgeo_url" - cgeo:urlButton="@string/settings_goto_url_button" /> - <EditTextPreference - android:key="@string/pref_webDeviceName" - android:title="@string/init_sendToCgeo_name" - android:dialogTitle="@string/init_sendToCgeo_name" - android:singleLine="true" - android:imeOptions="actionDone" /> - <cgeo.geocaching.settings.RegisterSend2CgeoPreference - android:title="@string/init_sendToCgeo_register" /> - - </PreferenceScreen> - </PreferenceCategory> - - <PreferenceCategory - android:title="@string/settings_category_social" > - <PreferenceScreen - android:title="@string/init_twitter" > - - <CheckBoxPreference - android:key="@string/pref_twitter" - android:title="@string/settings_activate_twitter" - android:defaultValue="false" /> - <cgeo.geocaching.settings.TextPreference - android:layout="@layout/text_preference" - android:text="@string/about_twitter" - android:dependency="@string/pref_twitter" /> - <cgeo.geocaching.settings.AuthorizeTwitterPreference - android:key="@string/pref_fakekey_twitter_authorization" - android:dependency="@string/pref_twitter" /> - - </PreferenceScreen> + android:key="@string/pref_fakekey_services_screen" + android:title="@string/settings_title_services" > + <PreferenceCategory android:title="@string/settings_category_geocaching" > + <PreferenceScreen android:title="@string/settings_title_gc" > + <PreferenceCategory android:title="@string/settings_settings" > + <cgeo.geocaching.settings.CheckBoxWithPopupPreference + android:defaultValue="true" + android:key="@string/pref_connectorGCActive" + android:title="@string/settings_activate_gc" + cgeo:text="@string/settings_gc_legal_note" + cgeo:title="@string/settings_title_gc" + cgeo:url="@string/settings_gc_legal_note_url" + cgeo:urlButton="@string/settings_goto_url_button" /> + + <EditTextPreference + android:dependency="@string/pref_connectorGCActive" + android:dialogTitle="@string/init_username" + android:hint="@string/init_username" + android:imeOptions="actionDone" + android:key="@string/pref_username" + android:singleLine="true" + android:title="@string/init_username" /> + + <cgeo.geocaching.settings.EditPasswordPreference + android:dependency="@string/pref_connectorGCActive" + android:dialogTitle="@string/init_password" + android:hint="@string/init_password" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:key="@string/pref_password" + android:singleLine="true" + android:title="@string/init_password" /> + + <cgeo.geocaching.settings.CheckGcCredentialsPreference + android:dependency="@string/pref_connectorGCActive" + android:title="@string/init_login" /> + + <PreferenceScreen + android:dependency="@string/pref_connectorGCActive" + android:key="@string/pref_fakekey_basicmembers_screen" + android:title="@string/settings_title_basicmembers" > + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_showcaptcha" + android:summary="@string/init_summary_captcha" + android:title="@string/init_captcha" /> + <CheckBoxPreference + android:defaultValue="true" + android:key="@string/pref_loaddirectionimg" + android:summary="@string/init_summary_loaddirectionimg" + android:title="@string/init_loaddirectionimg" /> + </PreferenceScreen> + </PreferenceCategory> + <PreferenceCategory android:title="@string/settings_information" > + <cgeo.geocaching.settings.InfoPreference + android:text="@string/settings_info_facebook_login" + android:title="@string/settings_info_facebook_login_title" + cgeo:url="@string/settings_facebook_login_url" + cgeo:urlButton="@string/settings_goto_url_button" /> + + <Preference + android:key="@string/pref_fakekey_gc_website" + android:title="@string/settings_open_website" /> + </PreferenceCategory> + </PreferenceScreen> + <PreferenceScreen android:title="@string/init_oc" > + <PreferenceCategory android:title="@string/settings_settings" > + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_connectorOCActive" + android:title="@string/settings_activate_oc" /> + + <cgeo.geocaching.settings.TextPreference + android:dependency="@string/pref_connectorOCActive" + android:layout="@layout/text_preference" + android:text="@string/init_oc_de_description" /> + + <cgeo.geocaching.settings.OAuthPreference + android:dependency="@string/pref_connectorOCActive" + android:key="@string/pref_fakekey_ocde_authorization" /> + </PreferenceCategory> + <PreferenceCategory android:title="@string/settings_information" > + <Preference + android:key="@string/pref_fakekey_ocde_website" + android:title="@string/settings_open_website" /> + </PreferenceCategory> + </PreferenceScreen> + <PreferenceScreen android:title="@string/init_oc_pl" > + <PreferenceCategory android:title="@string/settings_settings" > + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_connectorOCPLActive" + android:title="@string/settings_activate_oc_pl" /> + + <cgeo.geocaching.settings.TextPreference + android:dependency="@string/pref_connectorOCPLActive" + android:layout="@layout/text_preference" + android:text="@string/init_oc_pl_description" /> + + <cgeo.geocaching.settings.OAuthPreference + android:dependency="@string/pref_connectorOCPLActive" + android:key="@string/pref_fakekey_ocpl_authorization" /> + </PreferenceCategory> + <PreferenceCategory android:title="@string/settings_information" > + <Preference + android:key="@string/pref_fakekey_ocpl_website" + android:title="@string/settings_open_website" /> + </PreferenceCategory> + </PreferenceScreen> + <PreferenceScreen android:title="@string/init_gcvote" > + <PreferenceCategory android:title="@string/settings_settings" > + <cgeo.geocaching.settings.EditPasswordPreference + android:dialogTitle="@string/init_password" + android:hint="@string/init_password" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:key="@string/pref_pass_vote" + android:singleLine="true" + android:title="@string/init_password" /> + </PreferenceCategory> + <PreferenceCategory android:title="@string/settings_information" > + <Preference + android:key="@string/pref_fakekey_gcvote_website" + android:title="@string/settings_open_website" /> + </PreferenceCategory> + </PreferenceScreen> + <PreferenceScreen android:title="@string/init_sendToCgeo" > + <PreferenceCategory android:title="@string/settings_settings" > + <EditTextPreference + android:dialogTitle="@string/init_sendToCgeo_name" + android:imeOptions="actionDone" + android:key="@string/pref_webDeviceName" + android:singleLine="true" + android:title="@string/init_sendToCgeo_name" /> + + <cgeo.geocaching.settings.RegisterSend2CgeoPreference android:title="@string/init_sendToCgeo_register" /> + </PreferenceCategory> + <PreferenceCategory android:title="@string/settings_information" > + <cgeo.geocaching.settings.InfoPreference + android:text="@string/init_sendToCgeo_description" + android:title="@string/settings_info_send2cgeo_title" + cgeo:url="@string/settings_send2cgeo_url" + cgeo:urlButton="@string/settings_goto_url_button" /> + + <Preference + android:key="@string/pref_fakekey_sendtocgeo_website" + android:title="@string/settings_open_website" /> + </PreferenceCategory> + </PreferenceScreen> </PreferenceCategory> - - <PreferenceCategory - android:title="@string/settings_category_browser" > - - <CheckBoxPreference + <PreferenceCategory android:title="@string/settings_category_social" > + <PreferenceScreen android:title="@string/init_twitter" > + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_twitter" + android:title="@string/settings_activate_twitter" /> + + <cgeo.geocaching.settings.TextPreference + android:dependency="@string/pref_twitter" + android:layout="@layout/text_preference" + android:text="@string/about_twitter" /> + + <cgeo.geocaching.settings.OAuthPreference + android:dependency="@string/pref_twitter" + android:key="@string/pref_fakekey_twitter_authorization" /> + </PreferenceScreen> + </PreferenceCategory> + <PreferenceCategory android:title="@string/settings_category_browser" > + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_nativeUa" - android:title="@string/init_use_native_ua" android:summary="@string/init_summary_use_native_ua" - android:defaultValue="false" /> - + android:title="@string/init_use_native_ua" /> </PreferenceCategory> - </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_appearance" - android:icon="?attr/settings_eye" > - - <CheckBoxPreference + android:icon="?attr/settings_eye" + android:title="@string/settings_title_appearance" > + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_skin" - android:title="@string/init_skin" android:summary="@string/init_summary_skin" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_skin" /> + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_showaddress" - android:title="@string/init_address" android:summary="@string/init_summary_address" - android:defaultValue="true" /> - <CheckBoxPreference + android:title="@string/init_address" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_plainLogs" - android:title="@string/init_plain_logs" android:summary="@string/init_summary_plain_logs" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_plain_logs" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_useenglish" - android:title="@string/init_useenglish" android:summary="@string/init_summary_useenglish" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_useenglish" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_units" - android:title="@string/init_units" android:summary="@string/init_summary_units" - android:defaultValue="false" /> - + android:title="@string/init_units" /> </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_cachedetails" - android:icon="?attr/settings_details" > - - <CheckBoxPreference + android:icon="?attr/settings_details" + android:title="@string/settings_title_cachedetails" > + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_autoloaddesc" - android:title="@string/init_autoload" android:summary="@string/init_summary_autoload" - android:defaultValue="true" /> - <CheckBoxPreference + android:title="@string/init_autoload" /> + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_ratingwanted" - android:title="@string/init_ratingwanted" android:summary="@string/init_summary_ratingwanted" - android:defaultValue="true" /> - <CheckBoxPreference + android:title="@string/init_ratingwanted" /> + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_friendlogswanted" - android:title="@string/init_friendlogswanted" android:summary="@string/init_summary_friendlogswanted" - android:defaultValue="true" /> - <CheckBoxPreference + android:title="@string/init_friendlogswanted" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_opendetailslastpage" - android:title="@string/init_openlastdetailspage" android:summary="@string/init_summary_openlastdetailspage" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_openlastdetailspage" /> + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_livelist" - android:title="@string/init_livelist" android:summary="@string/init_summary_livelist" - android:defaultValue="true" /> - <CheckBoxPreference + android:title="@string/init_livelist" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_excludemine" - android:title="@string/init_exclude" android:summary="@string/init_summary_exclude" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_exclude" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_excludedisabled" - android:title="@string/init_disabled" android:summary="@string/init_summary_disabled" - android:defaultValue="false" /> - + android:title="@string/init_disabled" /> </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_map" - android:icon="?attr/settings_map" > - - <PreferenceCategory - android:title="@string/settings_title_map_data" > - + android:icon="?attr/settings_map" + android:title="@string/settings_title_map" > + <PreferenceCategory android:title="@string/settings_title_map_data" > <ListPreference - android:key="@string/pref_mapsource" - android:title="@string/init_mapsource_select" + android:defaultValue="0" android:dialogTitle="@string/init_mapsource_select" - android:defaultValue="0" /> - - <cgeo.geocaching.settings.InfoPreference - android:title="@string/settings_info_offline_maps_title" + android:key="@string/pref_mapsource" + android:title="@string/init_mapsource_select" /> + + <cgeo.geocaching.settings.InfoPreference android:text="@string/settings_info_offline_maps" + android:title="@string/settings_info_offline_maps_title" cgeo:url="@string/settings_offline_maps_url" cgeo:urlButton="@string/settings_goto_url_button" /> - + <Preference android:key="@string/pref_mapDirectory" android:title="@string/init_map_directory_description" /> - - <cgeo.geocaching.settings.InfoPreference - android:title="@string/settings_info_themes_title" + + <cgeo.geocaching.settings.InfoPreference android:text="@string/settings_info_themes" + android:title="@string/settings_info_themes_title" cgeo:url="@string/settings_themes_url" cgeo:urlButton="@string/settings_goto_url_button" /> - + <Preference android:key="@string/pref_renderthemepath" android:title="@string/init_rendertheme_folder" /> + <CheckBoxPreference + android:key="@string/pref_mapsforge_scale_text" + android:title="@string/settings_title_scale_map_text" + android:summary="@string/settings_summary_scale_map_text" + android:defaultValue="true" /> </PreferenceCategory> - - <PreferenceCategory - android:title="@string/settings_title_map_content" > - + <PreferenceCategory android:title="@string/settings_title_map_content" > <Preference - android:title="@string/init_showwaypoints" + android:selectable="false" android:summary="@string/init_showwaypoint_description" - android:selectable="false" /> + android:title="@string/init_showwaypoints" /> + <cgeo.geocaching.settings.WpThresholdPreference android:key="@string/pref_showwaypointsthreshold" android:layout="@layout/wp_threshold_preference" /> - <CheckBoxPreference + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_maptrail" - android:title="@string/init_maptrail" android:summary="@string/init_summary_maptrail" - android:defaultValue="true" /> - + android:title="@string/init_maptrail" /> </PreferenceCategory> - </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_logging" - android:icon="?attr/settings_pen" > - - <PreferenceCategory - android:title="@string/init_signature"> - + android:icon="?attr/settings_pen" + android:title="@string/settings_title_logging" > + <PreferenceCategory android:title="@string/init_signature" > <cgeo.geocaching.settings.LogSignaturePreference android:key="@string/pref_signature" android:title="@string/init_signature" /> - <CheckBoxPreference - android:key="@string/pref_sigautoinsert" - android:title="@string/init_sigautoinsert" - android:defaultValue="true" /> + <CheckBoxPreference + android:defaultValue="true" + android:key="@string/pref_sigautoinsert" + android:title="@string/init_sigautoinsert" /> </PreferenceCategory> - - <PreferenceCategory - android:title="@string/settings_category_logging_other"> - - <CheckBoxPreference + <PreferenceCategory android:title="@string/settings_category_logging_other" > + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_trackautovisit" - android:title="@string/init_trackautovisit" android:summary="@string/init_summary_trackautovisit" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_trackautovisit" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_log_offline" - android:title="@string/init_log_offline" android:summary="@string/init_summary_log_offline" - android:defaultValue="false" /> - + android:title="@string/init_log_offline" /> </PreferenceCategory> - </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_offlinedata" - android:icon="?attr/settings_sdcard" > - - <CheckBoxPreference + android:icon="?attr/settings_sdcard" + android:title="@string/settings_title_offlinedata" > + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_offlinemaps" - android:title="@string/init_offline" android:summary="@string/init_summary_offline" - android:defaultValue="true" /> - <CheckBoxPreference + android:title="@string/init_offline" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_offlinewpmaps" - android:title="@string/init_offline_wp" android:summary="@string/init_summary_offline_wp" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_offline_wp" /> + <CheckBoxPreference + android:defaultValue="false" android:key="@string/pref_logimages" - android:title="@string/init_save_log_img" android:summary="@string/init_summary_save_log_img" - android:defaultValue="false" /> - <CheckBoxPreference + android:title="@string/init_save_log_img" /> + <CheckBoxPreference + android:defaultValue="true" android:key="@string/pref_choose_list" - android:title="@string/init_choose_list" android:summary="@string/init_summary_choose_list" - android:defaultValue="true" /> - + android:title="@string/init_choose_list" /> </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_navigation" - android:icon="?attr/settings_arrow" > - - <PreferenceCategory - android:title="@string/init_default_navigation_tool" > - + android:icon="?attr/settings_arrow" + android:title="@string/settings_title_navigation" > + <PreferenceCategory android:title="@string/init_default_navigation_tool" > <cgeo.geocaching.settings.TextPreference android:layout="@layout/text_preference" android:text="@string/init_default_navigation_tool_description" /> <ListPreference - android:key="@string/pref_defaultNavigationTool" - android:title="@string/init_default_navigation_tool_select" + android:defaultValue="0" android:dialogTitle="@string/init_default_navigation_tool_select" - android:defaultValue="0" /> + android:key="@string/pref_defaultNavigationTool" + android:title="@string/init_default_navigation_tool_select" /> </PreferenceCategory> - - <PreferenceCategory - android:title="@string/init_secondary_navigation_tool" > - + <PreferenceCategory android:title="@string/init_secondary_navigation_tool" > <cgeo.geocaching.settings.TextPreference android:layout="@layout/text_preference" android:text="@string/init_default_navigation_tool_2_description" /> <ListPreference - android:key="@string/pref_defaultNavigationTool2" - android:title="@string/init_default_navigation_tool_select" + android:defaultValue="0" android:dialogTitle="@string/init_default_navigation_tool_select" - android:defaultValue="0" /> - + android:key="@string/pref_defaultNavigationTool2" + android:title="@string/init_default_navigation_tool_select" /> </PreferenceCategory> - - <PreferenceCategory - android:title="@string/settings_title_navigation_menu" > - + <PreferenceCategory android:title="@string/settings_title_navigation_menu" > <cgeo.geocaching.settings.TextPreference android:layout="@layout/text_preference" android:text="@string/init_navigation_menu_description" /> - + <PreferenceScreen - android:title="@string/settings_title_navigation_menu" - android:key="@string/pref_fakekey_navigation_menu_screen" > - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_compass" - android:title="@string/compass_title" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_radar" - android:title="@string/cache_menu_radar" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_internal_map" - android:title="@string/cache_menu_map" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_static_map" - android:title="@string/cache_menu_map_static" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_static_map_download" - android:title="@string/cache_menu_download_map_static" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_locus" - android:title="@string/caches_map_locus" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_rmaps" - android:title="@string/cache_menu_rmaps" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_google_maps" - android:title="@string/cache_menu_map_ext" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_google_navigation" - android:title="@string/cache_menu_navigation_drive" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_google_streetview" - android:title="@string/cache_menu_streetview" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_oruxmaps" - android:title="@string/cache_menu_oruxmaps" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_navigon" - android:title="@string/cache_menu_navigon" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_sygic" - android:title="@string/cache_menu_sygic" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_google_walk" - android:title="@string/cache_menu_navigation_walk" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_google_bike" - android:title="@string/cache_menu_navigation_bike" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_google_maps_directions" - android:title="@string/cache_menu_maps_directions" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_cache_beacon" - android:title="@string/cache_menu_cachebeacon" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_gcc" - android:title="@string/cache_menu_gcc" /> - <CheckBoxPreference - android:defaultValue="true" - android:enabled="false" - android:key="@string/pref_navigation_menu_where_you_go" - android:title="@string/cache_menu_whereyougo" /> - </PreferenceScreen> - </PreferenceCategory> + android:key="@string/pref_fakekey_navigation_menu_screen" + android:title="@string/settings_title_navigation_menu" > + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_compass" + android:title="@string/compass_title" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_radar" + android:title="@string/cache_menu_radar" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_internal_map" + android:title="@string/cache_menu_map" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_static_map" + android:title="@string/cache_menu_map_static" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_static_map_download" + android:title="@string/cache_menu_download_map_static" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_locus" + android:title="@string/caches_map_locus" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_rmaps" + android:title="@string/cache_menu_rmaps" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_google_maps" + android:title="@string/cache_menu_map_ext" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_google_navigation" + android:title="@string/cache_menu_navigation_drive" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_google_streetview" + android:title="@string/cache_menu_streetview" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_oruxmaps" + android:title="@string/cache_menu_oruxmaps" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_navigon" + android:title="@string/cache_menu_navigon" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_sygic" + android:title="@string/cache_menu_sygic" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_google_walk" + android:title="@string/cache_menu_navigation_walk" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_google_bike" + android:title="@string/cache_menu_navigation_bike" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_google_maps_directions" + android:title="@string/cache_menu_maps_directions" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_cache_beacon" + android:title="@string/cache_menu_cachebeacon" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_gcc" + android:title="@string/cache_menu_gcc" /> + <CheckBoxPreference + android:defaultValue="true" + android:enabled="false" + android:key="@string/pref_navigation_menu_where_you_go" + android:title="@string/cache_menu_whereyougo" /> + </PreferenceScreen> + </PreferenceCategory> </PreferenceScreen> - <PreferenceScreen - android:title="@string/settings_title_system" - android:icon="?attr/settings_nut" > - - <PreferenceCategory - android:title="@string/settings_title_gpx" > - + android:icon="?attr/settings_nut" + android:title="@string/settings_title_system" > + <PreferenceCategory android:title="@string/settings_title_gpx" > <Preference android:key="@string/pref_gpxExportDir" android:title="@string/init_gpx_exportdir" /> <Preference android:key="@string/pref_gpxImportDir" android:title="@string/init_gpx_importdir" /> - </PreferenceCategory> - - <PreferenceCategory - android:title="@string/init_backup" > - + <PreferenceCategory android:title="@string/init_backup" > <cgeo.geocaching.settings.TextPreference android:key="@string/pref_fakekey_preference_backup_info" android:layout="@layout/text_preference" android:text="@string/init_backup_note" /> - <Preference + + <Preference android:key="@string/pref_fakekey_preference_backup" android:title="@string/init_backup_backup" /> - <Preference + <Preference android:key="@string/pref_fakekey_preference_restore" android:title="@string/init_backup_restore" /> - </PreferenceCategory> - - <PreferenceCategory - android:title="@string/init_dbonsdcard_title" > - + <PreferenceCategory android:title="@string/init_dbonsdcard_title" > <cgeo.geocaching.settings.TextPreference android:layout="@layout/text_preference" android:text="@string/init_dbonsdcard_note" /> - <CheckBoxPreference - android:key="@string/pref_dbonsdcard" - android:title="@string/init_dbonsdcard" - android:defaultValue="false" /> + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_dbonsdcard" + android:title="@string/init_dbonsdcard" /> </PreferenceCategory> - - <PreferenceCategory - android:title="@string/init_debug_title" > - + <PreferenceCategory android:title="@string/init_debug_title" > <cgeo.geocaching.settings.TextPreference android:layout="@layout/text_preference" android:text="@string/init_debug_note" /> - <CheckBoxPreference - android:key="@string/pref_debug" - android:title="@string/init_debug" - android:defaultValue="false" /> + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_debug" + android:title="@string/init_debug" /> </PreferenceCategory> - </PreferenceScreen> -</PreferenceScreen> +</PreferenceScreen>
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/AboutActivity.java b/main/src/cgeo/geocaching/AboutActivity.java index 997dd2f..3ab9904 100644 --- a/main/src/cgeo/geocaching/AboutActivity.java +++ b/main/src/cgeo/geocaching/AboutActivity.java @@ -140,7 +140,7 @@ public class AboutActivity extends AbstractViewPagerActivity<AboutActivity.Page> } @Override - public final void onCreate(final Bundle savedInstanceState) { + public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.viewpager_activity); createViewPager(0, null); reinitializeViewPager(); diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index 1cf0353..02f89a6 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -21,8 +21,6 @@ import android.content.Intent; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; @@ -42,18 +40,6 @@ public abstract class AbstractPopupActivity extends AbstractActivity { private TextView cacheDistance = null; private final int layout; - private final Handler ratingHandler = new Handler() { - - @Override - public void handleMessage(Message msg) { - try { - details.addRating(cache); - } catch (final Exception e) { - // nothing - } - } - }; - private final GeoDirHandler geoUpdate = new GeoDirHandler() { @Override @@ -64,7 +50,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { cacheDistance.bringToFront(); } onUpdateGeoData(geo); - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.w("Failed to UpdateLocation location."); } } @@ -91,8 +77,8 @@ public abstract class AbstractPopupActivity extends AbstractActivity { if (!cache.supportsGCVote()) { return; } - (new Thread("Load GCVote") { + (new Thread("Load GCVote") { @Override public void run() { final GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode); @@ -102,14 +88,17 @@ public abstract class AbstractPopupActivity extends AbstractActivity { } cache.setRating(rating.getRating()); cache.setVotes(rating.getVotes()); - final Message msg = Message.obtain(); - ratingHandler.sendMessage(msg); + runOnUiThread(new Runnable() { + @Override + public void run() { + details.addRating(cache); } + }); } }).start(); } protected void init() { - cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); if (cache == null) { showToast(res.getString(R.string.err_detail_cache_find)); @@ -209,7 +198,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { menu.findItem(R.id.menu_default_navigation).setTitle(NavigationAppFactory.getDefaultNavigationApplication().getName()); LoggingUI.onPrepareOptionsMenu(menu, cache); - } catch (final Exception e) { + } catch (final RuntimeException e) { // nothing } @@ -243,6 +232,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { protected abstract void startDefaultNavigation2(); protected final void addCacheDetails() { + assert cache != null; // cache type final String cacheType = cache.getType().getL10n(); final String cacheSize = cache.getSize() != CacheSize.UNKNOWN ? " (" + cache.getSize().getL10n() + ")" : ""; @@ -256,6 +246,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { details.addDifficulty(cache); details.addTerrain(cache); + details.addEventDate(cache); // rating if (cache.getRating() > 0) { @@ -285,7 +276,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { showToast(res.getString(R.string.err_location_unknown)); return; } - cgeocaches.startActivityCoordinates(this, coords); + CacheListActivity.startActivityCoordinates(this, coords); finish(); } diff --git a/main/src/cgeo/geocaching/AddressListActivity.java b/main/src/cgeo/geocaching/AddressListActivity.java index c984d28..dc0239f 100644 --- a/main/src/cgeo/geocaching/AddressListActivity.java +++ b/main/src/cgeo/geocaching/AddressListActivity.java @@ -4,7 +4,7 @@ import cgeo.geocaching.activity.AbstractListActivity; import cgeo.geocaching.ui.AddressListAdapter; import cgeo.geocaching.utils.Log; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.ProgressDialog; @@ -66,7 +66,7 @@ public class AddressListActivity extends AbstractListActivity { } } else { finish(); - cgeocaches.startActivityAddress(AddressListActivity.this, null, keyword); + CacheListActivity.startActivityAddress(AddressListActivity.this, null, keyword); } } diff --git a/main/src/cgeo/geocaching/CacheCache.java b/main/src/cgeo/geocaching/CacheCache.java index e70b7a0..b3c674c 100644 --- a/main/src/cgeo/geocaching/CacheCache.java +++ b/main/src/cgeo/geocaching/CacheCache.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.cgData.StorageLocation; +import cgeo.geocaching.DataStore.StorageLocation; import cgeo.geocaching.connector.gc.Tile; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.geopoint.Viewport; diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 4a9cc6e..174a036 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -18,6 +18,7 @@ import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.GeopointFormatter; import cgeo.geocaching.geopoint.Units; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; @@ -52,7 +53,7 @@ import cgeo.geocaching.utils.TextUtils; import cgeo.geocaching.utils.TranslationUtils; import cgeo.geocaching.utils.UnknownTagsHandler; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -291,7 +292,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc title = geocode; } progress.show(this, title, res.getString(R.string.cache_dialog_loading_details), true, loadCacheHandler.cancelMessage()); - } catch (final Exception e) { + } catch (final RuntimeException e) { // nothing, we lost the window } @@ -422,7 +423,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc break; } } - } catch (final Exception e) { + } catch (final RuntimeException e) { } } break; @@ -438,11 +439,11 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc menu.setHeaderTitle(fieldTitle); menu.add(viewId, MENU_FIELD_COPY, 0, res.getString(android.R.string.copy)); if (!copyOnly) { - if (clickedItemText.length() > TranslationUtils.translationTextLengthToWarn) { + if (clickedItemText.length() > TranslationUtils.TRANSLATION_TEXT_LENGTH_WARN) { showToast(res.getString(R.string.translate_length_warning)); } menu.add(viewId, MENU_FIELD_TRANSLATE, 0, res.getString(R.string.translate_to_sys_lang, Locale.getDefault().getDisplayLanguage())); - if (Settings.isUseEnglish() && !StringUtils.equals(Locale.getDefault().getLanguage(), Locale.ENGLISH.getLanguage())) { + if (!StringUtils.equals(Locale.getDefault().getLanguage(), Locale.ENGLISH.getLanguage())) { menu.add(viewId, MENU_FIELD_TRANSLATE_EN, 0, res.getString(R.string.translate_to_english)); } @@ -493,14 +494,14 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc case CONTEXT_MENU_WAYPOINT_DUPLICATE: final Waypoint waypointDuplicate = cache.getWaypoint(index); if (cache.duplicateWaypoint(waypointDuplicate)) { - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); notifyDataSetChanged(); } break; case CONTEXT_MENU_WAYPOINT_DELETE: final Waypoint waypointDelete = cache.getWaypoint(index); if (cache.deleteWaypoint(waypointDelete)) { - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); notifyDataSetChanged(); } break; @@ -519,7 +520,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc case CONTEXT_MENU_WAYPOINT_CACHES_AROUND: final Waypoint waypointAround = cache.getWaypoint(index); if (waypointAround != null) { - cgeocaches.startActivityCoordinates(this, waypointAround.getCoords()); + CacheListActivity.startActivityCoordinates(this, waypointAround.getCoords()); } break; @@ -588,7 +589,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc cache.openInBrowser(this); return true; case MENU_CACHES_AROUND: - cgeocaches.startActivityCoordinates(this, cache.getCoords()); + CacheListActivity.startActivityCoordinates(this, cache.getCoords()); return true; case MENU_CALENDAR: addToCalendarWithIntent(); @@ -1134,7 +1135,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc if (time > 0) { String dateString = Formatter.formatFullDate(time); if (cache.isEventCache()) { - dateString = DateUtils.formatDateTime(cgeoapplication.getInstance().getBaseContext(), time, DateUtils.FORMAT_SHOW_WEEKDAY) + ", " + dateString; + dateString = DateUtils.formatDateTime(CgeoApplication.getInstance().getBaseContext(), time, DateUtils.FORMAT_SHOW_WEEKDAY) + ", " + dateString; } details.add(cache.isEventCache() ? R.string.cache_event : R.string.cache_hidden, dateString); } @@ -1279,7 +1280,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc private Handler handler; public DropCacheThread(Handler handler) { - super(); this.handler = handler; } @@ -1481,7 +1481,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } Settings.saveLastList(listId); - cgData.moveToList(cache, listId); + DataStore.moveToList(cache, listId); updateListBox(); } @@ -1564,7 +1564,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc // update text final TextView text = (TextView) view.findViewById(R.id.list_text); - final StoredList list = cgData.getList(cache.getListId()); + final StoredList list = DataStore.getList(cache.getListId()); if (list != null) { text.setText(res.getString(R.string.cache_list_text) + " " + list.title); } else { @@ -1615,7 +1615,8 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc return; } - ((ImageView) view.findViewById(R.id.map_preview)).setImageDrawable(image); + final ImageView imageView = (ImageView) view.findViewById(R.id.map_preview); + imageView.setImageDrawable(image); view.findViewById(R.id.map_preview_box).setVisibility(View.VISIBLE); } catch (final Exception e) { Log.e("CacheDetailActivity.PreviewMapTask", e); @@ -1706,12 +1707,16 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } hintView.setVisibility(View.VISIBLE); hintView.setClickable(true); - hintView.setOnClickListener(new DecryptTextClickListener()); + hintView.setOnClickListener(new DecryptTextClickListener(hintView)); + hintBoxView.setOnClickListener(new DecryptTextClickListener(hintView)); + hintBoxView.setClickable(true); registerForContextMenu(hintView); } else { hintView.setVisibility(View.GONE); hintView.setClickable(false); hintView.setOnClickListener(null); + hintBoxView.setClickable(false); + hintBoxView.setOnClickListener(null); } final TextView spoilerlinkView = ((TextView) view.findViewById(R.id.hint_spoilerlink)); @@ -2197,7 +2202,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc cache.setCoords(wpt.getCoords()); cache.setUserModifiedCoords(false); cache.deleteWaypointForce(wpt); - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); handler.sendEmptyMessage(LOCAL); } @@ -2452,7 +2457,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } protected void storeCache(final int listId, final StoreCacheHandler storeCacheHandler) { - progress.show(CacheDetailActivity.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage()); + progress.show(this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage()); if (storeThread != null) { storeThread.interrupt(); @@ -2491,7 +2496,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc cache.parseWaypointsFromNote(); TextView personalNoteView = (TextView) activity.findViewById(R.id.personalnote); setPersonalNote(personalNoteView, note); - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); activity.notifyDataSetChanged(); } }; diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/CacheListActivity.java index 59174f5..848518d 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -16,6 +16,7 @@ import cgeo.geocaching.files.GPXImporter; import cgeo.geocaching.filter.FilterUserInterface; import cgeo.geocaching.filter.IFilter; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.loaders.AbstractSearchLoader; import cgeo.geocaching.loaders.AbstractSearchLoader.CacheListLoaderType; import cgeo.geocaching.loaders.AddressGeocacheListLoader; @@ -44,9 +45,10 @@ import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; import ch.boye.httpclientandroidlib.HttpResponse; - -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -80,7 +82,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -public class cgeocaches extends AbstractListActivity implements FilteredActivity, LoaderManager.LoaderCallbacks<SearchResult> { +public class CacheListActivity extends AbstractListActivity implements FilteredActivity, LoaderManager.LoaderCallbacks<SearchResult> { private static final int MAX_LIST_ITEMS = 1000; private static final int MENU_REFRESH_STORED = 2; @@ -152,7 +154,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity } if (app.currentGeo().getSpeed() <= 5) { // use compass when speed is lower than 18 km/h) { - final float northHeading = DirectionProvider.getDirectionNow(cgeocaches.this, direction); + final float northHeading = DirectionProvider.getDirectionNow(CacheListActivity.this, direction); adapter.setActualHeading(northHeading); } } @@ -211,7 +213,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity setAdapterCurrentCoordinates(false); } catch (final Exception e) { showToast(res.getString(R.string.err_detail_cache_find_any)); - Log.e("cgeocaches.loadCachesHandler", e); + Log.e("CacheListActivity.loadCachesHandler", e); hideLoading(); showProgress(false); @@ -224,7 +226,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity hideLoading(); showProgress(false); } catch (final Exception e2) { - Log.e("cgeocaches.loadCachesHandler.2", e2); + Log.e("CacheListActivity.loadCachesHandler.2", e2); } adapter.setSelectMode(false); @@ -232,15 +234,15 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity private final Handler loadCachesHandler = new LoadCachesHandler(this); - private static class LoadCachesHandler extends WeakReferenceHandler<cgeocaches> { + private static class LoadCachesHandler extends WeakReferenceHandler<CacheListActivity> { - protected LoadCachesHandler(cgeocaches activity) { + protected LoadCachesHandler(CacheListActivity activity) { super(activity); } @Override public void handleMessage(Message msg) { - final cgeocaches activity = getActivity(); + final CacheListActivity activity = getActivity(); if (activity == null) { return; } @@ -398,7 +400,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity private AbstractSearchLoader currentLoader; private String newListName = StringUtils.EMPTY; - public cgeocaches() { + public CacheListActivity() { super(true); } @@ -433,7 +435,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity @Override public void onClick(View v) { - selectList(v); + selectList(); } }); @@ -469,7 +471,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity private boolean isConcreteList() { return type == CacheListType.OFFLINE && - (listId == StoredList.STANDARD_LIST_ID || listId >= cgData.customListIdOffset); + (listId == StoredList.STANDARD_LIST_ID || listId >= DataStore.customListIdOffset); } private boolean isInvokedFromAttachment() { @@ -481,7 +483,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity @Override public void run(Integer listId) { - new GPXImporter(cgeocaches.this, listId, importGpxAttachementFinishedHandler).importGPX(); + new GPXImporter(CacheListActivity.this, listId, importGpxAttachementFinishedHandler).importGPX(); switchListById(listId); } }, true, 0); @@ -503,7 +505,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity // refresh standard list if it has changed (new caches downloaded) if (type == CacheListType.OFFLINE && listId >= StoredList.STANDARD_LIST_ID && search != null) { - final SearchResult newSearch = cgData.getBatchOfStoredCaches(coords, Settings.getCacheType(), listId); + final SearchResult newSearch = DataStore.getBatchOfStoredCaches(coords, Settings.getCacheType(), listId); if (newSearch.getTotal() != search.getTotal()) { refreshCurrentList(); } @@ -643,7 +645,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity item.setVisible(isNonDefaultList); } - final boolean multipleLists = cgData.getLists().size() >= 2; + final boolean multipleLists = DataStore.getLists().size() >= 2; item = menu.findItem(MENU_SWITCH_LIST); if (item != null) { item.setVisible(multipleLists); @@ -655,8 +657,8 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity setMenuItemLabel(menu, MENU_REMOVE_FROM_HISTORY, R.string.cache_remove_from_history, R.string.cache_clear_history); setMenuItemLabel(menu, MENU_EXPORT, R.string.export, R.string.export); - } catch (final Exception e) { - Log.e("cgeocaches.onPrepareOptionsMenu", e); + } catch (final RuntimeException e) { + Log.e("CacheListActivity.onPrepareOptionsMenu", e); } return true; @@ -733,7 +735,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity invalidateOptionsMenuCompatible(); return false; case MENU_SWITCH_LIST: - selectList(null); + selectList(); invalidateOptionsMenuCompatible(); return false; case MENU_FILTER: @@ -832,7 +834,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity try { adapterInfo = (AdapterContextMenuInfo) info; } catch (final Exception e) { - Log.w("cgeocaches.onCreateContextMenu", e); + Log.w("CacheListActivity.onCreateContextMenu", e); } if (adapterInfo == null || adapterInfo.position >= adapter.getCount()) { @@ -866,7 +868,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity @Override public void run(Integer newListId) { - cgData.moveToList(adapter.getCheckedOrAllCaches(), newListId); + DataStore.moveToList(adapter.getCheckedOrAllCaches(), newListId); adapter.setSelectMode(false); refreshCurrentList(); @@ -889,7 +891,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity try { adapterInfo = (AdapterContextMenuInfo) info; } catch (final Exception e) { - Log.w("cgeocaches.onContextItemSelected", e); + Log.w("CacheListActivity.onContextItemSelected", e); } final Geocache cache = adapterInfo != null ? getCacheFromAdapter(adapterInfo) : null; @@ -924,7 +926,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity @Override public void run(Integer newListId) { - cgData.moveToList(Collections.singletonList(cache), newListId); + DataStore.moveToList(Collections.singletonList(cache), newListId); adapter.setSelectMode(false); refreshCurrentList(); } @@ -1200,7 +1202,6 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity final private Handler handler; final private int listIdLD; private volatile boolean needToStop = false; - private long last = 0L; final private List<Geocache> caches; public LoadDetailsThread(Handler handlerIn, List<Geocache> caches, int listId) { @@ -1218,21 +1219,14 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity @Override public void run() { removeGeoAndDir(); - - final List<Geocache> cachesWithStaticMaps = new ArrayList<Geocache>(this.caches.size()); - for (final Geocache cache : this.caches) { - if (Settings.isStoreOfflineMaps() && cache.hasStaticMap()) { - cachesWithStaticMaps.add(cache); - continue; - } - if (!refreshCache(cache)) { - // in case of interruption avoid the second loop - cachesWithStaticMaps.clear(); - break; - } - } - - for (final Geocache cache : cachesWithStaticMaps) { + // First refresh caches that do not yet have static maps to get them a chance to get a copy + // before the limit expires, unless we do not want to store offline maps. + final List<Geocache> allCaches = Settings.isStoreOfflineMaps() ? + ListUtils.union(ListUtils.selectRejected(caches, Geocache.hasStaticMap), + ListUtils.select(caches, Geocache.hasStaticMap)) : + caches; + + for (final Geocache cache : allCaches) { if (!refreshCache(cache)) { break; } @@ -1255,38 +1249,16 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity if (needToStop) { throw new InterruptedException("Stopped storing process."); } - - if ((System.currentTimeMillis() - last) < 1500) { - try { - int delay = 1000 + ((Double) (Math.random() * 1000)).intValue() - (int) (System.currentTimeMillis() - last); - if (delay < 0) { - delay = 500; - } - - Log.i("Waiting for next cache " + delay + " ms"); - } catch (final Exception e) { - Log.e("cgeocaches.LoadDetailsThread.sleep", e); - } - } - - if (needToStop) { - throw new InterruptedException("Stopped storing process."); - } - detailProgress++; cache.refresh(listIdLD, null); - handler.sendEmptyMessage(cacheList.indexOf(cache)); - - yield(); } catch (final InterruptedException e) { Log.i(e.getMessage()); return false; } catch (final Exception e) { - Log.e("cgeocaches.LoadDetailsThread", e); + Log.e("CacheListActivity.LoadDetailsThread", e); } - last = System.currentTimeMillis(); return true; } } @@ -1326,7 +1298,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity if (responseFromWeb != null && responseFromWeb.getStatusLine().getStatusCode() == 200) { final String response = Network.getResponseData(responseFromWeb); - if (response.length() > 2) { + if (response != null && response.length() > 2) { delay = 1; handler.sendMessage(handler.obtainMessage(1, response)); yield(); @@ -1363,7 +1335,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity times = 0; } } catch (final InterruptedException e) { - Log.e("cgeocaches.LoadFromWebThread.sleep", e); + Log.e("CacheListActivity.LoadFromWebThread.sleep", e); } } @@ -1378,14 +1350,14 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity private final boolean removeListAfterwards; public DropDetailsTask(boolean removeListAfterwards) { - super(cgeocaches.this, null, res.getString(R.string.caches_drop_progress), true); + super(CacheListActivity.this, null, res.getString(R.string.caches_drop_progress), true); this.removeListAfterwards = removeListAfterwards; } @Override protected Void doInBackgroundInternal(Geocache[] caches) { removeGeoAndDir(); - cgData.markDropped(Arrays.asList(caches)); + DataStore.markDropped(Arrays.asList(caches)); startGeoAndDir(); return null; } @@ -1416,7 +1388,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity @Override public void run() { - cgData.clearLogsOffline(selected); + DataStore.clearLogsOffline(selected); handler.sendEmptyMessage(MSG_DONE); } } @@ -1429,7 +1401,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity showFooterLoadingCaches(); listFooter.setOnClickListener(null); - getSupportLoaderManager().restartLoader(CacheListLoaderType.NEXT_PAGE.ordinal(), null, cgeocaches.this); + getSupportLoaderManager().restartLoader(CacheListLoaderType.NEXT_PAGE.ordinal(), null, CacheListActivity.this); } } @@ -1442,17 +1414,14 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity } } - /** - * @param view - * unused here but needed since this method is referenced from XML layout - */ - public void selectList(View view) { - if (type != CacheListType.OFFLINE) { + public void selectList() { + if (!type.canSwitch) { return; } new StoredList.UserInterface(this).promptForListSelection(R.string.list_title, getListSwitchingRunnable()); } + @NonNull private RunnableWithArgument<Integer> getListSwitchingRunnable() { return new RunnableWithArgument<Integer>() { @@ -1468,7 +1437,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity return; } - final StoredList list = cgData.getList(id); + final StoredList list = DataStore.getList(id); if (list == null) { return; } @@ -1480,7 +1449,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity showProgress(true); showFooterLoadingCaches(); - cgData.moveToList(adapter.getCheckedCaches(), listId); + DataStore.moveToList(adapter.getCheckedCaches(), listId); currentLoader = (OfflineGeocacheListLoader) getSupportLoaderManager().initLoader(CacheListType.OFFLINE.ordinal(), new Bundle(), this); currentLoader.reset(); @@ -1503,7 +1472,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity } private void removeListInternal() { - if (cgData.removeList(listId)) { + if (DataStore.removeList(listId)) { showToast(res.getString(R.string.list_dialog_remove_ok)); switchListById(StoredList.STANDARD_LIST_ID); } else { @@ -1576,7 +1545,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity } public static void startActivityOffline(final Context context) { - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.OFFLINE); context.startActivity(cachesIntent); } @@ -1585,7 +1554,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity if (!isValidUsername(context, userName)) { return; } - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.OWNER); cachesIntent.putExtra(Intents.EXTRA_USERNAME, userName); context.startActivity(cachesIntent); @@ -1593,7 +1562,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity private static boolean isValidUsername(AbstractActivity context, String username) { if (StringUtils.isBlank(username)) { - context.showToast(cgeoapplication.getInstance().getString(R.string.warn_no_username)); + context.showToast(CgeoApplication.getInstance().getString(R.string.warn_no_username)); return false; } return true; @@ -1603,7 +1572,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity if (!isValidUsername(context, userName)) { return; } - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.USERNAME); cachesIntent.putExtra(Intents.EXTRA_USERNAME, userName); context.startActivity(cachesIntent); @@ -1629,20 +1598,20 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity if (!isValidCoords(context, coordsNow)) { return; } - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.NEAREST); cachesIntent.putExtra(Intents.EXTRA_COORDS, coordsNow); context.startActivity(cachesIntent); } public static void startActivityHistory(Context context) { - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.HISTORY); context.startActivity(cachesIntent); } public static void startActivityAddress(final Context context, final Geopoint coords, final String address) { - final Intent addressIntent = new Intent(context, cgeocaches.class); + final Intent addressIntent = new Intent(context, CacheListActivity.class); addressIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.ADDRESS); addressIntent.putExtra(Intents.EXTRA_COORDS, coords); addressIntent.putExtra(Intents.EXTRA_ADDRESS, address); @@ -1653,7 +1622,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity if (!isValidCoords(context, coords)) { return; } - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.COORDINATE); cachesIntent.putExtra(Intents.EXTRA_COORDS, coords); context.startActivity(cachesIntent); @@ -1661,7 +1630,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity private static boolean isValidCoords(AbstractActivity context, Geopoint coords) { if (coords == null) { - context.showToast(cgeoapplication.getInstance().getString(R.string.warn_no_coordinates)); + context.showToast(CgeoApplication.getInstance().getString(R.string.warn_no_coordinates)); return false; } return true; @@ -1669,17 +1638,17 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity public static void startActivityKeyword(final AbstractActivity context, final String keyword) { if (keyword == null) { - context.showToast(cgeoapplication.getInstance().getString(R.string.warn_no_keyword)); + context.showToast(CgeoApplication.getInstance().getString(R.string.warn_no_keyword)); return; } - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.KEYWORD); cachesIntent.putExtra(Intents.EXTRA_KEYWORD, keyword); context.startActivity(cachesIntent); } public static void startActivityMap(final Context context, final SearchResult search) { - final Intent cachesIntent = new Intent(context, cgeocaches.class); + final Intent cachesIntent = new Intent(context, CacheListActivity.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.MAP); cachesIntent.putExtra(Intents.EXTRA_SEARCH, search); context.startActivity(cachesIntent); @@ -1701,7 +1670,7 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity listId = StoredList.STANDARD_LIST_ID; title = res.getString(R.string.stored_caches_button); } else { - final StoredList list = cgData.getList(listId); + final StoredList list = DataStore.getList(listId); // list.id may be different if listId was not valid listId = list.id; title = list.title; diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java index 873801e..683ebe7 100644 --- a/main/src/cgeo/geocaching/CachePopup.java +++ b/main/src/cgeo/geocaching/CachePopup.java @@ -3,6 +3,7 @@ package cgeo.geocaching; import cgeo.geocaching.activity.Progress; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.Network; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.CacheDetailsCreator; diff --git a/main/src/cgeo/geocaching/cgeoapplication.java b/main/src/cgeo/geocaching/CgeoApplication.java index 5a793f5..2c419cf 100644 --- a/main/src/cgeo/geocaching/cgeoapplication.java +++ b/main/src/cgeo/geocaching/CgeoApplication.java @@ -9,12 +9,10 @@ import android.app.Activity; import android.app.Application; import android.app.ProgressDialog; import android.content.res.Resources; -import android.os.Handler; -import android.os.Message; import java.util.concurrent.atomic.AtomicBoolean; -public class cgeoapplication extends Application { +public class CgeoApplication extends Application { private volatile GeoDataProvider geo; private volatile DirectionProvider dir; @@ -22,17 +20,17 @@ public class cgeoapplication extends Application { public boolean showLoginToast = true; //login toast shown just once. private boolean liveMapHintShown = false; // livemap hint has been shown final private StatusUpdater statusUpdater = new StatusUpdater(); - private static cgeoapplication instance; + private static CgeoApplication instance; - public cgeoapplication() { + public CgeoApplication() { setInstance(this); } - private static void setInstance(final cgeoapplication application) { + private static void setInstance(final CgeoApplication application) { instance = application; } - public static cgeoapplication getInstance() { + public static CgeoApplication getInstance() { return instance; } @@ -46,15 +44,15 @@ public class cgeoapplication extends Application { @Override public void onLowMemory() { Log.i("Cleaning applications cache."); - cgData.removeAllFromCache(); + DataStore.removeAllFromCache(); } @Override public void onTerminate() { Log.d("Terminating c:geoโฆ"); - cgData.clean(); - cgData.closeDb(); + DataStore.clean(); + DataStore.closeDb(); super.onTerminate(); } @@ -69,24 +67,21 @@ public class cgeoapplication extends Application { final Resources res = this.getResources(); final ProgressDialog dialog = ProgressDialog.show(fromActivity, res.getString(R.string.init_dbmove_dbmove), res.getString(R.string.init_dbmove_running), true, false); final AtomicBoolean atomic = new AtomicBoolean(false); - Thread moveThread = new Thread() { - final Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - dialog.dismiss(); - boolean success = atomic.get(); - String message = success ? res.getString(R.string.init_dbmove_success) : res.getString(R.string.init_dbmove_failed); - ActivityMixin.helpDialog(fromActivity, res.getString(R.string.init_dbmove_dbmove), message); - } - }; - + new Thread() { @Override public void run() { - atomic.set(cgData.moveDatabase()); - handler.sendMessage(handler.obtainMessage()); + atomic.set(DataStore.moveDatabase()); + fromActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + dialog.dismiss(); + boolean success = atomic.get(); + String message = success ? res.getString(R.string.init_dbmove_success) : res.getString(R.string.init_dbmove_failed); + ActivityMixin.helpDialog(fromActivity, res.getString(R.string.init_dbmove_dbmove), message); + } + }); } - }; - moveThread.start(); + }.start(); } /** diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java index 002f00e..b7bed7d 100644 --- a/main/src/cgeo/geocaching/CompassActivity.java +++ b/main/src/cgeo/geocaching/CompassActivity.java @@ -134,7 +134,7 @@ public class CompassActivity extends AbstractActivity { setCacheInfo(); // Force a refresh of location and direction when data is available. - final cgeoapplication app = cgeoapplication.getInstance(); + final CgeoApplication app = CgeoApplication.getInstance(); final IGeoData geo = app.currentGeo(); if (geo != null) { geoDirHandler.update(geo); @@ -282,7 +282,7 @@ public class CompassActivity extends AbstractActivity { if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h updateNorthHeading(geo.getBearing()); } - } catch (Exception e) { + } catch (RuntimeException e) { Log.w("Failed to LocationUpdater location."); } } diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/DataStore.java index 9d636f9..7c19a83 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/DataStore.java @@ -13,13 +13,17 @@ import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.list.AbstractList; +import cgeo.geocaching.list.PseudoList; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.FileUtils; import cgeo.geocaching.utils.Log; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; import android.content.ContentValues; import android.content.Context; @@ -51,9 +55,9 @@ import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; -public class cgData { +public class DataStore { - private cgData() { + private DataStore() { // utility class } @@ -293,10 +297,10 @@ public class cgData { } try { - final DbHelper dbHelper = new DbHelper(new DBContext(cgeoapplication.getInstance())); + final DbHelper dbHelper = new DbHelper(new DBContext(CgeoApplication.getInstance())); database = dbHelper.getWritableDatabase(); } catch (Exception e) { - Log.e("cgData.init: unable to open database for R/W", e); + Log.e("DataStore.init: unable to open database for R/W", e); } } @@ -756,7 +760,7 @@ public class cgData { // to NPE traces. final int staleHistorySearches = db.delete(dbTableSearchDestionationHistory, "date is null", null); if (staleHistorySearches > 0) { - Log.w(String.format(Locale.getDefault(), "cgData.dbHelper.onOpen: removed %d bad search history entries", staleHistorySearches)); + Log.w(String.format(Locale.getDefault(), "DataStore.dbHelper.onOpen: removed %d bad search history entries", staleHistorySearches)); } } @@ -859,7 +863,7 @@ public class cgData { return getFirstColumn(cursor); } catch (final Exception e) { - Log.e("cgData.allDetailedThere", e); + Log.e("DataStore.allDetailedThere", e); return new String[0]; } } @@ -906,7 +910,7 @@ public class cgData { cursor.close(); } catch (final Exception e) { - Log.e("cgData.isThere", e); + Log.e("DataStore.isThere", e); } if (detailed && dataDetailed == 0) { @@ -953,7 +957,7 @@ public class cgData { } catch (SQLiteDoneException e) { // Do nothing, it only means we have no information on the cache } catch (Exception e) { - Log.e("cgData.isOffline", e); + Log.e("DataStore.isOffline", e); } return false; @@ -974,7 +978,7 @@ public class cgData { } catch (SQLiteDoneException e) { // Do nothing, it only means we have no information on the cache } catch (Exception e) { - Log.e("cgData.getGeocodeForGuid", e); + Log.e("DataStore.getGeocodeForGuid", e); } return null; @@ -995,7 +999,7 @@ public class cgData { } catch (SQLiteDoneException e) { // Do nothing, it only means we have no information on the cache } catch (Exception e) { - Log.e("cgData.getCacheidForGeocode", e); + Log.e("DataStore.getCacheidForGeocode", e); } return null; @@ -1496,7 +1500,7 @@ public class cgData { } if (remaining.size() >= 1) { - Log.d("cgData.loadCaches(" + remaining.toString() + ") returned no results"); + Log.d("DataStore.loadCaches(" + remaining.toString() + ") returned no results"); } return result; } @@ -1527,7 +1531,7 @@ public class cgData { } query.append(" WHERE ").append(dbTableCaches).append('.'); - query.append(cgData.whereGeocodeIn(geocodes)); + query.append(DataStore.whereGeocodeIn(geocodes)); Cursor cursor = database.rawQuery(query.toString(), null); try { @@ -1535,7 +1539,7 @@ public class cgData { int logIndex = -1; while (cursor.moveToNext()) { - Geocache cache = cgData.createCacheFromDatabaseContent(cursor); + Geocache cache = DataStore.createCacheFromDatabaseContent(cursor); if (loadFlags.contains(LoadFlag.LOAD_ATTRIBUTES)) { cache.setAttributes(loadAttributes(cache.getGeocode())); @@ -1716,7 +1720,7 @@ public class cgData { null, "1"); - Log.d("cgData.loadWaypoint(" + id + ")"); + Log.d("DataStore.loadWaypoint(" + id + ")"); final Waypoint waypoint = cursor.moveToFirst() ? createWaypointFromDatabaseContent(cursor) : null; @@ -2018,7 +2022,7 @@ public class cgData { reasonIndex = 1; } String listKey; - if (list == StoredList.ALL_LIST_ID) { + if (list == PseudoList.ALL_LIST.id) { sql.append(" and reason > 0"); listKey = "all_list"; } else { @@ -2032,12 +2036,12 @@ public class cgData { if (cacheType != CacheType.ALL) { compiledStmnt.bindString(1, cacheType.id); } - if (list != StoredList.ALL_LIST_ID) { + if (list != PseudoList.ALL_LIST.id) { compiledStmnt.bindLong(reasonIndex, list); } return (int) compiledStmnt.simpleQueryForLong(); } catch (Exception e) { - Log.e("cgData.loadAllStoredCachesCount", e); + Log.e("DataStore.loadAllStoredCachesCount", e); } return 0; @@ -2049,7 +2053,7 @@ public class cgData { try { return (int) PreparedStatements.getCountHistoryCaches().simpleQueryForLong(); } catch (Exception e) { - Log.e("cgData.getAllHistoricCachesCount", e); + Log.e("DataStore.getAllHistoricCachesCount", e); } return 0; @@ -2075,7 +2079,7 @@ public class cgData { final StringBuilder selection = new StringBuilder(); selection.append("reason "); - selection.append(listId != StoredList.ALL_LIST_ID ? "=" + Math.max(listId, 1) : ">= " + StoredList.STANDARD_LIST_ID); + selection.append(listId != PseudoList.ALL_LIST.id ? "=" + Math.max(listId, 1) : ">= " + StoredList.STANDARD_LIST_ID); selection.append(" and detailed = 1 "); String[] selectionArgs = null; @@ -2114,7 +2118,7 @@ public class cgData { cursor.close(); } catch (final Exception e) { - Log.e("cgData.loadBatchOfStoredGeocodes", e); + Log.e("DataStore.loadBatchOfStoredGeocodes", e); } return geocodes; @@ -2151,7 +2155,7 @@ public class cgData { } cursor.close(); } catch (Exception e) { - Log.e("cgData.loadBatchOfHistoricGeocodes", e); + Log.e("DataStore.loadBatchOfHistoricGeocodes", e); } return geocodes; @@ -2221,7 +2225,7 @@ public class cgData { cursor.close(); } catch (final Exception e) { - Log.e("cgData.loadInViewport", e); + Log.e("DataStore.loadInViewport", e); } return new SearchResult(geocodes); @@ -2285,7 +2289,7 @@ public class cgData { removeCaches(geocodes, LoadFlags.REMOVE_ALL); } } catch (final Exception e) { - Log.w("cgData.clean", e); + Log.w("DataStore.clean", e); } Log.d("Database clean: finished"); @@ -2356,11 +2360,11 @@ public class cgData { public static boolean saveLogOffline(String geocode, Date date, LogType type, String log) { if (StringUtils.isBlank(geocode)) { - Log.e("cgData.saveLogOffline: cannot log a blank geocode"); + Log.e("DataStore.saveLogOffline: cannot log a blank geocode"); return false; } if (LogType.UNKNOWN == type && StringUtils.isBlank(log)) { - Log.e("cgData.saveLogOffline: cannot log an unknown log type and no message"); + Log.e("DataStore.saveLogOffline: cannot log an unknown log type and no message"); return false; } @@ -2451,7 +2455,7 @@ public class cgData { return logCount.simpleQueryForLong() > 0; } } catch (Exception e) { - Log.e("cgData.hasLogOffline", e); + Log.e("DataStore.hasLogOffline", e); } return false; @@ -2479,10 +2483,11 @@ public class cgData { } } + @NonNull public static List<StoredList> getLists() { init(); - final Resources res = cgeoapplication.getInstance().getResources(); + final Resources res = CgeoApplication.getInstance().getResources(); final List<StoredList> lists = new ArrayList<StoredList>(); lists.add(new StoredList(StoredList.STANDARD_LIST_ID, res.getString(R.string.list_inbox), (int) PreparedStatements.getCountCachesOnStandardList().simpleQueryForLong())); @@ -2498,7 +2503,7 @@ public class cgData { lists.addAll(storedLists); cursor.close(); } catch (final Exception e) { - Log.e("cgData.readLists", e); + Log.e("DataStore.readLists", e); } return lists; } @@ -2534,9 +2539,9 @@ public class cgData { } } - Resources res = cgeoapplication.getInstance().getResources(); - if (id == StoredList.ALL_LIST_ID) { - return new StoredList(StoredList.ALL_LIST_ID, res.getString(R.string.list_all_lists), getAllCachesCount()); + Resources res = CgeoApplication.getInstance().getResources(); + if (id == PseudoList.ALL_LIST.id) { + return new StoredList(PseudoList.ALL_LIST.id, res.getString(R.string.list_all_lists), getAllCachesCount()); } // fall back to standard list in case of invalid list id @@ -2651,7 +2656,11 @@ public class cgData { } public static void moveToList(final List<Geocache> caches, final int listId) { - if (listId == StoredList.ALL_LIST_ID) { + final AbstractList list = AbstractList.getListById(listId); + if (list == null) { + return; + } + if (!list.isConcrete()) { return; } if (caches.isEmpty()) { @@ -2738,7 +2747,7 @@ public class cgData { } catch (SQLiteDoneException e) { // Do nothing, it only means we have no information on the cache } catch (Exception e) { - Log.e("cgData.getCacheDescription", e); + Log.e("DataStore.getCacheDescription", e); } return partial; @@ -2848,7 +2857,7 @@ public class cgData { } public static boolean saveChangedCache(Geocache cache) { - return cgData.saveCache(cache, cache.getStorageLocation().contains(StorageLocation.DATABASE) ? LoadFlags.SAVE_ALL : EnumSet.of(SaveFlag.SAVE_CACHE)); + return DataStore.saveCache(cache, cache.getStorageLocation().contains(StorageLocation.DATABASE) ? LoadFlags.SAVE_ALL : EnumSet.of(SaveFlag.SAVE_CACHE)); } private static class PreparedStatements { @@ -2910,7 +2919,7 @@ public class cgData { } private static SQLiteStatement getLogCountOfGeocode() { - return getStatement("LogCountFromGeocode", "SELECT count(_id) FROM " + cgData.dbTableLogsOffline + " WHERE geocode = ?"); + return getStatement("LogCountFromGeocode", "SELECT count(_id) FROM " + DataStore.dbTableLogsOffline + " WHERE geocode = ?"); } private static SQLiteStatement getCountCachesOnStandardList() { @@ -2960,7 +2969,7 @@ public class cgData { return null; } - return cgData.getBounds(Collections.singleton(geocode)); + return DataStore.getBounds(Collections.singleton(geocode)); } public static void clearVisitDate(String[] selected) { @@ -2968,18 +2977,18 @@ public class cgData { } public static SearchResult getBatchOfStoredCaches(Geopoint coords, CacheType cacheType, int listId) { - final Set<String> geocodes = cgData.loadBatchOfStoredGeocodes(coords, cacheType, listId); - return new SearchResult(geocodes, cgData.getAllStoredCachesCount(cacheType, listId)); + final Set<String> geocodes = DataStore.loadBatchOfStoredGeocodes(coords, cacheType, listId); + return new SearchResult(geocodes, DataStore.getAllStoredCachesCount(cacheType, listId)); } public static SearchResult getHistoryOfCaches(boolean detailedOnly, CacheType cacheType) { - final Set<String> geocodes = cgData.loadBatchOfHistoricGeocodes(detailedOnly, cacheType); - return new SearchResult(geocodes, cgData.getAllHistoryCachesCount()); + final Set<String> geocodes = DataStore.loadBatchOfHistoricGeocodes(detailedOnly, cacheType); + return new SearchResult(geocodes, DataStore.getAllHistoryCachesCount()); } public static boolean saveWaypoint(int id, String geocode, Waypoint waypoint) { - if (cgData.saveWaypointInternal(id, geocode, waypoint)) { - cgData.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); + if (DataStore.saveWaypointInternal(id, geocode, waypoint)) { + DataStore.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); return true; } return false; @@ -2987,7 +2996,7 @@ public class cgData { public static Set<String> getCachedMissingFromSearch(final SearchResult searchResult, final Set<Tile> tiles, final IConnector connector, final int maxZoom) { - // get cached cgeocaches + // get cached CacheListActivity final Set<String> cachedGeocodes = new HashSet<String>(); for (Tile tile : tiles) { cachedGeocodes.addAll(cacheCache.getInViewport(tile.getViewport(), CacheType.ALL)); diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java index 56ee959..ad6d743 100644 --- a/main/src/cgeo/geocaching/EditWaypointActivity.java +++ b/main/src/cgeo/geocaching/EditWaypointActivity.java @@ -107,14 +107,14 @@ public class EditWaypointActivity extends AbstractActivity { note.setText(StringUtils.trimToEmpty(waypoint.getNote())); } } - final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY); + final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY); setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache); } if (own) { initializeWaypointTypeSelector(); } - } catch (Exception e) { + } catch (RuntimeException e) { Log.e("EditWaypointActivity.loadWaypointHandler", e); } finally { if (waitDialog != null) { @@ -168,7 +168,7 @@ public class EditWaypointActivity extends AbstractActivity { initializeWaypointTypeSelector(); if (geocode != null) { - final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache); } } @@ -259,7 +259,7 @@ public class EditWaypointActivity extends AbstractActivity { @Override public void run() { try { - waypoint = cgData.loadWaypoint(id); + waypoint = DataStore.loadWaypoint(id); loadWaypointHandler.sendMessage(Message.obtain()); } catch (Exception e) { @@ -278,7 +278,7 @@ public class EditWaypointActivity extends AbstractActivity { } catch (Geopoint.ParseException e) { // button text is blank when creating new waypoint } - Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); + Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); CoordinatesInputDialog coordsDialog = new CoordinatesInputDialog(EditWaypointActivity.this, cache, gp, app.currentGeo()); coordsDialog.setCancelable(true); coordsDialog.setOnCoordinateUpdate(new CoordinatesInputDialog.CoordinateUpdate() { @@ -416,14 +416,14 @@ public class EditWaypointActivity extends AbstractActivity { waypoint.setVisited(visited); waypoint.setId(id); - Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); + Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); 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)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); if (!StaticMapsProvider.hasAllStaticMapsForWaypoint(geocode, waypoint)) { StaticMapsProvider.removeWpStaticMaps(oldWaypoint, geocode); if (Settings.isStoreOfflineWpMaps()) { @@ -432,13 +432,13 @@ public class EditWaypointActivity extends AbstractActivity { } if (modifyLocal.isChecked() || modifyBoth.isChecked()) { if (!cache.hasUserModifiedCoords()) { - final Waypoint origWaypoint = new Waypoint(cgeoapplication.getInstance().getString(R.string.cache_coordinates_original), WaypointType.ORIGINAL, false); + final Waypoint origWaypoint = new Waypoint(CgeoApplication.getInstance().getString(R.string.cache_coordinates_original), WaypointType.ORIGINAL, false); origWaypoint.setCoords(cache.getCoords()); cache.addOrChangeWaypoint(origWaypoint, false); cache.setUserModifiedCoords(true); } cache.setCoords(waypoint.getCoords()); - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } if (modifyBoth.isChecked() && waypoint.getCoords() != null) { finishHandler.sendEmptyMessage(UPLOAD_START); diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index 96fbc06..912d1be 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -1,8 +1,7 @@ package cgeo.geocaching; -import cgeo.geocaching.cgData.StorageLocation; +import cgeo.geocaching.DataStore.StorageLocation; import cgeo.geocaching.activity.ActivityMixin; -import cgeo.geocaching.activity.IAbstractActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.ILoggingManager; @@ -22,6 +21,7 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.files.GPXParser; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.CancellableHandler; @@ -32,7 +32,9 @@ import cgeo.geocaching.utils.LogTemplateProvider.LogContext; import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.UncertainProperty; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -112,20 +114,20 @@ public class Geocache implements ICache, IWaypoint { private final List<String> attributes = new LazyInitializedList<String>() { @Override public List<String> call() { - return cgData.loadAttributes(geocode); + return DataStore.loadAttributes(geocode); } }; private final List<Waypoint> waypoints = new LazyInitializedList<Waypoint>() { @Override public List<Waypoint> call() { - return cgData.loadWaypoints(geocode); + return DataStore.loadWaypoints(geocode); } }; private List<Image> spoilers = null; private final List<LogEntry> logs = new LazyInitializedList<LogEntry>() { @Override public List<LogEntry> call() { - return cgData.loadLogs(geocode); + return DataStore.loadLogs(geocode); } }; private List<Trackable> inventory = null; @@ -447,16 +449,16 @@ public class Geocache implements ICache, IWaypoint { return cacheType.getValue().isEvent(); } - public void logVisit(final IAbstractActivity fromActivity) { + public void logVisit(final Activity fromActivity) { if (!getConnector().canLog(this)) { - fromActivity.showToast(((Activity) fromActivity).getResources().getString(R.string.err_cannot_log_visit)); + ActivityMixin.showToast(fromActivity, fromActivity.getResources().getString(R.string.err_cannot_log_visit)); return; } - final Intent logVisitIntent = new Intent((Activity) fromActivity, LogCacheActivity.class); + final Intent logVisitIntent = new Intent(fromActivity, LogCacheActivity.class); logVisitIntent.putExtra(LogCacheActivity.EXTRAS_ID, cacheId); logVisitIntent.putExtra(LogCacheActivity.EXTRAS_GEOCODE, geocode); - ((Activity) fromActivity).startActivity(logVisitIntent); + fromActivity.startActivity(logVisitIntent); } public void logOffline(final Activity fromActivity, final LogType logType) { @@ -469,12 +471,12 @@ public class Geocache implements ICache, IWaypoint { if (logType == LogType.UNKNOWN) { return; } - final boolean status = cgData.saveLogOffline(geocode, date.getTime(), logType, log); + final boolean status = DataStore.saveLogOffline(geocode, date.getTime(), logType, log); final Resources res = fromActivity.getResources(); if (status) { ActivityMixin.showToast(fromActivity, res.getString(R.string.info_log_saved)); - cgData.saveVisitDate(geocode); + DataStore.saveVisitDate(geocode); logOffline = Boolean.TRUE; notifyChange(); @@ -484,7 +486,7 @@ public class Geocache implements ICache, IWaypoint { } public void clearOfflineLog() { - cgData.clearLogOffline(geocode); + DataStore.clearLogOffline(geocode); notifyChange(); } @@ -568,7 +570,7 @@ public class Geocache implements ICache, IWaypoint { return getConnector().supportsOwnCoordinates(); } - public ILoggingManager getLoggingManager(Activity activity) { + public ILoggingManager getLoggingManager(final LogCacheActivity activity) { return getConnector().getLoggingManager(activity, this); } @@ -602,21 +604,21 @@ public class Geocache implements ICache, IWaypoint { @Override public boolean isArchived() { - return (archived != null && archived.booleanValue()); + return BooleanUtils.isTrue(archived); } @Override public boolean isDisabled() { - return (disabled != null && disabled.booleanValue()); + return BooleanUtils.isTrue(disabled); } @Override public boolean isPremiumMembersOnly() { - return (premiumMembersOnly != null && premiumMembersOnly.booleanValue()); + return BooleanUtils.isTrue(premiumMembersOnly); } public void setPremiumMembersOnly(boolean members) { - this.premiumMembersOnly = Boolean.valueOf(members); + this.premiumMembersOnly = members; } @Override @@ -664,7 +666,7 @@ public class Geocache implements ICache, IWaypoint { */ private void initializeCacheTexts() { if (description == null || shortdesc == null || hint == null || location == null) { - final Geocache partial = cgData.loadCacheTexts(this.getGeocode()); + final Geocache partial = DataStore.loadCacheTexts(this.getGeocode()); if (description == null) { setDescription(partial.getDescription()); } @@ -767,16 +769,16 @@ public class Geocache implements ICache, IWaypoint { @Override public boolean isFound() { - return (found != null && found.booleanValue()); + return BooleanUtils.isTrue(found); } @Override public boolean isFavorite() { - return (favorite != null && favorite.booleanValue()); + return BooleanUtils.isTrue(favorite); } public void setFavorite(boolean favorite) { - this.favorite = Boolean.valueOf(favorite); + this.favorite = favorite; } @Override @@ -990,11 +992,11 @@ public class Geocache implements ICache, IWaypoint { @Override public boolean isOnWatchlist() { - return (onWatchlist != null && onWatchlist.booleanValue()); + return BooleanUtils.isTrue(onWatchlist); } public void setOnWatchlist(boolean onWatchlist) { - this.onWatchlist = Boolean.valueOf(onWatchlist); + this.onWatchlist = onWatchlist; } /** @@ -1028,7 +1030,7 @@ public class Geocache implements ICache, IWaypoint { } } } - return saveToDatabase && cgData.saveWaypoints(this); + return saveToDatabase && DataStore.saveWaypoints(this); } /** @@ -1063,11 +1065,11 @@ public class Geocache implements ICache, IWaypoint { } public boolean isLogOffline() { - return (logOffline != null && logOffline.booleanValue()); + return BooleanUtils.isTrue(logOffline); } public void setLogOffline(boolean logOffline) { - this.logOffline = Boolean.valueOf(logOffline); + this.logOffline = logOffline; } public boolean isStatusChecked() { @@ -1140,15 +1142,15 @@ public class Geocache implements ICache, IWaypoint { } public void setDisabled(boolean disabled) { - this.disabled = Boolean.valueOf(disabled); + this.disabled = disabled; } public void setArchived(boolean archived) { - this.archived = Boolean.valueOf(archived); + this.archived = archived; } public void setFound(boolean found) { - this.found = Boolean.valueOf(found); + this.found = found; } public void setAttributes(List<String> attributes) { @@ -1244,7 +1246,7 @@ public class Geocache implements ICache, IWaypoint { // when waypoint was edited, finalDefined may have changed resetFinalDefined(); } - return saveToDatabase && cgData.saveWaypoint(waypoint.getId(), geocode, waypoint); + return saveToDatabase && DataStore.saveWaypoint(waypoint.getId(), geocode, waypoint); } public boolean hasWaypoints() { @@ -1295,9 +1297,9 @@ public class Geocache implements ICache, IWaypoint { final int index = getWaypointIndex(original); final Waypoint copy = new Waypoint(original); copy.setUserDefined(); - copy.setName(cgeoapplication.getInstance().getString(R.string.waypoint_copy_of) + " " + copy.getName()); + copy.setName(CgeoApplication.getInstance().getString(R.string.waypoint_copy_of) + " " + copy.getName()); waypoints.add(index + 1, copy); - return cgData.saveWaypoint(-1, geocode, copy); + return DataStore.saveWaypoint(-1, geocode, copy); } /** @@ -1317,8 +1319,8 @@ public class Geocache implements ICache, IWaypoint { if (waypoint.isUserDefined()) { final int index = getWaypointIndex(waypoint); waypoints.remove(index); - cgData.deleteWaypoint(waypoint.getId()); - cgData.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); + DataStore.deleteWaypoint(waypoint.getId()); + DataStore.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); // Check status if Final is defined if (waypoint.isFinalWithCoords()) { resetFinalDefined(); @@ -1337,8 +1339,8 @@ public class Geocache implements ICache, IWaypoint { public void deleteWaypointForce(Waypoint waypoint) { final int index = getWaypointIndex(waypoint); waypoints.remove(index); - cgData.deleteWaypoint(waypoint.getId()); - cgData.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); + DataStore.deleteWaypoint(waypoint.getId()); + DataStore.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); resetFinalDefined(); } @@ -1406,7 +1408,7 @@ public class Geocache implements ICache, IWaypoint { if (point.getLatitudeE6() != 0 && point.getLongitudeE6() != 0 && ((point.getLatitudeE6() % 1000) != 0 || (point.getLongitudeE6() % 1000) != 0) && !hasIdenticalWaypoint(point)) { - final String name = cgeoapplication.getInstance().getString(R.string.cache_personal_note) + " " + count; + final String name = CgeoApplication.getInstance().getString(R.string.cache_personal_note) + " " + count; final String potentialWaypointType = note.substring(Math.max(0, matcher.start() - 15)); final Waypoint waypoint = new Waypoint(name, parseWaypointType(potentialWaypointType), false); waypoint.setCoords(point); @@ -1511,8 +1513,8 @@ public class Geocache implements ICache, IWaypoint { public void drop(Handler handler) { try { - cgData.markDropped(Collections.singletonList(this)); - cgData.removeCache(getGeocode(), EnumSet.of(RemoveFlag.REMOVE_CACHE)); + DataStore.markDropped(Collections.singletonList(this)); + DataStore.removeCache(getGeocode(), EnumSet.of(RemoveFlag.REMOVE_CACHE)); handler.sendMessage(Message.obtain()); } catch (final Exception e) { @@ -1563,7 +1565,7 @@ public class Geocache implements ICache, IWaypoint { } public void refresh(int newListId, CancellableHandler handler) { - cgData.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); + DataStore.removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE)); storeCache(null, geocode, newListId, true, handler); } @@ -1639,7 +1641,7 @@ public class Geocache implements ICache, IWaypoint { } cache.setListId(listId); - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); if (CancellableHandler.isCancelled(handler)) { return; @@ -1661,9 +1663,9 @@ public class Geocache implements ICache, IWaypoint { return null; } - if (!forceReload && listId == StoredList.TEMPORARY_LIST_ID && (cgData.isOffline(geocode, guid) || cgData.isThere(geocode, guid, true, true))) { + if (!forceReload && listId == StoredList.TEMPORARY_LIST_ID && (DataStore.isOffline(geocode, guid) || DataStore.isThere(geocode, guid, true, true))) { final SearchResult search = new SearchResult(); - final String realGeocode = StringUtils.isNotBlank(geocode) ? geocode : cgData.getGeocodeForGuid(guid); + final String realGeocode = StringUtils.isNotBlank(geocode) ? geocode : DataStore.getGeocodeForGuid(guid); search.addGeocode(realGeocode); return search; } @@ -1708,7 +1710,7 @@ public class Geocache implements ICache, IWaypoint { } } // 12 o'clock - final String hourLocalized = cgeoapplication.getInstance().getString(R.string.cache_time_full_hours); + final String hourLocalized = CgeoApplication.getInstance().getString(R.string.cache_time_full_hours); if (StringUtils.isNotBlank(hourLocalized)) { final Pattern fullHours = Pattern.compile("\\b(\\d{1,2})\\s+" + Pattern.quote(hourLocalized), Pattern.CASE_INSENSITIVE); final MatcherWrapper matcherHours = new MatcherWrapper(fullHours, getDescription()); @@ -1735,7 +1737,7 @@ public class Geocache implements ICache, IWaypoint { * @return */ public boolean hasAttribute(CacheAttribute attribute, boolean yes) { - Geocache fullCache = cgData.loadCache(getGeocode(), EnumSet.of(LoadFlag.LOAD_ATTRIBUTES)); + Geocache fullCache = DataStore.loadCache(getGeocode(), EnumSet.of(LoadFlag.LOAD_ATTRIBUTES)); if (fullCache == null) { fullCache = this; } @@ -1746,6 +1748,13 @@ public class Geocache implements ICache, IWaypoint { return StaticMapsProvider.hasStaticMap(this); } + public static final Predicate<Geocache> hasStaticMap = new Predicate<Geocache>() { + @Override + public boolean evaluate(final Geocache cache) { + return cache.hasStaticMap(); + } + }; + public List<Image> getImages() { final List<Image> result = new ArrayList<Image>(); result.addAll(getSpoilers()); diff --git a/main/src/cgeo/geocaching/GpxFileListActivity.java b/main/src/cgeo/geocaching/GpxFileListActivity.java index 8b10d5b..dae52c4 100644 --- a/main/src/cgeo/geocaching/GpxFileListActivity.java +++ b/main/src/cgeo/geocaching/GpxFileListActivity.java @@ -4,6 +4,7 @@ import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.files.AbstractFileListActivity;
import cgeo.geocaching.files.GPXImporter;
+import cgeo.geocaching.list.StoredList;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.GPXListAdapter;
diff --git a/main/src/cgeo/geocaching/ImageSelectActivity.java b/main/src/cgeo/geocaching/ImageSelectActivity.java index e24c34a..790741f 100644 --- a/main/src/cgeo/geocaching/ImageSelectActivity.java +++ b/main/src/cgeo/geocaching/ImageSelectActivity.java @@ -9,6 +9,8 @@ import cgeo.geocaching.utils.ImageUtils; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import android.content.Intent; import android.database.Cursor; @@ -263,7 +265,8 @@ public class ImageSelectActivity extends AbstractActivity { * @param filePath * @return the scaled image path, or <tt>null</tt> if the image cannot be decoded */ - private String writeScaledImage(final String filePath) { + @Nullable + private String writeScaledImage(@NonNull final String filePath) { scaleChoiceIndex = scaleView.getSelectedItemPosition(); final int maxXY = getResources().getIntArray(R.array.log_image_scale_values)[scaleChoiceIndex]; return ImageUtils.readScaleAndWriteImage(filePath, maxXY); diff --git a/main/src/cgeo/geocaching/ImagesActivity.java b/main/src/cgeo/geocaching/ImagesActivity.java index 0b80d53..29bc8c7 100644 --- a/main/src/cgeo/geocaching/ImagesActivity.java +++ b/main/src/cgeo/geocaching/ImagesActivity.java @@ -5,7 +5,7 @@ import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.ImagesList; import cgeo.geocaching.ui.ImagesList.ImageType; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import android.content.Context; import android.content.Intent; @@ -58,7 +58,7 @@ public class ImagesActivity extends AbstractActivity { return; } - offline = cgData.isOffline(geocode, null) && (imgType == ImageType.SpoilerImages + offline = DataStore.isOffline(geocode, null) && (imgType == ImageType.SpoilerImages || Settings.isStoreLogImages()); } diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java index 78ec82d..9d8d053 100644 --- a/main/src/cgeo/geocaching/LogCacheActivity.java +++ b/main/src/cgeo/geocaching/LogCacheActivity.java @@ -19,7 +19,7 @@ import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.LogTemplateProvider; import cgeo.geocaching.utils.LogTemplateProvider.LogContext; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; @@ -47,7 +47,6 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.Locale; public class LogCacheActivity extends AbstractLoggingActivity implements DateDialog.DateDialogParent { static final String EXTRAS_GEOCODE = "geocode"; @@ -80,7 +79,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia private ILoggingManager loggingManager; // Data to be saved while reconfiguring - private double rating; + private float rating; private LogType typeSelected; private Calendar date; private String imageCaption; @@ -215,13 +214,13 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia if (!postButton.isEnabled()) { return res.getString(R.string.log_post_not_possible); } - if (!Settings.isGCvoteLogin() || !cache.supportsGCVote()) { + if (!GCVote.isVotingPossible(cache)) { return res.getString(R.string.log_post); } - if (rating == 0) { - return res.getString(R.string.log_post_no_rate); + if (GCVote.isValidRating(rating)) { + return res.getString(R.string.log_post_rate) + " " + GCVote.getRatingText(rating) + "*"; } - return res.getString(R.string.log_post_rate) + " " + ratingTextValue(rating) + "*"; + return res.getString(R.string.log_post_no_rate); } @Override @@ -236,13 +235,13 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia } if ((StringUtils.isBlank(cacheid)) && StringUtils.isNotBlank(geocode)) { - cacheid = cgData.getCacheidForGeocode(geocode); + cacheid = DataStore.getCacheidForGeocode(geocode); } if (StringUtils.isBlank(geocode) && StringUtils.isNotBlank(cacheid)) { - geocode = cgData.getGeocodeForGuid(cacheid); + geocode = DataStore.getGeocodeForGuid(cacheid); } - cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); possibleLogTypes = cache.getPossibleLogTypes(); if (StringUtils.isNotBlank(cache.getName())) { @@ -262,7 +261,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia // Restore previous state if (savedInstanceState != null) { - rating = savedInstanceState.getDouble(SAVED_STATE_RATING); + rating = savedInstanceState.getFloat(SAVED_STATE_RATING); typeSelected = LogType.getById(savedInstanceState.getInt(SAVED_STATE_TYPE)); date.setTimeInMillis(savedInstanceState.getLong(SAVED_STATE_DATE)); imageCaption = savedInstanceState.getString(SAVED_STATE_IMAGE_CAPTION); @@ -270,7 +269,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia imageUri = Uri.parse(savedInstanceState.getString(SAVED_STATE_IMAGE_URI)); } else { // If log had been previously saved, load it now, otherwise initialize signature as needed - final LogEntry log = cgData.loadLogOffline(geocode); + final LogEntry log = DataStore.loadLogOffline(geocode); if (log != null) { typeSelected = log.type; date.setTime(new Date(log.date)); @@ -342,7 +341,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia private void setDefaultValues() { date = Calendar.getInstance(); - rating = 0.0; + rating = GCVote.NO_RATING; if (cache.isEventCache()) { final Date eventDate = cache.getHiddenDate(); boolean expired = DateUtils.daysSince(eventDate.getTime()) >= 0; @@ -418,8 +417,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - final boolean voteAvailable = Settings.isGCvoteLogin() && StringUtils.isNotBlank(cache.getGuid()) && cache.supportsGCVote(); - menu.findItem(SUBMENU_VOTE).setVisible(voteAvailable); + menu.findItem(SUBMENU_VOTE).setVisible(GCVote.isVotingPossible(cache)); return true; } @@ -432,9 +430,9 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia final int id = item.getItemId(); if (id >= 10 && id <= 19) { - rating = (id - 9) / 2.0; - if (rating < 1) { - rating = 0; + rating = (id - 9) / 2.0f; + if (!GCVote.isValidRating(rating)) { + rating = GCVote.NO_RATING; } updatePostButtonText(); return true; @@ -443,10 +441,6 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia return false; } - private static String ratingTextValue(final double rating) { - return String.format(Locale.getDefault(), "%.1f", rating); - } - @Override protected void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); @@ -533,7 +527,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia final LogResult logResult = loggingManager.postLog(cache, typeSelected, date, log, logPwd, trackables); if (logResult.getPostLogResult() == StatusCode.NO_ERROR) { - final LogEntry logNow = new LogEntry(date, typeSelected, log); + final LogEntry logNow = new LogEntry(date.getTimeInMillis(), typeSelected, log); cache.getLogs().add(0, logNow); @@ -542,7 +536,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia cache.setVisitedDate(new Date().getTime()); } - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); cache.clearOfflineLog(); if (typeSelected == LogType.FOUND_IT) { @@ -550,7 +544,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia Twitter.postTweetCache(geocode); } } - if (rating > 0) { + if (GCVote.isValidRating(rating)) { GCVote.setRating(cache, rating); } @@ -559,14 +553,14 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia final String uploadedImageUrl = imageResult.getImageUri(); if (StringUtils.isNotEmpty(uploadedImageUrl)) { logNow.addLogImage(new Image(uploadedImageUrl, imageCaption, imageDescription)); - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return imageResult.getPostResult(); } } return logResult.getPostLogResult(); - } catch (Exception e) { + } catch (RuntimeException e) { Log.e("VisitCacheActivity.Poster.doInBackgroundInternal", e); } diff --git a/main/src/cgeo/geocaching/LogEntry.java b/main/src/cgeo/geocaching/LogEntry.java index 0121424..b922398 100644 --- a/main/src/cgeo/geocaching/LogEntry.java +++ b/main/src/cgeo/geocaching/LogEntry.java @@ -5,11 +5,10 @@ import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.DateUtils; import cgeo.geocaching.utils.MatcherWrapper; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.regex.Pattern; @@ -30,10 +29,6 @@ public final class LogEntry { public String cacheName = ""; // used for trackables public String cacheGuid = ""; // used for trackables - public LogEntry(final Calendar date, final LogType type, final String text) { - this(Settings.getUsername(), date.getTimeInMillis(), type, text); - } - public LogEntry(final long dateInMilliSeconds, final LogType type, final String text) { this(Settings.getUsername(), dateInMilliSeconds, type, text); } @@ -94,7 +89,7 @@ public final class LogEntry { } } if (titles.isEmpty()) { - titles.add(cgeoapplication.getInstance().getString(R.string.cache_log_image_default_title)); + titles.add(CgeoApplication.getInstance().getString(R.string.cache_log_image_default_title)); } return StringUtils.join(titles, ", "); } diff --git a/main/src/cgeo/geocaching/LogTrackableActivity.java b/main/src/cgeo/geocaching/LogTrackableActivity.java index a45d584..2761658 100644 --- a/main/src/cgeo/geocaching/LogTrackableActivity.java +++ b/main/src/cgeo/geocaching/LogTrackableActivity.java @@ -16,7 +16,7 @@ import cgeo.geocaching.ui.dialog.DateDialog; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.LogTemplateProvider.LogContext; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.Dialog; @@ -130,7 +130,7 @@ public class LogTrackableActivity extends AbstractLoggingActivity implements Dat } } - trackable = cgData.loadTrackable(geocode); + trackable = DataStore.loadTrackable(geocode); if (StringUtils.isNotBlank(trackable.getName())) { setTitle(res.getString(R.string.trackable_touch) + ": " + trackable.getName()); diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 0fd6759..8a79786 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -10,6 +10,7 @@ import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.settings.SettingsActivity; @@ -24,7 +25,7 @@ import cgeo.geocaching.utils.Version; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.AlertDialog; @@ -47,6 +48,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -141,7 +143,7 @@ public class MainActivity extends AbstractActivity { navLocation.setText(StringUtils.join(addressParts, ", ")); } - } catch (Exception e) { + } catch (RuntimeException e) { // nothing } @@ -283,7 +285,7 @@ public class MainActivity extends AbstractActivity { startActivity(new Intent(this, SettingsActivity.class)); return true; case R.id.menu_history: - cgeocaches.startActivityHistory(this); + CacheListActivity.startActivityHistory(this); return true; case R.id.menu_scan: startScannerApplication(); @@ -366,7 +368,7 @@ public class MainActivity extends AbstractActivity { @Override public void run(final Integer selectedListId) { Settings.saveLastList(selectedListId); - cgeocaches.startActivityOffline(MainActivity.this); + CacheListActivity.startActivityOffline(MainActivity.this); } }); return true; @@ -468,7 +470,7 @@ public class MainActivity extends AbstractActivity { } private void checkRestore() { - if (!cgData.isNewlyCreatedDatebase() || null == DatabaseBackupUtils.getRestoreFile()) { + if (!DataStore.isNewlyCreatedDatebase() || null == DatabaseBackupUtils.getRestoreFile()) { return; } new AlertDialog.Builder(this) @@ -479,7 +481,7 @@ public class MainActivity extends AbstractActivity { @Override public void onClick(final DialogInterface dialog, final int id) { dialog.dismiss(); - cgData.resetNewlyCreatedDatabase(); + DataStore.resetNewlyCreatedDatabase(); DatabaseBackupUtils.restoreDatabase(MainActivity.this); } }) @@ -487,7 +489,7 @@ public class MainActivity extends AbstractActivity { @Override public void onClick(final DialogInterface dialog, final int id) { dialog.cancel(); - cgData.resetNewlyCreatedDatabase(); + DataStore.resetNewlyCreatedDatabase(); } }) .create() @@ -542,7 +544,7 @@ public class MainActivity extends AbstractActivity { navAccuracy.setText(null); navLocation.setText(res.getString(R.string.loc_trying)); } - } catch (Exception e) { + } catch (RuntimeException e) { Log.w("Failed to update location."); } } @@ -567,7 +569,7 @@ public class MainActivity extends AbstractActivity { } nearestView.setPressed(true); - cgeocaches.startActivityNearest(this, app.currentGeo().getCoords()); + CacheListActivity.startActivityNearest(this, app.currentGeo().getCoords()); } /** @@ -576,7 +578,7 @@ public class MainActivity extends AbstractActivity { */ public void cgeoFindByOffline(final View v) { findByOffline.setPressed(true); - cgeocaches.startActivityOffline(this); + CacheListActivity.startActivityOffline(this); } /** @@ -640,7 +642,7 @@ public class MainActivity extends AbstractActivity { } int checks = 0; - while (!cgData.isInitialized()) { + while (!DataStore.isInitialized()) { try { wait(500); checks++; @@ -653,7 +655,7 @@ public class MainActivity extends AbstractActivity { } } - countBubbleCnt = cgData.getAllCachesCount(); + countBubbleCnt = DataStore.getAllCachesCount(); countBubbleHandler.sendEmptyMessage(0); } @@ -678,7 +680,7 @@ public class MainActivity extends AbstractActivity { } cleanupRunning = true; - cgData.clean(more); + DataStore.clean(more); cleanupRunning = false; if (version > 0) { @@ -721,7 +723,7 @@ public class MainActivity extends AbstractActivity { final Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault()); final Geopoint coords = app.currentGeo().getCoords(); addresses = geocoder.getFromLocation(coords.getLatitude(), coords.getLongitude(), 1); - } catch (Exception e) { + } catch (IOException e) { Log.i("Failed to obtain address"); } diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java index 741414b..ddafb51 100644 --- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java +++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java @@ -214,7 +214,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { private List<Destination> getHistoryOfSearchedLocations() { if (historyOfSearchedLocations == null) { // Load from database - historyOfSearchedLocations = cgData.loadHistoryOfSearchedLocations(); + historyOfSearchedLocations = DataStore.loadHistoryOfSearchedLocations(); } return historyOfSearchedLocations; @@ -331,7 +331,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { menu.findItem(R.id.menu_caches_around).setVisible(visible); menu.findItem(R.id.menu_clear_history).setEnabled(!getHistoryOfSearchedLocations().isEmpty()); - } catch (Exception e) { + } catch (RuntimeException e) { // nothing } @@ -377,7 +377,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { getHistoryOfSearchedLocations().add(0, loc); // Save location - cgData.saveSearchedDestination(loc); + DataStore.saveSearchedDestination(loc); // Ensure to remove the footer historyListView.removeFooterView(getEmptyHistoryFooter()); @@ -396,7 +396,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { getHistoryOfSearchedLocations().remove(destination); // Save - cgData.removeSearchedDestination(destination); + DataStore.removeSearchedDestination(destination); if (getHistoryOfSearchedLocations().isEmpty()) { if (historyListView.getFooterViewsCount() == 0) { @@ -415,7 +415,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { getHistoryOfSearchedLocations().clear(); // Save - cgData.clearSearchedDestinations(); + DataStore.clearSearchedDestinations(); if (historyListView.getFooterViewsCount() == 0) { historyListView.addFooterView(getEmptyHistoryFooter()); @@ -443,7 +443,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { return; } - cgeocaches.startActivityCoordinates(this, coords); + CacheListActivity.startActivityCoordinates(this, coords); finish(); } @@ -454,7 +454,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { try { latButton.setHint(geo.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE_RAW)); lonButton.setHint(geo.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE_RAW)); - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.w("Failed to update location."); } } diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java index 57b391f..c6c13cf 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -142,7 +142,7 @@ public class SearchActivity extends AbstractActivity { } if (keywordSearch) { // keyword fallback, if desired by caller - cgeocaches.startActivityKeyword(this, query.trim()); + CacheListActivity.startActivityKeyword(this, query.trim()); return true; } @@ -171,7 +171,7 @@ public class SearchActivity extends AbstractActivity { findByGeocodeFn(); } }); - addHistoryEntries(geocodeEdit, cgData.getRecentGeocodesForSearch()); + addHistoryEntries(geocodeEdit, DataStore.getRecentGeocodesForSearch()); displayByGeocode.setOnClickListener(new FindByGeocodeListener()); EditUtils.setActionListener((EditText) findViewById(R.id.keyword), new Runnable() { @@ -214,7 +214,7 @@ public class SearchActivity extends AbstractActivity { findTrackableFn(); } }); - addHistoryEntries(trackable, cgData.getTrackableCodes()); + addHistoryEntries(trackable, DataStore.getTrackableCodes()); disableSuggestions(trackable); displayTrackable.setOnClickListener(new FindTrackableListener()); } @@ -238,7 +238,7 @@ public class SearchActivity extends AbstractActivity { lonEdit.setHint(geo.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE_RAW)); } } - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.w("Failed to update location."); } } @@ -281,7 +281,7 @@ public class SearchActivity extends AbstractActivity { } } else { try { - cgeocaches.startActivityCoordinates(this, new Geopoint(StringUtils.trim(latText), StringUtils.trim(lonText))); + CacheListActivity.startActivityCoordinates(this, new Geopoint(StringUtils.trim(latText), StringUtils.trim(lonText))); } catch (final Geopoint.ParseException e) { showToast(res.getString(e.resource)); } @@ -305,7 +305,7 @@ public class SearchActivity extends AbstractActivity { return; } - cgeocaches.startActivityKeyword(this, StringUtils.trim(keyText)); + CacheListActivity.startActivityKeyword(this, StringUtils.trim(keyText)); } private class FindByAddressListener implements View.OnClickListener { @@ -344,7 +344,7 @@ public class SearchActivity extends AbstractActivity { return; } - cgeocaches.startActivityUserName(this, StringUtils.trim(usernameText)); + CacheListActivity.startActivityUserName(this, StringUtils.trim(usernameText)); } private void findByOwnerFn() { @@ -359,7 +359,7 @@ public class SearchActivity extends AbstractActivity { return; } - cgeocaches.startActivityOwner(this, StringUtils.trim(usernameText)); + CacheListActivity.startActivityOwner(this, StringUtils.trim(usernameText)); } private class FindByGeocodeListener implements View.OnClickListener { diff --git a/main/src/cgeo/geocaching/SearchResult.java b/main/src/cgeo/geocaching/SearchResult.java index e637d1f..0bdf6c6 100644 --- a/main/src/cgeo/geocaching/SearchResult.java +++ b/main/src/cgeo/geocaching/SearchResult.java @@ -8,7 +8,7 @@ import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.gcvote.GCVote; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.os.Parcel; @@ -199,7 +199,7 @@ public class SearchResult implements Parcelable { SearchResult result = new SearchResult(this); result.geocodes.clear(); final ArrayList<Geocache> cachesForVote = new ArrayList<Geocache>(); - final Set<Geocache> caches = cgData.loadCaches(geocodes, LoadFlags.LOAD_CACHE_OR_DB); + final Set<Geocache> caches = DataStore.loadCaches(geocodes, LoadFlags.LOAD_CACHE_OR_DB); int excluded = 0; for (Geocache cache : caches) { // Is there any reason to exclude the cache from the list? @@ -220,11 +220,11 @@ public class SearchResult implements Parcelable { } public Geocache getFirstCacheFromResult(final EnumSet<LoadFlag> loadFlags) { - return CollectionUtils.isNotEmpty(geocodes) ? cgData.loadCache(geocodes.iterator().next(), loadFlags) : null; + return CollectionUtils.isNotEmpty(geocodes) ? DataStore.loadCache(geocodes.iterator().next(), loadFlags) : null; } public Set<Geocache> getCachesFromSearchResult(final EnumSet<LoadFlag> loadFlags) { - return cgData.loadCaches(geocodes, loadFlags); + return DataStore.loadCaches(geocodes, loadFlags); } /** Add the geocode to the search. No cache is loaded into the CacheCache */ @@ -243,7 +243,7 @@ public class SearchResult implements Parcelable { /** Add the cache geocode to the search and store the cache in the CacheCache */ public boolean addAndPutInCache(final Geocache cache) { addGeocode(cache.getGeocode()); - return cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_CACHE)); + return DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_CACHE)); } public boolean isEmpty() { @@ -252,7 +252,7 @@ public class SearchResult implements Parcelable { public boolean hasUnsavedCaches() { for (final String geocode : getGeocodes()) { - if (!cgData.isOffline(geocode, null)) { + if (!DataStore.isOffline(geocode, null)) { return true; } } diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java index 2268df9..7811da5 100644 --- a/main/src/cgeo/geocaching/StaticMapsActivity.java +++ b/main/src/cgeo/geocaching/StaticMapsActivity.java @@ -9,7 +9,7 @@ import com.googlecode.androidannotations.annotations.Extra; import com.googlecode.androidannotations.annotations.OptionsItem; import com.googlecode.androidannotations.annotations.OptionsMenu; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import android.app.ProgressDialog; import android.content.Context; @@ -117,7 +117,7 @@ public class StaticMapsActivity extends AbstractActivity { for (int level = 1; level <= StaticMapsProvider.MAPS_LEVEL_MAX; level++) { try { if (waypointId != null) { - final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, cache.getWaypointById(waypointId), level); if (image != null) { maps.add(image); @@ -151,7 +151,7 @@ public class StaticMapsActivity extends AbstractActivity { } private boolean downloadStaticMaps() { - final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); if (waypointId == null) { showToast(res.getString(R.string.info_storing_static_maps)); StaticMapsProvider.storeCacheStaticMap(cache, true); diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java index eb59bcb..d5cbb13 100644 --- a/main/src/cgeo/geocaching/StaticMapsProvider.java +++ b/main/src/cgeo/geocaching/StaticMapsProvider.java @@ -11,16 +11,12 @@ 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; -import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Point; -import android.util.DisplayMetrics; -import android.view.Display; -import android.view.WindowManager; import java.io.File; import java.util.concurrent.TimeUnit; @@ -41,6 +37,11 @@ public final class StaticMapsProvider { /** ThreadPool restricting this to 1 Thread. **/ private static final BlockingThreadPool POOL = new BlockingThreadPool(1, Thread.MIN_PRIORITY); + /** + * max size in free API version: https://developers.google.com/maps/documentation/staticmaps/#Imagesizes + */ + private static final int GOOGLE_MAPS_MAX_SIZE = 640; + private StaticMapsProvider() { // utility class } @@ -61,7 +62,7 @@ public final class StaticMapsProvider { final Parameters params = new Parameters( "center", latlonMap, "zoom", String.valueOf(zoom), - "size", String.valueOf(width) + 'x' + String.valueOf(height), + "size", String.valueOf(limitSize(width)) + 'x' + String.valueOf(limitSize(height)), "maptype", mapType, "markers", "icon:" + markerUrl + '|' + shadow + latlonMap, "sensor", "false"); @@ -88,6 +89,10 @@ public final class StaticMapsProvider { } } + private static int limitSize(final int imageSize) { + return Math.min(imageSize, GOOGLE_MAPS_MAX_SIZE); + } + public static void downloadMaps(final Geocache cache) { if ((!Settings.isStoreOfflineMaps() && !Settings.isStoreOfflineWpMaps()) || StringUtils.isBlank(cache.getGeocode())) { return; @@ -172,13 +177,10 @@ public final class StaticMapsProvider { public static void storeCachePreviewMap(final Geocache cache) { final String latlonMap = cache.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA); - final Display display = ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); - DisplayMetrics metrics = new DisplayMetrics(); - display.getMetrics(metrics); - final int width = metrics.widthPixels; - final int height = (int) (110 * metrics.density); + final Point displaySize = Compatibility.getDisplaySize(); + final int minSize = Math.min(displaySize.x, displaySize.y); final String markerUrl = MARKERS_URL + "my_location_mdpi.png"; - downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, PREFIX_PREVIEW, "shadow:false|", latlonMap, width, height, null); + downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, PREFIX_PREVIEW, "shadow:false|", latlonMap, minSize, minSize, null); } private static int guessMaxDisplaySide() { @@ -243,11 +245,8 @@ public final class StaticMapsProvider { * @param cache * @return <code>true</code> if at least one map file exists; <code>false</code> otherwise */ - public static boolean hasStaticMap(final Geocache cache) { - if (cache == null) { - return false; - } - final String geocode = cache.getGeocode(); + public static boolean hasStaticMap(@NonNull final Geocache cache) { + final String geocode = cache.getGeocode(); if (StringUtils.isBlank(geocode)) { return false; } diff --git a/main/src/cgeo/geocaching/StatusFragment.java b/main/src/cgeo/geocaching/StatusFragment.java index e0e714a..4f70f0e 100644 --- a/main/src/cgeo/geocaching/StatusFragment.java +++ b/main/src/cgeo/geocaching/StatusFragment.java @@ -38,12 +38,12 @@ public class StatusFragment extends Fragment { @Override public void onResume() { super.onResume(); - cgeoapplication.getInstance().getStatusUpdater().addObserver(statusHandler); + CgeoApplication.getInstance().getStatusUpdater().addObserver(statusHandler); } @Override public void onPause() { - cgeoapplication.getInstance().getStatusUpdater().deleteObserver(statusHandler); + CgeoApplication.getInstance().getStatusUpdater().deleteObserver(statusHandler); super.onPause(); } diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java index a257b8e..a713093 100644 --- a/main/src/cgeo/geocaching/TrackableActivity.java +++ b/main/src/cgeo/geocaching/TrackableActivity.java @@ -234,7 +234,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi @Override public void run() { if (StringUtils.isNotEmpty(geocode)) { - trackable = cgData.loadTrackable(geocode); + trackable = DataStore.loadTrackable(geocode); if (trackable == null || trackable.isLoggable()) { // iterate over the connectors as some codes may be handled by multiple connectors diff --git a/main/src/cgeo/geocaching/UsefulAppsActivity.java b/main/src/cgeo/geocaching/UsefulAppsActivity.java index 8093bba..41ea96e 100644 --- a/main/src/cgeo/geocaching/UsefulAppsActivity.java +++ b/main/src/cgeo/geocaching/UsefulAppsActivity.java @@ -50,7 +50,7 @@ public class UsefulAppsActivity extends AbstractActivity { marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); activity.startActivity(marketIntent); - } catch (Exception e) { + } catch (RuntimeException e) { // market not available in standard emulator } } diff --git a/main/src/cgeo/geocaching/Waypoint.java b/main/src/cgeo/geocaching/Waypoint.java index e39d26a..b204bdd 100644 --- a/main/src/cgeo/geocaching/Waypoint.java +++ b/main/src/cgeo/geocaching/Waypoint.java @@ -14,6 +14,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * Note: this class has a natural ordering that is inconsistent with equals. + */ public class Waypoint implements IWaypoint, Comparable<Waypoint> { public static final String PREFIX_OWN = "OWN"; @@ -35,7 +38,7 @@ public class Waypoint implements IWaypoint, Comparable<Waypoint> { public static void initializeScale() { // Calculate visited inset based on screen density - VISITED_INSET = (int) (6.6f * cgeoapplication.getInstance().getResources().getDisplayMetrics().density + 0.5f); + VISITED_INSET = (int) (6.6f * CgeoApplication.getInstance().getResources().getDisplayMetrics().density + 0.5f); } /** diff --git a/main/src/cgeo/geocaching/WaypointPopup.java b/main/src/cgeo/geocaching/WaypointPopup.java index a1ab36a..c33bbb5 100644 --- a/main/src/cgeo/geocaching/WaypointPopup.java +++ b/main/src/cgeo/geocaching/WaypointPopup.java @@ -56,7 +56,7 @@ public class WaypointPopup extends AbstractPopupActivity { @Override protected void init() { super.init(); - waypoint = cgData.loadWaypoint(waypointId); + waypoint = DataStore.loadWaypoint(waypointId); try { if (StringUtils.isNotBlank(waypoint.getName())) { setTitle(waypoint.getName()); diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java index 28c0cdd..1abc704 100644 --- a/main/src/cgeo/geocaching/activity/AbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java @@ -2,7 +2,7 @@ package cgeo.geocaching.activity; import butterknife.Views; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.network.Cookies; import cgeo.geocaching.settings.Settings; @@ -18,7 +18,7 @@ import android.widget.EditText; public abstract class AbstractActivity extends FragmentActivity implements IAbstractActivity { - protected cgeoapplication app = null; + protected CgeoApplication app = null; protected Resources res = null; private boolean keepScreenOn = false; @@ -101,7 +101,7 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst private void initializeCommonFields() { // initialize commonly used members res = this.getResources(); - app = (cgeoapplication) this.getApplication(); + app = (CgeoApplication) this.getApplication(); // only needed in some activities, but implemented in super class nonetheless Cookies.restoreCookieStore(Settings.getCookieStore()); diff --git a/main/src/cgeo/geocaching/activity/AbstractListActivity.java b/main/src/cgeo/geocaching/activity/AbstractListActivity.java index 47c747f..d2bc0b4 100644 --- a/main/src/cgeo/geocaching/activity/AbstractListActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractListActivity.java @@ -1,7 +1,6 @@ package cgeo.geocaching.activity; -import cgeo.geocaching.cgeoapplication; -import cgeo.geocaching.compatibility.Compatibility; +import cgeo.geocaching.CgeoApplication; import android.content.res.Resources; import android.graphics.drawable.Drawable; @@ -14,7 +13,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen private boolean keepScreenOn = false; - protected cgeoapplication app = null; + protected CgeoApplication app = null; protected Resources res = null; protected AbstractListActivity() { @@ -66,7 +65,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen private void initializeCommonFields() { // init res = this.getResources(); - app = (cgeoapplication) this.getApplication(); + app = (CgeoApplication) this.getApplication(); ActivityMixin.keepScreenOn(this, keepScreenOn); } @@ -77,7 +76,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen @Override public void invalidateOptionsMenuCompatible() { - Compatibility.invalidateOptionsMenu(this); + ActivityMixin.invalidateOptionsMenu(this); } public void onCreate(Bundle savedInstanceState, int resourceLayoutID) { diff --git a/main/src/cgeo/geocaching/apps/AbstractApp.java b/main/src/cgeo/geocaching/apps/AbstractApp.java index 7b6b3d9..d861542 100644 --- a/main/src/cgeo/geocaching/apps/AbstractApp.java +++ b/main/src/cgeo/geocaching/apps/AbstractApp.java @@ -1,7 +1,7 @@ package cgeo.geocaching.apps; import cgeo.geocaching.Geocache; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.utils.ProcessUtils; import org.apache.commons.lang3.StringUtils; @@ -53,7 +53,7 @@ public abstract class AbstractApp implements App { } protected static String getString(int ressourceId) { - return cgeoapplication.getInstance().getString(ressourceId); + return CgeoApplication.getInstance().getString(ressourceId); } @Override diff --git a/main/src/cgeo/geocaching/apps/AbstractLocusApp.java b/main/src/cgeo/geocaching/apps/AbstractLocusApp.java index 53620e4..2db8918 100644 --- a/main/src/cgeo/geocaching/apps/AbstractLocusApp.java +++ b/main/src/cgeo/geocaching/apps/AbstractLocusApp.java @@ -3,7 +3,7 @@ package cgeo.geocaching.apps; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.WaypointType; @@ -43,7 +43,7 @@ public abstract class AbstractLocusApp extends AbstractApp { @Override public boolean isInstalled() { - return LocusUtils.isLocusAvailable(cgeoapplication.getInstance()); + return LocusUtils.isLocusAvailable(CgeoApplication.getInstance()); } /** diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java index a3ea57e..7542e24 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java @@ -1,8 +1,11 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.Geocache; +import cgeo.geocaching.R; import cgeo.geocaching.Waypoint; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.AbstractApp; +import cgeo.geocaching.geopoint.Geopoint; import android.app.Activity; @@ -21,11 +24,22 @@ abstract class AbstractPointNavigationApp extends AbstractApp implements CacheNa @Override public void navigate(Activity activity, Geocache cache) { - navigate(activity, cache.getCoords()); + final Geopoint coords = cache.getCoords(); + if (coords != null) { + navigate(activity, coords); + } else { + ActivityMixin.showToast(activity, activity.getResources().getString(R.string.err_nav_no_coordinates)); + } } @Override public void navigate(Activity activity, Waypoint waypoint) { + final Geopoint coords = waypoint.getCoords(); + if (coords != null) { + navigate(activity, coords); + } else { + ActivityMixin.showToast(activity, activity.getResources().getString(R.string.err_nav_no_coordinates)); + } navigate(activity, waypoint.getCoords()); } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java index d898d7e..d5c9435 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java @@ -6,7 +6,7 @@ import cgeo.geocaching.R; import cgeo.geocaching.StaticMapsActivity; import cgeo.geocaching.StaticMapsProvider; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgData; +import cgeo.geocaching.DataStore; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.AbstractApp; @@ -34,7 +34,7 @@ abstract class AbstractStaticMapsApp extends AbstractApp implements CacheNavigat return false; } String geocode = waypoint.getGeocode(); - if (StringUtils.isNotEmpty(geocode) && cgData.isOffline(geocode, null)) { + if (StringUtils.isNotEmpty(geocode) && DataStore.isOffline(geocode, null)) { return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint); } return false; diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java index 03fae9e..4cbfa00 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java @@ -27,7 +27,7 @@ class GoogleMapsApp extends AbstractPointNavigationApp { activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("geo:" + point.getLatitude() + "," + point.getLongitude()))); return; - } catch (Exception e) { + } catch (RuntimeException e) { // nothing } Log.i("GoogleMapsApp.navigate: No maps application available."); diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsDirectionApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsDirectionApp.java index a84b7e8..a5b9a94 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsDirectionApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsDirectionApp.java @@ -2,7 +2,7 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.utils.Log; @@ -25,7 +25,7 @@ public class GoogleMapsDirectionApp extends AbstractPointNavigationApp { @Override public void navigate(Activity activity, Geopoint coords) { try { - IGeoData geo = cgeoapplication.getInstance().currentGeo(); + IGeoData geo = CgeoApplication.getInstance().currentGeo(); final Geopoint coordsNow = geo == null ? null : geo.getCoords(); if (coordsNow != null) { diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java index ec6b3e1..c10da58 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java @@ -1,9 +1,9 @@ package cgeo.geocaching.apps.cache.navi; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.AbstractAppFactory; import cgeo.geocaching.apps.App; @@ -16,6 +16,8 @@ import cgeo.geocaching.apps.cache.navi.GoogleNavigationApp.GoogleNavigationWalki import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.settings.Settings; +import org.eclipse.jdt.annotation.Nullable; + import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; @@ -273,7 +275,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { return menuItem != null; } - private static void navigateCache(Activity activity, Geocache cache, App app) { + private static void navigateCache(Activity activity, Geocache cache, @Nullable App app) { if (app instanceof CacheNavigationApp) { final CacheNavigationApp cacheApp = (CacheNavigationApp) app; cacheApp.navigate(activity, cache); @@ -286,7 +288,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { return menuItem != null; } - private static void navigateWaypoint(Activity activity, Waypoint waypoint, App app) { + private static void navigateWaypoint(Activity activity, Waypoint waypoint, @Nullable App app) { if (app instanceof WaypointNavigationApp) { final WaypointNavigationApp waypointApp = (WaypointNavigationApp) app; waypointApp.navigate(activity, waypoint); @@ -300,6 +302,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { } } + @Nullable private static App getAppFromMenuItem(MenuItem item) { final int id = item.getItemId(); for (final NavigationAppsEnum navApp : NavigationAppsEnum.values()) { @@ -320,7 +323,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { */ public static void startDefaultNavigationApplication(int defaultNavigation, Activity activity, Geocache cache) { if (cache == null || cache.getCoords() == null) { - ActivityMixin.showToast(activity, cgeoapplication.getInstance().getString(R.string.err_location_unknown)); + ActivityMixin.showToast(activity, CgeoApplication.getInstance().getString(R.string.err_location_unknown)); return; } @@ -342,7 +345,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { */ public static void startDefaultNavigationApplication(int defaultNavigation, Activity activity, Waypoint waypoint) { if (waypoint == null || waypoint.getCoords() == null) { - ActivityMixin.showToast(activity, cgeoapplication.getInstance().getString(R.string.err_location_unknown)); + ActivityMixin.showToast(activity, CgeoApplication.getInstance().getString(R.string.err_location_unknown)); return; } navigateWaypoint(activity, waypoint, getDefaultNavigationApplication(defaultNavigation)); @@ -356,7 +359,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { */ public static void startDefaultNavigationApplication(int defaultNavigation, Activity activity, final Geopoint destination) { if (destination == null) { - ActivityMixin.showToast(activity, cgeoapplication.getInstance().getString(R.string.err_location_unknown)); + ActivityMixin.showToast(activity, CgeoApplication.getInstance().getString(R.string.err_location_unknown)); return; } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java b/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java index e2c0828..df67e43 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java @@ -1,7 +1,7 @@ package cgeo.geocaching.apps.cache.navi; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.utils.ProcessUtils; @@ -31,7 +31,7 @@ class StreetviewApp extends AbstractPointNavigationApp { activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("google.streetview:cbll=" + point.getLatitude() + "," + point.getLongitude()))); } catch (final ActivityNotFoundException e) { - ActivityMixin.showToast(activity, cgeoapplication.getInstance().getString(R.string.err_application_no)); + ActivityMixin.showToast(activity, CgeoApplication.getInstance().getString(R.string.err_application_no)); } } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/apps/cachelist/LocusCacheListApp.java b/main/src/cgeo/geocaching/apps/cachelist/AbstractLocusCacheListApp.java index cd0289a..49d75d7 100644 --- a/main/src/cgeo/geocaching/apps/cachelist/LocusCacheListApp.java +++ b/main/src/cgeo/geocaching/apps/cachelist/AbstractLocusCacheListApp.java @@ -1,22 +1,22 @@ package cgeo.geocaching.apps.cachelist; +import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Geocache; import cgeo.geocaching.apps.AbstractLocusApp; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import android.app.Activity; import android.content.Intent; import java.util.List; -class LocusCacheListApp extends AbstractLocusApp implements CacheListApp { +abstract class AbstractLocusCacheListApp extends AbstractLocusApp implements CacheListApp { private boolean export; - public LocusCacheListApp(boolean export) { + public AbstractLocusCacheListApp(boolean export) { super(getString(export ? R.string.caches_map_locus_export : R.string.caches_map_locus), Intent.ACTION_VIEW); this.export = export; } diff --git a/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java b/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java index b747eee..551bc9d 100644 --- a/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java +++ b/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java @@ -1,9 +1,9 @@ package cgeo.geocaching.apps.cachelist; +import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Geocache; -import cgeo.geocaching.activity.IAbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.AbstractAppFactory; import cgeo.geocaching.utils.Log; @@ -20,8 +20,8 @@ public final class CacheListAppFactory extends AbstractAppFactory { private static class LazyHolder { public static final CacheListApp[] apps = { new InternalCacheListMap(), - new LocusCacheListApp(false), - new LocusCacheListApp(true) + new LocusShowCacheListApp(), + new LocusExportCacheListApp() }; } @@ -55,13 +55,13 @@ public final class CacheListAppFactory extends AbstractAppFactory { } } - public static boolean onMenuItemSelected(final MenuItem item, final List<Geocache> caches, final IAbstractActivity activity, + public static boolean onMenuItemSelected(final MenuItem item, final List<Geocache> caches, final Activity activity, final SearchResult search) { final CacheListApp app = (CacheListApp) getAppFromMenuItem(item, LazyHolder.apps); if (app != null) { try { - boolean result = app.invoke(caches, (Activity) activity, search); - activity.invalidateOptionsMenuCompatible(); + boolean result = app.invoke(caches, activity, search); + ActivityMixin.invalidateOptionsMenu(activity); return result; } catch (Exception e) { Log.e("CacheListAppFactory.onMenuItemSelected", e); diff --git a/main/src/cgeo/geocaching/apps/cachelist/LocusExportCacheListApp.java b/main/src/cgeo/geocaching/apps/cachelist/LocusExportCacheListApp.java new file mode 100644 index 0000000..ef97be0 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cachelist/LocusExportCacheListApp.java @@ -0,0 +1,9 @@ +package cgeo.geocaching.apps.cachelist; + +final class LocusExportCacheListApp extends AbstractLocusCacheListApp { + + public LocusExportCacheListApp() { + super(true); + } + +} diff --git a/main/src/cgeo/geocaching/apps/cachelist/LocusShowCacheListApp.java b/main/src/cgeo/geocaching/apps/cachelist/LocusShowCacheListApp.java new file mode 100644 index 0000000..4b018f9 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cachelist/LocusShowCacheListApp.java @@ -0,0 +1,9 @@ +package cgeo.geocaching.apps.cachelist; + +final class LocusShowCacheListApp extends AbstractLocusCacheListApp { + + public LocusShowCacheListApp() { + super(false); + } + +} diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java index f08ac22..eb2be4b 100644 --- a/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java +++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java @@ -1,6 +1,6 @@ package cgeo.geocaching.compatibility; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import android.annotation.TargetApi; import android.content.Context; @@ -18,7 +18,7 @@ public class AndroidLevel13 implements AndroidLevel13Interface { @Override public Point getDisplaySize() { Point dimensions = new Point(); - ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)) + ((WindowManager) CgeoApplication.getInstance().getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay().getSize(dimensions); return dimensions; } diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java index ded20cb..56c784f 100644 --- a/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java +++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java @@ -1,6 +1,6 @@ package cgeo.geocaching.compatibility; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import android.content.Context; import android.graphics.Point; @@ -22,7 +22,7 @@ public class AndroidLevel13Emulation implements AndroidLevel13Interface { } private static Display getDisplay() { - return ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)) + return ((WindowManager) CgeoApplication.getInstance().getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay(); } } diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java index 28ad12b..b93cda0 100644 --- a/main/src/cgeo/geocaching/connector/AbstractConnector.java +++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java @@ -1,13 +1,12 @@ package cgeo.geocaching.connector; import cgeo.geocaching.Geocache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; import cgeo.geocaching.geopoint.Geopoint; import org.apache.commons.lang3.StringUtils; -import android.app.Activity; - public abstract class AbstractConnector implements IConnector { @Override @@ -79,7 +78,7 @@ public abstract class AbstractConnector implements IConnector { } @Override - public ILoggingManager getLoggingManager(Activity activity, Geocache cache) { + public ILoggingManager getLoggingManager(final LogCacheActivity activity, final Geocache cache) { return new NoLoggingManager(); } diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java index 0c175cd..4ab7bde 100644 --- a/main/src/cgeo/geocaching/connector/IConnector.java +++ b/main/src/cgeo/geocaching/connector/IConnector.java @@ -2,10 +2,9 @@ package cgeo.geocaching.connector; import cgeo.geocaching.Geocache; import cgeo.geocaching.ICache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.geopoint.Geopoint; -import android.app.Activity; - public interface IConnector { /** * get name for display (currently only used in links) @@ -87,7 +86,7 @@ public interface IConnector { * * @return */ - public ILoggingManager getLoggingManager(Activity activity, Geocache cache); + public ILoggingManager getLoggingManager(final LogCacheActivity activity, final Geocache cache); /** * get host name of the connector server for dynamic loading of data diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index 835359a..111c865 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -1,11 +1,12 @@ package cgeo.geocaching.connector.gc; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.ICache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.AbstractConnector; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.capability.ILogin; @@ -15,15 +16,14 @@ import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; -import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import android.app.Activity; import android.content.Context; import android.os.Handler; @@ -104,7 +104,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, } @Override - public ILoggingManager getLoggingManager(Activity activity, Geocache cache) { + public ILoggingManager getLoggingManager(final LogCacheActivity activity, final Geocache cache) { return new GCLoggingManager(activity, cache); } @@ -137,10 +137,10 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, if (StringUtils.isEmpty(page)) { final SearchResult search = new SearchResult(); - if (cgData.isThere(geocode, guid, true, false)) { + if (DataStore.isThere(geocode, guid, true, false)) { if (StringUtils.isBlank(geocode) && StringUtils.isNotBlank(guid)) { Log.i("Loading old cache from cache."); - search.addGeocode(cgData.getGeocodeForGuid(guid)); + search.addGeocode(DataStore.getGeocodeForGuid(guid)); } else { search.addGeocode(geocode); } @@ -152,6 +152,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, search.setError(StatusCode.COMMUNICATION_ERROR); return search; } + assert page != null; final SearchResult searchResult = GCParser.parseCache(page, handler); @@ -189,7 +190,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public boolean addToWatchlist(Geocache cache) { final boolean added = GCParser.addToWatchlist(cache); if (added) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return added; } @@ -198,7 +199,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public boolean removeFromWatchlist(Geocache cache) { final boolean removed = GCParser.removeFromWatchlist(cache); if (removed) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return removed; } @@ -215,7 +216,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public static boolean addToFavorites(Geocache cache) { final boolean added = GCParser.addToFavorites(cache); if (added) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return added; } @@ -232,7 +233,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public static boolean removeFromFavorites(Geocache cache) { final boolean removed = GCParser.removeFromFavorites(cache); if (removed) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return removed; } @@ -241,7 +242,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public boolean uploadModifiedCoordinates(Geocache cache, Geopoint wpt) { final boolean uploaded = GCParser.uploadModifiedCoordinates(cache, wpt); if (uploaded) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return uploaded; } @@ -250,7 +251,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public boolean deleteModifiedCoordinates(Geocache cache) { final boolean deleted = GCParser.deleteModifiedCoordinates(cache); if (deleted) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return deleted; } @@ -259,7 +260,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, public boolean uploadPersonalNote(Geocache cache) { final boolean uploaded = GCParser.uploadPersonalNote(cache); if (uploaded) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return uploaded; } @@ -299,13 +300,13 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, final StatusCode status = Login.login(); if (status == StatusCode.NO_ERROR) { - cgeoapplication.getInstance().checkLogin = false; + CgeoApplication.getInstance().checkLogin = false; Login.detectGcCustomDate(); } - if (cgeoapplication.getInstance().showLoginToast && handler != null) { + if (CgeoApplication.getInstance().showLoginToast && handler != null) { handler.sendMessage(handler.obtainMessage(0, status)); - cgeoapplication.getInstance().showLoginToast = false; + CgeoApplication.getInstance().showLoginToast = false; // invoke settings activity to insert login details if (status == StatusCode.NO_LOGIN_INFO_STORED && fromActivity != null) { diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index 16aa967..cd43cfb 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -167,7 +167,6 @@ public final class GCConstants { public final static String STRING_PREMIUMONLY_2 = "Sorry, the owner of this listing has made it viewable to Premium Members only."; public final static String STRING_PREMIUMONLY_1 = "has chosen to make this cache listing visible to Premium Members only."; - public final static String STRING_UNPUBLISHED_OWNER = "cache has not been published yet"; public final static String STRING_UNPUBLISHED_OTHER = "you cannot view this cache listing until it has been published"; public final static String STRING_UNPUBLISHED_FROM_SEARCH = "UnpublishedCacheSearchWidget"; public final static String STRING_UNKNOWN_ERROR = "An Error Has Occurred"; diff --git a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java index 2aa5c75..8bed2ea 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java @@ -3,7 +3,6 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.TrackableLog; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ILoggingManager; @@ -13,12 +12,13 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.loaders.UrlLoader; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.Nullable; -import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; @@ -38,11 +38,12 @@ public class GCLoggingManager implements ILoggingManager, LoaderManager.LoaderCa private List<LogType> possibleLogTypes; private boolean hasLoaderError = true; - public GCLoggingManager(Activity activity, Geocache cache) { - this.activity = (LogCacheActivity) activity; + public GCLoggingManager(final LogCacheActivity activity, final Geocache cache) { + this.activity = activity; this.cache = cache; } + @Nullable @Override public Loader<String> onCreateLoader(int arg0, Bundle arg1) { if (!Settings.isLogin()) { // allow offline logging diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java index 4fdde56..e2c7dfa 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCMap.java +++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java @@ -1,9 +1,9 @@ package cgeo.geocaching.connector.gc; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; @@ -19,7 +19,7 @@ import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.utils.LeastRecentlyUsedMap; import cgeo.geocaching.utils.Log; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.json.JSONArray; import org.json.JSONException; @@ -236,7 +236,9 @@ public class GCMap { } Log.d("Retrieved " + searchResult.getCount() + " caches for tile " + tile.toString()); - } catch (Exception e) { + } catch (RuntimeException e) { + Log.e("GCMap.parseMapJSON", e); + } catch (JSONException e) { Log.e("GCMap.parseMapJSON", e); } @@ -253,7 +255,7 @@ public class GCMap { * @return */ public static SearchResult searchByViewport(final Viewport viewport, final String[] tokens) { - int speed = (int) cgeoapplication.getInstance().currentGeo().getSpeed() * 60 * 60 / 1000; // in km/h + int speed = (int) CgeoApplication.getInstance().currentGeo().getSpeed() * 60 * 60 / 1000; // in km/h Strategy strategy = Settings.getLiveMapStrategy(); if (strategy == Strategy.AUTO) { strategy = speed >= 30 ? Strategy.FAST : Strategy.DETAILED; @@ -359,7 +361,7 @@ public class GCMap { // Check for vanished found caches if (tiles.iterator().next().getZoomLevel() >= Tile.ZOOMLEVEL_MIN_PERSONALIZED) { - searchResult.addFilteredGeocodes(cgData.getCachedMissingFromSearch(searchResult, tiles, GCConnector.getInstance(), Tile.ZOOMLEVEL_MIN_PERSONALIZED - 1)); + searchResult.addFilteredGeocodes(DataStore.getCachedMissingFromSearch(searchResult, tiles, GCConnector.getInstance(), Tile.ZOOMLEVEL_MIN_PERSONALIZED - 1)); } } @@ -370,7 +372,7 @@ public class GCMap { SearchResult search = GCParser.searchByCoords(center, Settings.getCacheType(), false, null); if (search != null && !search.isEmpty()) { final Set<String> geocodes = search.getGeocodes(); - lastSearchViewport = cgData.getBounds(geocodes); + lastSearchViewport = DataStore.getBounds(geocodes); searchResult.addGeocodes(geocodes); } } diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index b373cb1..20dc156 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -1,5 +1,7 @@ package cgeo.geocaching.connector.gc; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.Image; import cgeo.geocaching.LogEntry; @@ -8,8 +10,6 @@ import cgeo.geocaching.SearchResult; import cgeo.geocaching.Trackable; import cgeo.geocaching.TrackableLog; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; @@ -34,12 +34,14 @@ import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.TextUtils; import ch.boye.httpclientandroidlib.HttpResponse; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.ListUtils; + +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -147,7 +149,7 @@ public abstract class GCParser { } } } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse GUID and/or Disabled Log.w("GCParser.parseSearch: Failed to parse GUID and/or Disabled data"); } @@ -308,19 +310,15 @@ public abstract class GCParser { final String coordinates = Network.getResponseData(Network.postRequest("http://www.geocaching.com/seek/nearest.aspx", params), false); - if (StringUtils.isNotBlank(coordinates)) { - if (coordinates.contains("You have not agreed to the license agreement. The license agreement is required before you can start downloading GPX or LOC files from Geocaching.com")) { - Log.i("User has not agreed to the license agreement. Can\'t download .loc file."); - - searchResult.setError(StatusCode.UNAPPROVED_LICENSE); - - return searchResult; - } + if (StringUtils.contains(coordinates, "You have not agreed to the license agreement. The license agreement is required before you can start downloading GPX or LOC files from Geocaching.com")) { + Log.i("User has not agreed to the license agreement. Can\'t download .loc file."); + searchResult.setError(StatusCode.UNAPPROVED_LICENSE); + return searchResult; } LocParser.parseLoc(searchResult, coordinates); - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.e("GCParser.parseSearch.CIDs", e); } } @@ -357,7 +355,7 @@ public abstract class GCParser { // save full detailed caches CancellableHandler.sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_cache); - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + 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 @@ -376,7 +374,7 @@ public abstract class GCParser { final SearchResult searchResult = new SearchResult(); - if (pageIn.contains(GCConstants.STRING_UNPUBLISHED_OTHER) || pageIn.contains(GCConstants.STRING_UNPUBLISHED_OWNER) || pageIn.contains(GCConstants.STRING_UNPUBLISHED_FROM_SEARCH)) { + if (pageIn.contains(GCConstants.STRING_UNPUBLISHED_OTHER) || pageIn.contains(GCConstants.STRING_UNPUBLISHED_FROM_SEARCH)) { searchResult.setError(StatusCode.UNPUBLISHED_CACHE); return searchResult; } @@ -569,7 +567,7 @@ public abstract class GCParser { } cache.setAttributes(attributes); } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse cache attributes Log.w("GCParser.parseCache: Failed to parse cache attributes"); } @@ -598,7 +596,7 @@ public abstract class GCParser { } cache.addSpoiler(new Image(url, title, description)); } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse cache spoilers Log.w("GCParser.parseCache: Failed to parse cache spoilers"); } @@ -632,7 +630,7 @@ public abstract class GCParser { } } } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse cache inventory Log.w("GCParser.parseCache: Failed to parse cache inventory (2)"); } @@ -654,7 +652,7 @@ public abstract class GCParser { } } } - } catch (final Exception e) { + } catch (final NumberFormatException e) { // failed to parse logs Log.w("GCParser.parseCache: Failed to parse cache log count"); } @@ -667,7 +665,7 @@ public abstract class GCParser { final String originalCoords = TextUtils.getMatch(page, GCConstants.PATTERN_LATLON_ORIG, false, null); if (null != originalCoords) { - final Waypoint waypoint = new Waypoint(cgeoapplication.getInstance().getString(R.string.cache_coordinates_original), WaypointType.ORIGINAL, false); + final Waypoint waypoint = new Waypoint(CgeoApplication.getInstance().getString(R.string.cache_coordinates_original), WaypointType.ORIGINAL, false); waypoint.setCoords(new Geopoint(originalCoords)); cache.addOrChangeWaypoint(waypoint, false); cache.setUserModifiedCoords(true); @@ -706,7 +704,7 @@ public abstract class GCParser { // waypoint name // res is null during the unit tests - final String name = TextUtils.getMatch(wp[6], GCConstants.PATTERN_WPNAME, true, 1, cgeoapplication.getInstance().getString(R.string.waypoint), true); + final String name = TextUtils.getMatch(wp[6], GCConstants.PATTERN_WPNAME, true, 1, CgeoApplication.getInstance().getString(R.string.waypoint), true); // waypoint type final String resulttype = TextUtils.getMatch(wp[3], GCConstants.PATTERN_WPTYPE, null); @@ -847,6 +845,7 @@ public abstract class GCParser { * @param recaptchaReceiver * @return */ + @Nullable private static SearchResult searchByAny(final CacheType cacheType, final boolean my, final boolean showCaptcha, final Parameters params, RecaptchaReceiver recaptchaReceiver) { insertCacheType(params, cacheType); @@ -858,6 +857,7 @@ public abstract class GCParser { Log.e("GCParser.searchByAny: No data from server"); return null; } + assert page != null; final SearchResult searchResult = parseSearch(fullUri, page, showCaptcha, recaptchaReceiver); if (searchResult == null || CollectionUtils.isEmpty(searchResult.getGeocodes())) { @@ -944,6 +944,7 @@ public abstract class GCParser { return null; } + @Nullable public static Trackable searchTrackable(final String geocode, final String guid, final String id) { if (StringUtils.isBlank(geocode) && StringUtils.isBlank(guid) && StringUtils.isBlank(id)) { Log.w("GCParser.searchTrackable: No geocode nor guid nor id given"); @@ -968,6 +969,7 @@ public abstract class GCParser { Log.e("GCParser.searchTrackable: No data from server"); return trackable; } + assert page != null; trackable = parseTrackable(page, geocode); if (trackable == null) { @@ -1083,7 +1085,7 @@ public abstract class GCParser { page = Network.getResponseData(Network.postRequest(uri, params)); } - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.e("GCParser.postLog.confim", e); } @@ -1094,7 +1096,7 @@ public abstract class GCParser { Log.i("Log successfully posted to cache #" + cacheid); if (geocode != null) { - cgData.saveVisitDate(geocode); + DataStore.saveVisitDate(geocode); } Login.getLoginStatus(page); @@ -1136,6 +1138,7 @@ public abstract class GCParser { Log.e("GCParser.uploadLogImage: No data from server"); return new ImmutablePair<StatusCode, String>(StatusCode.UNKNOWN_ERROR, null); } + assert page != null; final String[] viewstates = Login.getViewstates(page); @@ -1293,7 +1296,8 @@ public abstract class GCParser { return !guidOnPage; // on watch list (=error) / not on watch list } - static String requestHtmlPage(final String geocode, final String guid, final String log, final String numlogs) { + @Nullable + static String requestHtmlPage(@Nullable final String geocode, @Nullable final String guid, final String log, final String numlogs) { final Parameters params = new Parameters("decrypt", "y"); if (StringUtils.isNotBlank(geocode)) { params.put("wp", geocode); @@ -1396,7 +1400,7 @@ public abstract class GCParser { trackable.setOwnerGuid(matcherOwner.group(1)); trackable.setOwner(matcherOwner.group(2).trim()); } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse trackable owner name Log.w("GCParser.parseTrackable: Failed to parse trackable owner name"); } @@ -1427,7 +1431,7 @@ public abstract class GCParser { if (TextUtils.matches(page, GCConstants.PATTERN_TRACKABLE_SPOTTEDOWNER)) { trackable.setSpottedType(Trackable.SPOTTED_OWNER); } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse trackable last known place Log.w("GCParser.parseTrackable: Failed to parse trackable last known place"); } @@ -1476,12 +1480,12 @@ public abstract class GCParser { trackable.setDetails(convertLinks(details)); } } - } catch (final Exception e) { + } catch (final RuntimeException e) { // failed to parse trackable details & image Log.w("GCParser.parseTrackable: Failed to parse trackable details & image"); } if (StringUtils.isEmpty(trackable.getDetails()) && page.contains(GCConstants.ERROR_TB_NOT_ACTIVATED)) { - trackable.setDetails(cgeoapplication.getInstance().getString(R.string.trackable_not_activated)); + trackable.setDetails(CgeoApplication.getInstance().getString(R.string.trackable_not_activated)); } // trackable logs @@ -1538,8 +1542,8 @@ public abstract class GCParser { trackable.setTrackingcode(possibleTrackingcode); } - if (cgeoapplication.getInstance() != null) { - cgData.saveTrackable(trackable); + if (CgeoApplication.getInstance() != null) { + DataStore.saveTrackable(trackable); } return trackable; @@ -1601,8 +1605,17 @@ public abstract class GCParser { rawResponse = TextUtils.getMatch(page, GCConstants.PATTERN_LOGBOOK, ""); } + return parseLogs(friends, rawResponse); + } + + 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; + } + try { final JSONObject resp = new JSONObject(rawResponse); if (!resp.getString("status").equals("success")) { @@ -1658,9 +1671,10 @@ public abstract class GCParser { return logs; } + @NonNull public static List<LogType> parseTypes(String page) { if (StringUtils.isEmpty(page)) { - return ListUtils.EMPTY_LIST; + return Collections.emptyList(); } final List<LogType> types = new ArrayList<LogType>(); diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java index 0d8fb05..beb49f1 100644 --- a/main/src/cgeo/geocaching/connector/gc/Login.java +++ b/main/src/cgeo/geocaching/connector/gc/Login.java @@ -1,7 +1,7 @@ package cgeo.geocaching.connector.gc; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.network.Cookies; import cgeo.geocaching.network.HtmlImage; @@ -13,10 +13,11 @@ import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.TextUtils; import ch.boye.httpclientandroidlib.HttpResponse; - import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import android.graphics.drawable.BitmapDrawable; @@ -76,7 +77,7 @@ public abstract class Login { return StatusCode.NO_LOGIN_INFO_STORED; } - Login.setActualStatus(cgeoapplication.getInstance().getString(R.string.init_login_popup_working)); + Login.setActualStatus(CgeoApplication.getInstance().getString(R.string.init_login_popup_working)); HttpResponse loginResponse = Network.getRequest("https://www.geocaching.com/login/default.aspx"); String loginData = Network.getResponseData(loginResponse); if (loginResponse != null && loginResponse.getStatusLine().getStatusCode() == 503 && TextUtils.matches(loginData, GCConstants.PATTERN_MAINTENANCE)) { @@ -119,6 +120,7 @@ public abstract class Login { // FIXME: should it be CONNECTION_FAILED to match the first attempt? return StatusCode.COMMUNICATION_ERROR; // no login page } + assert loginData != null; // Caught above if (Login.getLoginStatus(loginData)) { Log.i("Successfully logged in Geocaching.com as " + login.left + " (" + Settings.getMemberStatus() + ')'); @@ -171,7 +173,7 @@ public abstract class Login { resetLoginStatus(); setActualCachesFound(-1); - setActualStatus(cgeoapplication.getInstance().getString(R.string.err_login)); + setActualStatus(CgeoApplication.getInstance().getString(R.string.err_login)); } static void setActualCachesFound(final int found) { @@ -212,13 +214,14 @@ public abstract class Login { * @param page * @return <code>true</code> if user is logged in, <code>false</code> otherwise */ - public static boolean getLoginStatus(final String page) { + public static boolean getLoginStatus(@Nullable final String page) { if (StringUtils.isBlank(page)) { Log.e("Login.checkLogin: No page given"); return false; } + assert page != null; - setActualStatus(cgeoapplication.getInstance().getString(R.string.init_login_popup_ok)); + setActualStatus(CgeoApplication.getInstance().getString(R.string.init_login_popup_ok)); // on every page except login page setActualLoginStatus(TextUtils.matches(page, GCConstants.PATTERN_LOGIN_NAME)); @@ -246,7 +249,7 @@ public abstract class Login { return true; } - setActualStatus(cgeoapplication.getInstance().getString(R.string.init_login_popup_failed)); + setActualStatus(CgeoApplication.getInstance().getString(R.string.init_login_popup_failed)); return false; } @@ -276,7 +279,8 @@ public abstract class Login { public static BitmapDrawable downloadAvatarAndGetMemberStatus() { try { - final String profile = TextUtils.replaceWhitespace(Network.getResponseData(Network.getRequest("http://www.geocaching.com/my/"))); + final String responseData = StringUtils.defaultString(Network.getResponseData(Network.getRequest("http://www.geocaching.com/my/"))); + final String profile = TextUtils.replaceWhitespace(responseData); Settings.setMemberStatus(TextUtils.getMatch(profile, GCConstants.PATTERN_MEMBER_STATUS, true, null)); if (profile.contains(GCConstants.MEMBER_STATUS_RENEW)) { @@ -473,10 +477,13 @@ public abstract class Login { * @param params * @return */ - public static String getRequestLogged(final String uri, final Parameters params) { - final String data = Network.getResponseData(Network.getRequest(uri, params), canRemoveWhitespace(uri)); + @Nullable + public static String getRequestLogged(@NonNull final String uri, @Nullable final Parameters params) { + final HttpResponse response = Network.getRequest(uri, params); + final String data = Network.getResponseData(response, canRemoveWhitespace(uri)); - if (getLoginStatus(data)) { + // A page not found will not be found if the user logs in either + if (Network.isPageNotFound(response) || getLoginStatus(data)) { return data; } diff --git a/main/src/cgeo/geocaching/connector/gc/SearchHandler.java b/main/src/cgeo/geocaching/connector/gc/SearchHandler.java index 4358399..795ed2f 100644 --- a/main/src/cgeo/geocaching/connector/gc/SearchHandler.java +++ b/main/src/cgeo/geocaching/connector/gc/SearchHandler.java @@ -91,7 +91,7 @@ public class SearchHandler extends Handler { dlg.create().show(); } - } catch (Exception e) { + } catch (MalformedURLException e) { Log.e("Error in reCAPTCHA handler", e); } } diff --git a/main/src/cgeo/geocaching/connector/gc/UTFGridPosition.java b/main/src/cgeo/geocaching/connector/gc/UTFGridPosition.java index 5965fff..eff193a 100644 --- a/main/src/cgeo/geocaching/connector/gc/UTFGridPosition.java +++ b/main/src/cgeo/geocaching/connector/gc/UTFGridPosition.java @@ -15,9 +15,12 @@ public final class UTFGridPosition { private final static Pattern PATTERN_JSON_KEY = Pattern.compile("[^\\d]*" + "(\\d+),\\s*(\\d+)" + "[^\\d]*"); // (12, 34) public UTFGridPosition(final int x, final int y) { - assert x >= 0 && x <= UTFGrid.GRID_MAXX : "x outside bounds"; - assert y >= 0 && y <= UTFGrid.GRID_MAXY : "y outside bounds"; - + if (x < 0 || x > UTFGrid.GRID_MAXX) { + throw new IllegalArgumentException("x outside bounds"); + } + if (y < 0 || y > UTFGrid.GRID_MAXY) { + throw new IllegalArgumentException("y outside bounds"); + } this.x = x; this.y = y; } diff --git a/main/src/cgeo/geocaching/connector/oc/IOCAuthParams.java b/main/src/cgeo/geocaching/connector/oc/IOCAuthParams.java index 5a140a1..dacb626 100644 --- a/main/src/cgeo/geocaching/connector/oc/IOCAuthParams.java +++ b/main/src/cgeo/geocaching/connector/oc/IOCAuthParams.java @@ -3,58 +3,65 @@ package cgeo.geocaching.connector.oc; public interface IOCAuthParams { /** - * The site name: 'www.openaching...' - * + * The site name: 'www.opencaching...' + * * @return */ String getSite(); /** * ResId of the Consumer key - * + * * @return */ int getCKResId(); /** * ResId of the Consumer secret - * + * * @return */ int getCSResId(); /** - * ResId ot the Authorization title - * + * ResId of the Authorization title + * * @return */ - int getAuthTitelResId(); + int getAuthTitleResId(); /** * Preference key of the public token - * + * * @return */ int getTokenPublicPrefKey(); /** * Preference key of the secret token - * + * * @return */ int getTokenSecretPrefKey(); /** * Preference key of the temporary public token (OAuth) - * + * * @return */ int getTempTokenPublicPrefKey(); /** * Preference key of the temporary secret token (OAuth) - * + * * @return */ int getTempTokenSecretPrefKey(); + + /** + * The URI to use as a callback (OAuth) + * + * @return + */ + String getCallbackUri(); } diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index d35e54b..8f38641 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -1,9 +1,10 @@ package cgeo.geocaching.connector.oc; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; @@ -16,7 +17,6 @@ import cgeo.geocaching.utils.CryptUtils; import org.apache.commons.lang3.StringUtils; -import android.app.Activity; import android.content.Context; import android.os.Handler; @@ -29,9 +29,9 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.NOT_RETRIEVED); public OCApiLiveConnector(String name, String host, String prefix, String licenseString, int cKResId, int cSResId, int isActivePrefKeyId, int tokenPublicPrefKeyId, int tokenSecretPrefKeyId, ApiSupport apiSupport) { - super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId)), licenseString, apiSupport); + super(name, host, prefix, CryptUtils.rot13(CgeoApplication.getInstance().getResources().getString(cKResId)), licenseString, apiSupport); - cS = CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cSResId)); + cS = CryptUtils.rot13(CgeoApplication.getInstance().getResources().getString(cSResId)); this.isActivePrefKeyId = isActivePrefKeyId; this.tokenPublicPrefKeyId = tokenPublicPrefKeyId; this.tokenSecretPrefKeyId = tokenSecretPrefKeyId; @@ -87,7 +87,7 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente final boolean added = OkapiClient.setWatchState(cache, true, this); if (added) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return added; @@ -98,7 +98,7 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente final boolean removed = OkapiClient.setWatchState(cache, false, this); if (removed) { - cgData.saveChangedCache(cache); + DataStore.saveChangedCache(cache); } return removed; @@ -110,7 +110,7 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente } @Override - public ILoggingManager getLoggingManager(Activity activity, Geocache cache) { + public ILoggingManager getLoggingManager(final LogCacheActivity activity, final Geocache cache) { return new OkapiLoggingManager(activity, this, cache); } @@ -145,7 +145,7 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente @Override public String getLoginStatusString() { - return cgeoapplication.getInstance().getString(userInfo.getStatus().resId); + return CgeoApplication.getInstance().getString(userInfo.getStatus().resId); } @Override diff --git a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java index 10d6a66..c082bac 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java @@ -1,13 +1,14 @@ package cgeo.geocaching.connector.oc; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.network.OAuthAuthorizationActivity; import cgeo.geocaching.settings.Settings; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.Nullable; -public class OCAuthorizationActivity extends OAuthAuthorizationActivity { +public abstract class OCAuthorizationActivity extends OAuthAuthorizationActivity { final IOCAuthParams authParams; @@ -17,8 +18,9 @@ public class OCAuthorizationActivity extends OAuthAuthorizationActivity { "/okapi/services/oauth/authorize", "/okapi/services/oauth/access_token", false, - cgeoapplication.getInstance().getResources().getString(authParams.getCKResId()), - cgeoapplication.getInstance().getResources().getString(authParams.getCSResId())); + CgeoApplication.getInstance().getResources().getString(authParams.getCKResId()), + CgeoApplication.getInstance().getResources().getString(authParams.getCSResId()), + authParams.getCallbackUri()); this.authParams = authParams; } @@ -28,12 +30,12 @@ public class OCAuthorizationActivity extends OAuthAuthorizationActivity { } @Override - protected void setTempTokens(String tokenPublic, String tokenSecret) { + protected void setTempTokens(@Nullable final String tokenPublic, @Nullable final String tokenSecret) { Settings.setTokens(authParams.getTempTokenPublicPrefKey(), tokenPublic, authParams.getTempTokenSecretPrefKey(), tokenSecret); } @Override - protected void setTokens(String tokenPublic, String tokenSecret, boolean enable) { + protected void setTokens(@Nullable final String tokenPublic, @Nullable final String tokenSecret, final boolean enable) { Settings.setTokens(authParams.getTokenPublicPrefKey(), tokenPublic, authParams.getTokenSecretPrefKey(), tokenSecret); if (tokenPublic != null) { Settings.setTokens(authParams.getTempTokenPublicPrefKey(), null, authParams.getTempTokenSecretPrefKey(), null); @@ -42,22 +44,7 @@ public class OCAuthorizationActivity extends OAuthAuthorizationActivity { @Override protected String getAuthTitle() { - return res.getString(authParams.getAuthTitelResId()); - } - - @Override - protected String getAuthAgain() { - return res.getString(R.string.auth_again_oc); - } - - @Override - protected String getErrAuthInitialize() { - return res.getString(R.string.err_auth_initialize); - } - - @Override - protected String getAuthStart() { - return res.getString(R.string.auth_start_oc); + return res.getString(authParams.getAuthTitleResId()); } @Override @@ -65,48 +52,4 @@ public class OCAuthorizationActivity extends OAuthAuthorizationActivity { return res.getString(R.string.auth_dialog_completed_oc, getAuthTitle()); } - @Override - protected String getErrAuthProcess() { - return res.getString(R.string.err_auth_process); - } - - @Override - protected String getAuthDialogWait() { - return res.getString(R.string.auth_dialog_wait_oc, getAuthTitle()); - } - - @Override - protected String getAuthDialogPinTitle() { - return res.getString(R.string.auth_dialog_pin_title_oc); - } - - @Override - protected String getAuthDialogPinMessage() { - return res.getString(R.string.auth_dialog_pin_message_oc, getAuthTitle()); - } - - @Override - protected String getAboutAuth1() { - return res.getString(R.string.about_auth_1_oc, getAuthTitle()); - } - - @Override - protected String getAboutAuth2() { - return res.getString(R.string.about_auth_2_oc, getAuthTitle(), getAuthTitle()); - } - - @Override - protected String getAuthAuthorize() { - return res.getString(R.string.auth_authorize_oc); - } - - @Override - protected String getAuthPinHint() { - return res.getString(R.string.auth_pin_hint_oc, getAuthTitle()); - } - - @Override - protected String getAuthFinish() { - return res.getString(R.string.auth_finish_oc); - } } diff --git a/main/src/cgeo/geocaching/connector/oc/OCDEAuthParams.java b/main/src/cgeo/geocaching/connector/oc/OCDEAuthParams.java index 734b383..17c1cb8 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCDEAuthParams.java +++ b/main/src/cgeo/geocaching/connector/oc/OCDEAuthParams.java @@ -20,7 +20,7 @@ public class OCDEAuthParams implements IOCAuthParams { } @Override - public int getAuthTitelResId() { + public int getAuthTitleResId() { return R.string.auth_ocde; } @@ -43,4 +43,9 @@ public class OCDEAuthParams implements IOCAuthParams { public int getTempTokenSecretPrefKey() { return R.string.pref_temp_ocde_token_secret; } + + @Override + public String getCallbackUri() { + return "callback://www.cgeo.org/opencaching.de/"; + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OCDEAuthorizationActivity.java b/main/src/cgeo/geocaching/connector/oc/OCDEAuthorizationActivity.java index caf114c..1d2aa49 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCDEAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/connector/oc/OCDEAuthorizationActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching.connector.oc; -public class OCDEAuthorizationActivity extends OCAuthorizationActivity { +public final class OCDEAuthorizationActivity extends OCAuthorizationActivity { public OCDEAuthorizationActivity() { super(new OCDEAuthParams()); diff --git a/main/src/cgeo/geocaching/connector/oc/OCPLAuthParams.java b/main/src/cgeo/geocaching/connector/oc/OCPLAuthParams.java index 117e990..dfe03e5 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCPLAuthParams.java +++ b/main/src/cgeo/geocaching/connector/oc/OCPLAuthParams.java @@ -20,7 +20,7 @@ public class OCPLAuthParams implements IOCAuthParams { } @Override - public int getAuthTitelResId() { + public int getAuthTitleResId() { return R.string.auth_ocpl; } @@ -43,4 +43,9 @@ public class OCPLAuthParams implements IOCAuthParams { public int getTempTokenSecretPrefKey() { return R.string.pref_temp_ocpl_token_secret; } + + @Override + public String getCallbackUri() { + return "callback://www.cgeo.org/opencaching.pl/"; + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OCPLAuthorizationActivity.java b/main/src/cgeo/geocaching/connector/oc/OCPLAuthorizationActivity.java index 4f9ef96..30ea150 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCPLAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/connector/oc/OCPLAuthorizationActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching.connector.oc; -public class OCPLAuthorizationActivity extends OCAuthorizationActivity { +public final class OCPLAuthorizationActivity extends OCAuthorizationActivity { public OCPLAuthorizationActivity() { super(new OCPLAuthParams()); diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index 43ea8ad..309969e 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -1,12 +1,12 @@ package cgeo.geocaching.connector.oc; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.Image; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.LogResult; @@ -265,7 +265,7 @@ final class OkapiClient { parseCoreCache(response, cache); - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_CACHE)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_CACHE)); } catch (final JSONException e) { Log.e("OkapiClient.parseSmallCache", e); } @@ -297,7 +297,7 @@ final class OkapiClient { final StringBuilder description = new StringBuilder(500); if (!response.isNull("gc_code")) { final String gccode = response.getString("gc_code"); - description.append(cgeoapplication.getInstance().getResources() + description.append(CgeoApplication.getInstance().getResources() .getString(R.string.cache_listed_on, GCConnector.getInstance().getName())) .append(": <a href=\"http://coord.info/") .append(gccode) @@ -338,7 +338,7 @@ final class OkapiClient { cache.setDetailedUpdatedNow(); // save full detailed caches - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); } catch (final JSONException e) { Log.e("OkapiClient.parseCache", e); } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java index c995975..9ffe7a2 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java @@ -9,7 +9,6 @@ import cgeo.geocaching.connector.LogResult; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; -import android.app.Activity; import android.net.Uri; import java.util.Arrays; @@ -26,10 +25,10 @@ public class OkapiLoggingManager implements ILoggingManager { private final static List<LogType> standardLogTypes = Arrays.asList(LogType.FOUND_IT, LogType.DIDNT_FIND_IT, LogType.NOTE); private final static List<LogType> eventLogTypes = Arrays.asList(LogType.WILL_ATTEND, LogType.ATTENDED, LogType.NOTE); - public OkapiLoggingManager(Activity activity, OCApiLiveConnector connector, Geocache cache) { + public OkapiLoggingManager(final LogCacheActivity activity, OCApiLiveConnector connector, Geocache cache) { this.connector = connector; this.cache = cache; - this.activity = (LogCacheActivity) activity; + this.activity = activity; } @Override diff --git a/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java b/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java index f25e289..9d1dfc7 100644 --- a/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java +++ b/main/src/cgeo/geocaching/connector/ox/OpenCachingApi.java @@ -1,9 +1,9 @@ package cgeo.geocaching.connector.ox; import cgeo.geocaching.Geocache; -import cgeo.geocaching.StoredList; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.CryptUtils; @@ -11,7 +11,7 @@ import cgeo.geocaching.utils.Log; import ch.boye.httpclientandroidlib.HttpResponse; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import java.util.Collection; import java.util.Collections; diff --git a/main/src/cgeo/geocaching/connector/trackable/GeokretyParser.java b/main/src/cgeo/geocaching/connector/trackable/GeokretyParser.java index 66ca5f7..9f79896 100644 --- a/main/src/cgeo/geocaching/connector/trackable/GeokretyParser.java +++ b/main/src/cgeo/geocaching/connector/trackable/GeokretyParser.java @@ -1,8 +1,8 @@ package cgeo.geocaching.connector.trackable; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; import cgeo.geocaching.Trackable; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.utils.Log; import org.xml.sax.Attributes; @@ -63,15 +63,15 @@ public class GeokretyParser { protected static String getType(int type) { switch (type) { case 0: - return cgeoapplication.getInstance().getString(R.string.geokret_type_traditional); + return CgeoApplication.getInstance().getString(R.string.geokret_type_traditional); case 1: - return cgeoapplication.getInstance().getString(R.string.geokret_type_book_or_media); + return CgeoApplication.getInstance().getString(R.string.geokret_type_book_or_media); case 2: - return cgeoapplication.getInstance().getString(R.string.geokret_type_human); + return CgeoApplication.getInstance().getString(R.string.geokret_type_human); case 3: - return cgeoapplication.getInstance().getString(R.string.geokret_type_coin); + return CgeoApplication.getInstance().getString(R.string.geokret_type_coin); case 4: - return cgeoapplication.getInstance().getString(R.string.geokret_type_post); + return CgeoApplication.getInstance().getString(R.string.geokret_type_post); } return null; } diff --git a/main/src/cgeo/geocaching/enumerations/CacheAttribute.java b/main/src/cgeo/geocaching/enumerations/CacheAttribute.java index 243f63d..1ddfeaf 100644 --- a/main/src/cgeo/geocaching/enumerations/CacheAttribute.java +++ b/main/src/cgeo/geocaching/enumerations/CacheAttribute.java @@ -1,7 +1,7 @@ package cgeo.geocaching.enumerations; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import org.apache.commons.lang3.StringUtils; @@ -143,7 +143,7 @@ public enum CacheAttribute { * @return the localized text */ public String getL10n(final boolean enabled) { - return cgeoapplication.getInstance().getResources().getString( + return CgeoApplication.getInstance().getResources().getString( enabled ? stringIdYes : stringIdNo); } diff --git a/main/src/cgeo/geocaching/enumerations/CacheListType.java b/main/src/cgeo/geocaching/enumerations/CacheListType.java index 641947d..b75c118 100644 --- a/main/src/cgeo/geocaching/enumerations/CacheListType.java +++ b/main/src/cgeo/geocaching/enumerations/CacheListType.java @@ -1,13 +1,22 @@ package cgeo.geocaching.enumerations; public enum CacheListType { - OFFLINE, - HISTORY, - NEAREST, - COORDINATE, - KEYWORD, - ADDRESS, - USERNAME, - OWNER, - MAP; + OFFLINE(true), + HISTORY(true), + NEAREST(false), + COORDINATE(false), + KEYWORD(false), + ADDRESS(false), + USERNAME(false), + OWNER(false), + MAP(false); + + /** + * whether or not this list allows switching to another list + */ + public final boolean canSwitch; + + private CacheListType(final boolean canSwitch) { + this.canSwitch = canSwitch; + } } diff --git a/main/src/cgeo/geocaching/enumerations/CacheSize.java b/main/src/cgeo/geocaching/enumerations/CacheSize.java index 726ebe2..a6f8df3 100644 --- a/main/src/cgeo/geocaching/enumerations/CacheSize.java +++ b/main/src/cgeo/geocaching/enumerations/CacheSize.java @@ -1,7 +1,7 @@ package cgeo.geocaching.enumerations; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import java.util.Collections; import java.util.HashMap; @@ -60,7 +60,7 @@ public enum CacheSize { } public final String getL10n() { - return cgeoapplication.getInstance().getBaseContext().getResources().getString(stringId); + return CgeoApplication.getInstance().getBaseContext().getResources().getString(stringId); } } diff --git a/main/src/cgeo/geocaching/enumerations/CacheType.java b/main/src/cgeo/geocaching/enumerations/CacheType.java index c7a9130..c952ba0 100644 --- a/main/src/cgeo/geocaching/enumerations/CacheType.java +++ b/main/src/cgeo/geocaching/enumerations/CacheType.java @@ -2,7 +2,7 @@ package cgeo.geocaching.enumerations; import cgeo.geocaching.ICache; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import java.util.Collections; import java.util.HashMap; @@ -85,7 +85,7 @@ public enum CacheType { } public final String getL10n() { - return cgeoapplication.getInstance().getBaseContext().getResources().getString(stringId); + return CgeoApplication.getInstance().getBaseContext().getResources().getString(stringId); } public boolean isEvent() { @@ -114,7 +114,7 @@ public enum CacheType { } public boolean applyDistanceRule() { - return !isVirtual() && !isEvent(); + return TRADITIONAL == this || PROJECT_APE == this || GCHQ == this; } public boolean isVirtual() { diff --git a/main/src/cgeo/geocaching/enumerations/LiveMapStrategy.java b/main/src/cgeo/geocaching/enumerations/LiveMapStrategy.java index 5f5b2c9..710c3ba 100644 --- a/main/src/cgeo/geocaching/enumerations/LiveMapStrategy.java +++ b/main/src/cgeo/geocaching/enumerations/LiveMapStrategy.java @@ -1,7 +1,7 @@ package cgeo.geocaching.enumerations; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import java.util.EnumSet; @@ -42,7 +42,7 @@ public interface LiveMapStrategy { } public final String getL10n() { - return cgeoapplication.getInstance().getBaseContext().getResources().getString(stringId); + return CgeoApplication.getInstance().getBaseContext().getResources().getString(stringId); } } } diff --git a/main/src/cgeo/geocaching/enumerations/LogType.java b/main/src/cgeo/geocaching/enumerations/LogType.java index 9902d3f..543f83d 100644 --- a/main/src/cgeo/geocaching/enumerations/LogType.java +++ b/main/src/cgeo/geocaching/enumerations/LogType.java @@ -1,7 +1,7 @@ package cgeo.geocaching.enumerations; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import java.util.Collections; import java.util.HashMap; @@ -102,6 +102,6 @@ public enum LogType { } public final String getL10n() { - return cgeoapplication.getInstance().getBaseContext().getResources().getString(stringId); + return CgeoApplication.getInstance().getBaseContext().getResources().getString(stringId); } } diff --git a/main/src/cgeo/geocaching/enumerations/WaypointType.java b/main/src/cgeo/geocaching/enumerations/WaypointType.java index 79c8106..272b2f2 100644 --- a/main/src/cgeo/geocaching/enumerations/WaypointType.java +++ b/main/src/cgeo/geocaching/enumerations/WaypointType.java @@ -1,7 +1,7 @@ package cgeo.geocaching.enumerations; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import java.util.Collections; import java.util.HashMap; @@ -65,7 +65,7 @@ public enum WaypointType { } public final String getL10n() { - return cgeoapplication.getInstance().getBaseContext().getResources().getString(stringId); + return CgeoApplication.getInstance().getBaseContext().getResources().getString(stringId); } @Override diff --git a/main/src/cgeo/geocaching/export/AbstractExport.java b/main/src/cgeo/geocaching/export/AbstractExport.java index e4ba5f0..5d15ecb 100644 --- a/main/src/cgeo/geocaching/export/AbstractExport.java +++ b/main/src/cgeo/geocaching/export/AbstractExport.java @@ -1,7 +1,7 @@ package cgeo.geocaching.export; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; abstract class AbstractExport implements Export { private final String name; @@ -23,7 +23,7 @@ abstract class AbstractExport implements Export { * @return localized string */ protected static String getString(int resourceId) { - return cgeoapplication.getInstance().getString(resourceId); + return CgeoApplication.getInstance().getString(resourceId); } /** @@ -36,7 +36,7 @@ abstract class AbstractExport implements Export { * @return localized string */ protected static String getString(int resourceId, Object... params) { - return cgeoapplication.getInstance().getString(resourceId, params); + return CgeoApplication.getInstance().getString(resourceId, params); } @Override diff --git a/main/src/cgeo/geocaching/export/FieldnoteExport.java b/main/src/cgeo/geocaching/export/FieldnoteExport.java index d0040a9..d59434a 100644 --- a/main/src/cgeo/geocaching/export/FieldnoteExport.java +++ b/main/src/cgeo/geocaching/export/FieldnoteExport.java @@ -1,9 +1,9 @@ package cgeo.geocaching.export; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.cgData; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.enumerations.StatusCode; @@ -13,9 +13,9 @@ import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.utils.AsyncTaskWithProgress; import cgeo.geocaching.utils.FileUtils; -import cgeo.geocaching.utils.IOUtils; import cgeo.geocaching.utils.Log; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.CharEncoding; import org.apache.commons.lang3.StringUtils; @@ -134,7 +134,7 @@ class FieldnoteExport extends AbstractExport { int i = 0; for (final Geocache cache : caches) { if (cache.isLogOffline()) { - final LogEntry log = cgData.loadLogOffline(cache.getGeocode()); + final LogEntry log = DataStore.loadLogOffline(cache.getGeocode()); if (!onlyNew || log.date > Settings.getFieldnoteExportDate()) { appendFieldNote(fieldNoteBuffer, cache, log); } diff --git a/main/src/cgeo/geocaching/export/GpxExport.java b/main/src/cgeo/geocaching/export/GpxExport.java index 821a3f6..a2e0f93 100644 --- a/main/src/cgeo/geocaching/export/GpxExport.java +++ b/main/src/cgeo/geocaching/export/GpxExport.java @@ -2,7 +2,7 @@ package cgeo.geocaching.export; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.AsyncTaskWithProgress; @@ -125,7 +125,7 @@ class GpxExport extends AbstractExport { final List<String> allGeocodes = new ArrayList<String>(Arrays.asList(geocodes)); - setMessage(cgeoapplication.getInstance().getResources().getQuantityString(R.plurals.cache_counts, allGeocodes.size(), allGeocodes.size())); + setMessage(CgeoApplication.getInstance().getResources().getQuantityString(R.plurals.cache_counts, allGeocodes.size(), allGeocodes.size())); final File exportFile = getExportFile(); BufferedWriter writer = null; @@ -141,7 +141,7 @@ class GpxExport extends AbstractExport { ExportTask.this.publishProgress(countExported); } }); - } catch (final Exception e) { + } catch (final IOException e) { Log.e("GpxExport.ExportTask export", e); if (writer != null) { diff --git a/main/src/cgeo/geocaching/export/GpxSerializer.java b/main/src/cgeo/geocaching/export/GpxSerializer.java index 1e39be4..e4051b5 100644 --- a/main/src/cgeo/geocaching/export/GpxSerializer.java +++ b/main/src/cgeo/geocaching/export/GpxSerializer.java @@ -1,9 +1,9 @@ package cgeo.geocaching.export; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogEntry; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheAttribute; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.geopoint.Geopoint; @@ -81,7 +81,7 @@ public final class GpxSerializer { } private void exportBatch(final XmlSerializer gpx, Collection<String> geocodesOfBatch) throws IOException { - final Set<Geocache> caches = cgData.loadCaches(geocodesOfBatch, LoadFlags.LOAD_ALL_DB_ONLY); + final Set<Geocache> caches = DataStore.loadCaches(geocodesOfBatch, LoadFlags.LOAD_ALL_DB_ONLY); for (final Geocache cache : caches) { gpx.startTag(PREFIX_GPX, "wpt"); gpx.attribute("", "lat", Double.toString(cache.getCoords().getLatitude())); diff --git a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java index b0aba58..78cb2df 100644 --- a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java +++ b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java @@ -2,12 +2,12 @@ package cgeo.geocaching.files; import cgeo.geocaching.Intents; import cgeo.geocaching.R; -import cgeo.geocaching.StoredList; import cgeo.geocaching.activity.AbstractListActivity; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.utils.FileUtils; import cgeo.geocaching.utils.Log; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.ProgressDialog; diff --git a/main/src/cgeo/geocaching/files/FileParser.java b/main/src/cgeo/geocaching/files/FileParser.java index f979d74..396a589 100644 --- a/main/src/cgeo/geocaching/files/FileParser.java +++ b/main/src/cgeo/geocaching/files/FileParser.java @@ -2,7 +2,8 @@ package cgeo.geocaching.files; import cgeo.geocaching.Geocache; import cgeo.geocaching.utils.CancellableHandler; -import cgeo.geocaching.utils.IOUtils; + +import org.apache.commons.io.IOUtils; import java.io.BufferedInputStream; import java.io.BufferedReader; @@ -51,7 +52,7 @@ public abstract class FileParser { protected static StringBuilder readStream(InputStream is, CancellableHandler progressHandler) throws IOException { final StringBuilder buffer = new StringBuilder(); ProgressInputStream progressInputStream = new ProgressInputStream(is); - final BufferedReader input = new BufferedReader(new InputStreamReader(progressInputStream)); + final BufferedReader input = new BufferedReader(new InputStreamReader(progressInputStream, "UTF-8")); try { String line; diff --git a/main/src/cgeo/geocaching/files/GPXImporter.java b/main/src/cgeo/geocaching/files/GPXImporter.java index a1c04d7..bf0aa72 100644 --- a/main/src/cgeo/geocaching/files/GPXImporter.java +++ b/main/src/cgeo/geocaching/files/GPXImporter.java @@ -3,12 +3,12 @@ package cgeo.geocaching.files; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.StaticMapsProvider; -import cgeo.geocaching.cgData; -import cgeo.geocaching.activity.IAbstractActivity; +import cgeo.geocaching.DataStore; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.activity.Progress; import cgeo.geocaching.enumerations.LoadFlags; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; @@ -17,7 +17,6 @@ import org.apache.commons.lang3.StringUtils; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentResolver; -import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.net.Uri; @@ -61,13 +60,13 @@ public class GPXImporter { private final Resources res; private final int listId; - private final IAbstractActivity fromActivity; + private final Activity fromActivity; private final Handler importFinishedHandler; - public GPXImporter(final IAbstractActivity fromActivity, final int listId, final Handler importFinishedHandler) { + public GPXImporter(final Activity fromActivity, final int listId, final Handler importFinishedHandler) { this.listId = listId; this.fromActivity = fromActivity; - res = ((Activity) fromActivity).getResources(); + res = fromActivity.getResources(); this.importFinishedHandler = importFinishedHandler; } @@ -91,8 +90,8 @@ public class GPXImporter { * Import GPX provided via intent of activity that instantiated this GPXImporter. */ public void importGPX() { - final ContentResolver contentResolver = ((Activity) fromActivity).getContentResolver(); - final Intent intent = ((Activity) fromActivity).getIntent(); + final ContentResolver contentResolver = fromActivity.getContentResolver(); + final Intent intent = fromActivity.getIntent(); final Uri uri = intent.getData(); String mimeType = intent.getType(); @@ -176,7 +175,7 @@ public class GPXImporter { private boolean importStaticMaps(final SearchResult importedCaches) { int storedCacheMaps = 0; for (final String geocode : importedCaches.getGeocodes()) { - final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); + final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); if (cache != null) { Log.d("GPXImporter.ImportThread.importStaticMaps start downloadMaps for cache " + geocode); StaticMapsProvider.downloadMaps(cache); @@ -397,7 +396,7 @@ public class GPXImporter { switch (msg.what) { case IMPORT_STEP_START: final Message cancelMessage = importStepHandler.obtainMessage(IMPORT_STEP_CANCEL); - progress.show((Context) fromActivity, res.getString(R.string.gpx_import_title_reading_file), res.getString(R.string.gpx_import_loading_caches), ProgressDialog.STYLE_HORIZONTAL, cancelMessage); + progress.show(fromActivity, res.getString(R.string.gpx_import_title_reading_file), res.getString(R.string.gpx_import_loading_caches), ProgressDialog.STYLE_HORIZONTAL, cancelMessage); break; case IMPORT_STEP_READ_FILE: @@ -409,7 +408,7 @@ public class GPXImporter { case IMPORT_STEP_STORE_STATIC_MAPS: progress.dismiss(); final Message skipMessage = importStepHandler.obtainMessage(IMPORT_STEP_STATIC_MAPS_SKIPPED, msg.arg2, 0); - progress.show((Context) fromActivity, res.getString(R.string.gpx_import_title_static_maps), res.getString(R.string.gpx_import_store_static_maps), ProgressDialog.STYLE_HORIZONTAL, skipMessage); + progress.show(fromActivity, res.getString(R.string.gpx_import_title_static_maps), res.getString(R.string.gpx_import_store_static_maps), ProgressDialog.STYLE_HORIZONTAL, skipMessage); progress.setMaxProgressAndReset(msg.arg2); break; @@ -418,19 +417,19 @@ public class GPXImporter { progressHandler.cancel(); final StringBuilder bufferSkipped = new StringBuilder(20); bufferSkipped.append(res.getString(R.string.gpx_import_static_maps_skipped)).append(", ").append(msg.arg1).append(' ').append(res.getString(R.string.gpx_import_caches_imported)); - fromActivity.helpDialog(res.getString(R.string.gpx_import_title_caches_imported), bufferSkipped.toString()); + ActivityMixin.helpDialog(fromActivity, res.getString(R.string.gpx_import_title_caches_imported), bufferSkipped.toString()); importFinished(); break; case IMPORT_STEP_FINISHED: progress.dismiss(); - fromActivity.helpDialog(res.getString(R.string.gpx_import_title_caches_imported), msg.arg1 + " " + res.getString(R.string.gpx_import_caches_imported)); + ActivityMixin.helpDialog(fromActivity, res.getString(R.string.gpx_import_title_caches_imported), msg.arg1 + " " + res.getString(R.string.gpx_import_caches_imported)); importFinished(); break; case IMPORT_STEP_FINISHED_WITH_ERROR: progress.dismiss(); - fromActivity.helpDialog(res.getString(R.string.gpx_import_title_caches_import_failed), res.getString(msg.arg1) + "\n\n" + msg.obj); + ActivityMixin.helpDialog(fromActivity, res.getString(R.string.gpx_import_title_caches_import_failed), res.getString(msg.arg1) + "\n\n" + msg.obj); importFinished(); break; @@ -442,7 +441,7 @@ public class GPXImporter { case IMPORT_STEP_CANCELED: final StringBuilder bufferCanceled = new StringBuilder(20); bufferCanceled.append(res.getString(R.string.gpx_import_canceled)); - fromActivity.showShortToast(bufferCanceled.toString()); + ActivityMixin.showShortToast(fromActivity, bufferCanceled.toString()); importFinished(); break; diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java index 7ea0a39..7d33769 100644 --- a/main/src/cgeo/geocaching/files/GPXParser.java +++ b/main/src/cgeo/geocaching/files/GPXParser.java @@ -1,13 +1,12 @@ package cgeo.geocaching.files; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.StoredList; import cgeo.geocaching.Trackable; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; @@ -17,6 +16,7 @@ import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; @@ -205,7 +205,7 @@ public abstract class GPXParser extends FileParser { // get text for string String stringName; try { - stringName = cgeoapplication.getInstance().getResources().getResourceName(stringId); + stringName = CgeoApplication.getInstance().getResources().getResourceName(stringId); } catch (final NullPointerException e) { return null; } @@ -272,7 +272,7 @@ public abstract class GPXParser extends FileParser { Double.valueOf(longitude))); } } - } catch (final Exception e) { + } catch (final NumberFormatException e) { Log.w("Failed to parse waypoint's latitude and/or longitude."); } } @@ -312,10 +312,10 @@ public abstract class GPXParser extends FileParser { // finally store the cache in the database result.add(geocode); - cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); // avoid the cachecache using lots of memory for caches which the user did not actually look at - cgData.removeAllFromCache(); + DataStore.removeAllFromCache(); showProgressMessage(progressHandler, progressStream.getProgress()); } else if (StringUtils.isNotBlank(cache.getName()) && StringUtils.containsIgnoreCase(type, "waypoint")) { @@ -331,7 +331,7 @@ public abstract class GPXParser extends FileParser { if (cache.getName().length() > 2) { final String cacheGeocodeForWaypoint = "GC" + cache.getName().substring(2).toUpperCase(Locale.US); // lookup cache for waypoint in already parsed caches - final Geocache cacheForWaypoint = cgData.loadCache(cacheGeocodeForWaypoint, LoadFlags.LOAD_CACHE_OR_DB); + final Geocache cacheForWaypoint = DataStore.loadCache(cacheGeocodeForWaypoint, LoadFlags.LOAD_CACHE_OR_DB); if (cacheForWaypoint != null) { final Waypoint waypoint = new Waypoint(cache.getShortDescription(), convertWaypointSym2Type(sym), false); waypoint.setId(-1); @@ -349,7 +349,7 @@ public abstract class GPXParser extends FileParser { newPoints.add(waypoint); Waypoint.mergeWayPoints(newPoints, mergedWayPoints, true); cacheForWaypoint.setWaypoints(newPoints, false); - cgData.saveCache(cacheForWaypoint, EnumSet.of(SaveFlag.SAVE_DB)); + DataStore.saveCache(cacheForWaypoint, EnumSet.of(SaveFlag.SAVE_DB)); showProgressMessage(progressHandler, progressStream.getProgress()); } } @@ -501,7 +501,7 @@ public abstract class GPXParser extends FileParser { if (attrs.getIndex("available") > -1) { cache.setDisabled(!attrs.getValue("available").equalsIgnoreCase("true")); } - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.w("Failed to parse cache attributes."); } } @@ -680,7 +680,7 @@ public abstract class GPXParser extends FileParser { if (attrs.getIndex("ref") > -1) { trackable.setGeocode(attrs.getValue("ref")); } - } catch (final Exception e) { + } catch (final RuntimeException e) { // nothing } } @@ -724,7 +724,7 @@ public abstract class GPXParser extends FileParser { if (attrs.getIndex("id") > -1) { log.id = Integer.parseInt(attrs.getValue("id")); } - } catch (final Exception e) { + } catch (final NumberFormatException e) { // nothing } } @@ -785,9 +785,8 @@ public abstract class GPXParser extends FileParser { try { progressStream = new ProgressInputStream(stream); Xml.parse(progressStream, Xml.Encoding.UTF_8, root.getContentHandler()); - return cgData.loadCaches(result, EnumSet.of(LoadFlag.LOAD_DB_MINIMAL)); + return DataStore.loadCaches(result, EnumSet.of(LoadFlag.LOAD_DB_MINIMAL)); } catch (final SAXException e) { - Log.w("Cannot parse .gpx file as GPX " + version + ": could not parse XML - ", e); throw new ParserException("Cannot parse .gpx file as GPX " + version + ": could not parse XML", e); } } diff --git a/main/src/cgeo/geocaching/files/LocParser.java b/main/src/cgeo/geocaching/files/LocParser.java index 1cfb2a3..3d01c1b 100644 --- a/main/src/cgeo/geocaching/files/LocParser.java +++ b/main/src/cgeo/geocaching/files/LocParser.java @@ -1,8 +1,8 @@ package cgeo.geocaching.files; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; @@ -59,7 +59,7 @@ public final class LocParser extends FileParser { contained.add(geocode); } } - Set<Geocache> caches = cgData.loadCaches(contained, LoadFlags.LOAD_CACHE_OR_DB); + Set<Geocache> caches = DataStore.loadCaches(contained, LoadFlags.LOAD_CACHE_OR_DB); for (Geocache cache : caches) { Geocache coord = cidCoords.get(cache.getGeocode()); copyCoordToCache(coord, cache); diff --git a/main/src/cgeo/geocaching/files/LocalStorage.java b/main/src/cgeo/geocaching/files/LocalStorage.java index de1908d..40684f8 100644 --- a/main/src/cgeo/geocaching/files/LocalStorage.java +++ b/main/src/cgeo/geocaching/files/LocalStorage.java @@ -1,15 +1,15 @@ package cgeo.geocaching.files; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.utils.CryptUtils; import cgeo.geocaching.utils.FileUtils; -import cgeo.geocaching.utils.IOUtils; import cgeo.geocaching.utils.Log; import ch.boye.httpclientandroidlib.Header; import ch.boye.httpclientandroidlib.HttpResponse; - +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.Nullable; import android.os.Environment; @@ -21,11 +21,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.Reader; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; @@ -86,7 +88,7 @@ public final class LocalStorage { private static File getInternalStorageBase() { if (internalStorageBase == null) { // A race condition will do no harm as the operation is idempotent. No need to synchronize. - internalStorageBase = cgeoapplication.getInstance().getApplicationContext().getFilesDir().getParentFile(); + internalStorageBase = CgeoApplication.getInstance().getApplicationContext().getFilesDir().getParentFile(); } return internalStorageBase; } @@ -205,13 +207,19 @@ public final class LocalStorage { return false; } - private static void saveHeader(final String name, final HttpResponse response, final File baseFile) { + private static void saveHeader(final String name, @Nullable final HttpResponse response, final File baseFile) { final Header header = response != null ? response.getFirstHeader(name) : null; final File file = filenameForHeader(baseFile, name); if (header == null) { FileUtils.deleteIgnoringFailure(file); } else { - saveToFile(new ByteArrayInputStream(header.getValue().getBytes()), file); + try { + saveToFile(new ByteArrayInputStream(header.getValue().getBytes("UTF-8")), file); + } catch (final UnsupportedEncodingException e) { + // Do not try to display the header in the log message, as our default encoding is + // likely to be UTF-8 and it will fail as well. + Log.e("LocalStorage.saveHeader: unable to decode header", e); + } } } @@ -226,12 +234,13 @@ public final class LocalStorage { * the name of the cached resource * @param name * the name of the header ("etag" or "last-modified") - * @return null if no value has been cached, the value otherwise + * @return the cached value, or <tt>null</tt> if none has been cached */ + @Nullable public static String getSavedHeader(final File baseFile, final String name) { try { final File file = filenameForHeader(baseFile, name); - final FileReader f = new FileReader(file); + final Reader f = new InputStreamReader(new FileInputStream(file), "UTF-8"); try { // No header will be more than 256 bytes final char[] value = new char[256]; @@ -417,10 +426,10 @@ public final class LocalStorage { storages.add(new File(extStorage)); File file = new File("/system/etc/vold.fstab"); if (file.canRead()) { - FileReader fr = null; + Reader fr = null; BufferedReader br = null; try { - fr = new FileReader(file); + fr = new InputStreamReader(new FileInputStream(file), "UTF-8"); br = new BufferedReader(fr); String s = br.readLine(); while (s != null) { diff --git a/main/src/cgeo/geocaching/files/SimpleDirChooser.java b/main/src/cgeo/geocaching/files/SimpleDirChooser.java index cf969dc..2d3565a 100644 --- a/main/src/cgeo/geocaching/files/SimpleDirChooser.java +++ b/main/src/cgeo/geocaching/files/SimpleDirChooser.java @@ -93,7 +93,7 @@ public class SimpleDirChooser extends AbstractListActivity { for (File currentDir : dirs) { listDirs.add(new Option(currentDir.getName(), currentDir.getAbsolutePath())); } - } catch (Exception e) { + } catch (RuntimeException e) { } Collections.sort(listDirs); if (dir.getParent() != null) { @@ -197,6 +197,9 @@ public class SimpleDirChooser extends AbstractListActivity { } } + /** + * Note: this class has a natural ordering that is inconsistent with equals. + */ public static class Option implements Comparable<Option> { private final String name; private final String path; diff --git a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java index 96d256a..cafb92b 100644 --- a/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java +++ b/main/src/cgeo/geocaching/filter/AbstractRangeFilter.java @@ -1,6 +1,6 @@ package cgeo.geocaching.filter; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; abstract class AbstractRangeFilter extends AbstractFilter { @@ -9,7 +9,7 @@ abstract class AbstractRangeFilter extends AbstractFilter { protected final float rangeMax; protected AbstractRangeFilter(final int ressourceId, final int range) { - super(cgeoapplication.getInstance().getResources().getString(ressourceId) + ' ' + (range == 5 ? '5' : range + " + " + String.format("%.1f", range + 0.5))); + super(CgeoApplication.getInstance().getResources().getString(ressourceId) + ' ' + (range == 5 ? '5' : range + " + " + String.format("%.1f", range + 0.5))); this.rangeMin = range; rangeMax = rangeMin + 1f; } diff --git a/main/src/cgeo/geocaching/filter/AttributeFilter.java b/main/src/cgeo/geocaching/filter/AttributeFilter.java index cadcf49..6f0d5da 100644 --- a/main/src/cgeo/geocaching/filter/AttributeFilter.java +++ b/main/src/cgeo/geocaching/filter/AttributeFilter.java @@ -1,9 +1,9 @@ package cgeo.geocaching.filter; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.LoadFlags.LoadFlag; import android.content.res.Resources; @@ -29,7 +29,7 @@ class AttributeFilter extends AbstractFilter { @Override public boolean accepts(final Geocache cache) { - Geocache fullCache = cgData.loadCache(cache.getGeocode(), EnumSet.of(LoadFlag.LOAD_ATTRIBUTES)); + Geocache fullCache = DataStore.loadCache(cache.getGeocode(), EnumSet.of(LoadFlag.LOAD_ATTRIBUTES)); if (fullCache == null) { fullCache = cache; } @@ -40,8 +40,8 @@ class AttributeFilter extends AbstractFilter { @Override public List<IFilter> getFilters() { - final String packageName = cgeoapplication.getInstance().getBaseContext().getPackageName(); - final Resources res = cgeoapplication.getInstance().getResources(); + final String packageName = CgeoApplication.getInstance().getBaseContext().getPackageName(); + final Resources res = CgeoApplication.getInstance().getResources(); final List<IFilter> filters = new LinkedList<IFilter>(); for (final String id: res.getStringArray(R.array.attribute_ids)) { diff --git a/main/src/cgeo/geocaching/filter/DistanceFilter.java b/main/src/cgeo/geocaching/filter/DistanceFilter.java index 2f39473..54225d2 100644 --- a/main/src/cgeo/geocaching/filter/DistanceFilter.java +++ b/main/src/cgeo/geocaching/filter/DistanceFilter.java @@ -3,7 +3,7 @@ package cgeo.geocaching.filter; import cgeo.geocaching.Geocache; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.geopoint.Geopoint; import java.util.ArrayList; @@ -18,7 +18,7 @@ class DistanceFilter extends AbstractFilter { super(name); this.minDistance = minDistance; this.maxDistance = maxDistance; - geo = cgeoapplication.getInstance().currentGeo(); + geo = CgeoApplication.getInstance().currentGeo(); } @Override @@ -27,7 +27,7 @@ class DistanceFilter extends AbstractFilter { final Geopoint coords = cache.getCoords(); if (coords == null) { // If a cache has no coordinates, consider it to be out of range. It will - // happen with archived cache. + // happen with archived caches. return false; } final float distance = currentPos.distanceTo(coords); @@ -50,8 +50,8 @@ class DistanceFilter extends AbstractFilter { else { maxRange = Integer.MAX_VALUE; } - final String range = maxRange == Integer.MAX_VALUE ? "> " + String.valueOf(minRange) : String.valueOf(minRange) + " - " + String.valueOf(maxRange); - final String name = cgeoapplication.getInstance().getResources().getQuantityString(R.plurals.tts_kilometers, maxRange, range); + final String range = maxRange == Integer.MAX_VALUE ? "> " + minRange : minRange + " - " + maxRange; + final String name = CgeoApplication.getInstance().getResources().getQuantityString(R.plurals.tts_kilometers, maxRange, range); filters.add(new DistanceFilter(name, minRange, maxRange)); } return filters; diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java index 2404f44..8ff700a 100644 --- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java +++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java @@ -1,7 +1,7 @@ package cgeo.geocaching.filter; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; @@ -41,7 +41,7 @@ public final class FilterUserInterface { public FilterUserInterface(final Activity activity) { this.activity = activity; - this.res = cgeoapplication.getInstance().getResources(); + this.res = CgeoApplication.getInstance().getResources(); registry = new ArrayList<FactoryEntry>(); if (Settings.getCacheType() == CacheType.ALL) { diff --git a/main/src/cgeo/geocaching/filter/ModifiedFilter.java b/main/src/cgeo/geocaching/filter/ModifiedFilter.java index 74befda..d976b69 100644 --- a/main/src/cgeo/geocaching/filter/ModifiedFilter.java +++ b/main/src/cgeo/geocaching/filter/ModifiedFilter.java @@ -2,7 +2,7 @@ package cgeo.geocaching.filter; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import java.util.Collections; import java.util.List; @@ -10,7 +10,7 @@ import java.util.List; class ModifiedFilter extends AbstractFilter implements IFilterFactory { public ModifiedFilter() { - super(cgeoapplication.getInstance().getString(R.string.caches_filter_modified)); + super(CgeoApplication.getInstance().getString(R.string.caches_filter_modified)); } @Override diff --git a/main/src/cgeo/geocaching/filter/StateFilter.java b/main/src/cgeo/geocaching/filter/StateFilter.java index 98589ab..d5b3027 100644 --- a/main/src/cgeo/geocaching/filter/StateFilter.java +++ b/main/src/cgeo/geocaching/filter/StateFilter.java @@ -1,8 +1,8 @@ package cgeo.geocaching.filter; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import android.content.res.Resources; @@ -13,7 +13,7 @@ import java.util.List; abstract class StateFilter extends AbstractFilter { - static final Resources res = cgeoapplication.getInstance().getResources(); + static final Resources res = CgeoApplication.getInstance().getResources(); protected StateFilter(final String name) { super(name); diff --git a/main/src/cgeo/geocaching/filter/TrackablesFilter.java b/main/src/cgeo/geocaching/filter/TrackablesFilter.java index 74f43be..d836a0f 100644 --- a/main/src/cgeo/geocaching/filter/TrackablesFilter.java +++ b/main/src/cgeo/geocaching/filter/TrackablesFilter.java @@ -1,15 +1,15 @@ package cgeo.geocaching.filter; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import java.util.Collections; import java.util.List; class TrackablesFilter extends AbstractFilter implements IFilterFactory { public TrackablesFilter() { - super(cgeoapplication.getInstance().getString(R.string.caches_filter_track)); + super(CgeoApplication.getInstance().getString(R.string.caches_filter_track)); } @Override diff --git a/main/src/cgeo/geocaching/gcvote/GCVote.java b/main/src/cgeo/geocaching/gcvote/GCVote.java index 868be2b..b245aa9 100644 --- a/main/src/cgeo/geocaching/gcvote/GCVote.java +++ b/main/src/cgeo/geocaching/gcvote/GCVote.java @@ -8,7 +8,7 @@ import cgeo.geocaching.utils.LeastRecentlyUsedMap; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -16,20 +16,28 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; public final class GCVote { - private static final Pattern patternLogIn = Pattern.compile("loggedIn='([^']+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternGuid = Pattern.compile("cacheId='([^']+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternWaypoint = Pattern.compile("waypoint='([^']+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternRating = Pattern.compile("voteAvg='([0-9.]+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternVotes = Pattern.compile("voteCnt='([0-9]+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternVote = Pattern.compile("voteUser='([0-9.]+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternVoteElement = Pattern.compile("<vote ([^>]+)>", Pattern.CASE_INSENSITIVE); + public static final float NO_RATING = 0; + private static final Pattern PATTERN_LOG_IN = Pattern.compile("loggedIn='([^']+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_GUID = Pattern.compile("cacheId='([^']+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_WAYPOINT = Pattern.compile("waypoint='([^']+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_RATING = Pattern.compile("voteAvg='([0-9.]+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_VOTES = Pattern.compile("voteCnt='([0-9]+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_VOTE = Pattern.compile("voteUser='([0-9.]+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_VOTE_ELEMENT = Pattern.compile("<vote ([^>]+)>", Pattern.CASE_INSENSITIVE); private static final int MAX_CACHED_RATINGS = 1000; - private static LeastRecentlyUsedMap<String, GCVoteRating> ratingsCache = new LeastRecentlyUsedMap.LruCache<String, GCVoteRating>(MAX_CACHED_RATINGS); + private static final LeastRecentlyUsedMap<String, GCVoteRating> RATINGS_CACHE = new LeastRecentlyUsedMap.LruCache<String, GCVoteRating>(MAX_CACHED_RATINGS); + private static final float MIN_RATING = 1; + private static final float MAX_RATING = 5; + + private GCVote() { + // utility class + } /** * Get user rating for a given guid or geocode. For a guid first the ratings cache is checked @@ -39,9 +47,9 @@ public final class GCVote { * @param geocode * @return */ - public static GCVoteRating getRating(String guid, String geocode) { - if (StringUtils.isNotBlank(guid) && ratingsCache.containsKey(guid)) { - return ratingsCache.get(guid); + public static GCVoteRating getRating(final String guid, final String geocode) { + if (StringUtils.isNotBlank(guid) && RATINGS_CACHE.containsKey(guid)) { + return RATINGS_CACHE.get(guid); } final Map<String, GCVoteRating> ratings = getRating(singletonOrNull(guid), singletonOrNull(geocode)); @@ -59,7 +67,7 @@ public final class GCVote { * @param geocodes * @return */ - public static Map<String, GCVoteRating> getRating(List<String> guids, List<String> geocodes) { + public static Map<String, GCVoteRating> getRating(final List<String> guids, final List<String> geocodes) { if (guids == null && geocodes == null) { return null; } @@ -88,7 +96,7 @@ public final class GCVote { return null; } - final MatcherWrapper matcherVoteElement = new MatcherWrapper(patternVoteElement, page); + final MatcherWrapper matcherVoteElement = new MatcherWrapper(PATTERN_VOTE_ELEMENT, page); while (matcherVoteElement.find()) { String voteData = matcherVoteElement.group(1); if (voteData == null) { @@ -97,29 +105,21 @@ public final class GCVote { String id = null; String guid = null; - try { - final MatcherWrapper matcherGuid = new MatcherWrapper(patternGuid, voteData); - if (matcherGuid.find()) { - if (matcherGuid.groupCount() > 0) { - guid = matcherGuid.group(1); - if (requestByGuids) { - id = guid; - } + final MatcherWrapper matcherGuid = new MatcherWrapper(PATTERN_GUID, voteData); + if (matcherGuid.find()) { + if (matcherGuid.groupCount() > 0) { + guid = matcherGuid.group(1); + if (requestByGuids) { + id = guid; } } - } catch (Exception e) { - Log.w("GCVote.getRating: Failed to parse guid"); } if (!requestByGuids) { - try { - final MatcherWrapper matcherWp = new MatcherWrapper(patternWaypoint, voteData); - if (matcherWp.find()) { - if (matcherWp.groupCount() > 0) { - id = matcherWp.group(1); - } + final MatcherWrapper matcherWp = new MatcherWrapper(PATTERN_WAYPOINT, voteData); + if (matcherWp.find()) { + if (matcherWp.groupCount() > 0) { + id = matcherWp.group(1); } - } catch (Exception e) { - Log.w("GCVote.getRating: Failed to parse waypoint"); } } if (id == null) { @@ -127,53 +127,49 @@ public final class GCVote { } boolean loggedIn = false; - try { - final MatcherWrapper matcherLoggedIn = new MatcherWrapper(patternLogIn, page); - if (matcherLoggedIn.find()) { - if (matcherLoggedIn.groupCount() > 0) { - if (matcherLoggedIn.group(1).equalsIgnoreCase("true")) { - loggedIn = true; - } + final MatcherWrapper matcherLoggedIn = new MatcherWrapper(PATTERN_LOG_IN, page); + if (matcherLoggedIn.find()) { + if (matcherLoggedIn.groupCount() > 0) { + if (matcherLoggedIn.group(1).equalsIgnoreCase("true")) { + loggedIn = true; } } - } catch (Exception e) { - Log.w("GCVote.getRating: Failed to parse loggedIn"); } - float rating = 0; + float rating = NO_RATING; try { - final MatcherWrapper matcherRating = new MatcherWrapper(patternRating, voteData); + final MatcherWrapper matcherRating = new MatcherWrapper(PATTERN_RATING, voteData); if (matcherRating.find()) { rating = Float.parseFloat(matcherRating.group(1)); } - } catch (Exception e) { + } catch (NumberFormatException e) { Log.w("GCVote.getRating: Failed to parse rating"); } - if (rating <= 0) { + if (!isValidRating(rating)) { continue; } int votes = -1; try { - final MatcherWrapper matcherVotes = new MatcherWrapper(patternVotes, voteData); + final MatcherWrapper matcherVotes = new MatcherWrapper(PATTERN_VOTES, voteData); if (matcherVotes.find()) { votes = Integer.parseInt(matcherVotes.group(1)); } - } catch (Exception e) { + } catch (NumberFormatException e) { Log.w("GCVote.getRating: Failed to parse vote count"); } if (votes < 0) { continue; } - float myVote = 0; + float myVote = NO_RATING; if (loggedIn) { try { - final MatcherWrapper matcherVote = new MatcherWrapper(patternVote, voteData); + final MatcherWrapper matcherVote = new MatcherWrapper(PATTERN_VOTE, voteData); if (matcherVote.find()) { myVote = Float.parseFloat(matcherVote.group(1)); } - } catch (Exception e) { + } catch (NumberFormatException e) { Log.w("GCVote.getRating: Failed to parse user's vote"); } } @@ -181,10 +177,10 @@ public final class GCVote { if (StringUtils.isNotBlank(id)) { GCVoteRating gcvoteRating = new GCVoteRating(rating, votes, myVote); ratings.put(id, gcvoteRating); - ratingsCache.put(guid, gcvoteRating); + RATINGS_CACHE.put(guid, gcvoteRating); } } - } catch (Exception e) { + } catch (RuntimeException e) { Log.e("GCVote.getRating", e); } @@ -198,18 +194,11 @@ public final class GCVote { * @param vote * @return {@code true} if the rating was submitted successfully */ - public static boolean setRating(Geocache cache, double vote) { - if (!Settings.isGCvoteLogin()) { - return false; - } - if (!cache.supportsGCVote()) { + public static boolean setRating(final Geocache cache, final float vote) { + if (!isVotingPossible(cache)) { return false; } - String guid = cache.getGuid(); - if (StringUtils.isBlank(guid)) { - return false; - } - if (vote <= 0.0 || vote > 5.0) { + if (!isValidRating(vote)) { return false; } @@ -221,16 +210,16 @@ public final class GCVote { final Parameters params = new Parameters( "userName", login.left, "password", login.right, - "cacheId", guid, + "cacheId", cache.getGuid(), "voteUser", String.format("%.1f", vote).replace(',', '.'), "version", "cgeo"); final String result = Network.getResponseData(Network.getRequest("http://gcvote.com/setVote.php", params)); - return result.trim().equalsIgnoreCase("ok"); + return result != null && result.trim().equalsIgnoreCase("ok"); } - public static void loadRatings(ArrayList<Geocache> caches) { + public static void loadRatings(final ArrayList<Geocache> caches) { if (!Settings.isRatingWanted()) { return; } @@ -266,4 +255,17 @@ public final class GCVote { Log.e("GCvote.loadRatings", e); } } + + public static boolean isValidRating(final float rating) { + return rating >= MIN_RATING && rating <= MAX_RATING; + } + + public static String getRatingText(final float rating) { + return String.format(Locale.getDefault(), "%.1f", rating); + } + + public static boolean isVotingPossible(final Geocache cache) { + return Settings.isGCvoteLogin() && StringUtils.isNotBlank(cache.getGuid()) && cache.supportsGCVote(); + } + } diff --git a/main/src/cgeo/geocaching/gcvote/GCVoteRating.java b/main/src/cgeo/geocaching/gcvote/GCVoteRating.java index f6813a2..1e65589 100644 --- a/main/src/cgeo/geocaching/gcvote/GCVoteRating.java +++ b/main/src/cgeo/geocaching/gcvote/GCVoteRating.java @@ -5,7 +5,7 @@ public final class GCVoteRating { private final int votes; private final float myVote; - public GCVoteRating(float rating, int votes, float myVote) { + public GCVoteRating(final float rating, final int votes, final float myVote) { this.rating = rating; this.votes = votes; this.myVote = myVote; diff --git a/main/src/cgeo/geocaching/list/AbstractList.java b/main/src/cgeo/geocaching/list/AbstractList.java new file mode 100644 index 0000000..ec783eb --- /dev/null +++ b/main/src/cgeo/geocaching/list/AbstractList.java @@ -0,0 +1,28 @@ +package cgeo.geocaching.list; + +import org.eclipse.jdt.annotation.Nullable; + +import android.util.SparseArray; + +public abstract class AbstractList { + + public final int id; + public final String title; + private static SparseArray<AbstractList> LISTS = new SparseArray<AbstractList>(); + + public AbstractList(final int id, final String title) { + this.id = id; + this.title = title; + LISTS.put(id, this); + } + + public abstract String getTitleAndCount(); + + public abstract boolean isConcrete(); + + @Nullable + public static AbstractList getListById(int listId) { + return LISTS.get(listId); + } + +} diff --git a/main/src/cgeo/geocaching/list/PseudoList.java b/main/src/cgeo/geocaching/list/PseudoList.java new file mode 100644 index 0000000..365d6fd --- /dev/null +++ b/main/src/cgeo/geocaching/list/PseudoList.java @@ -0,0 +1,37 @@ +package cgeo.geocaching.list; + +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.R; + +public class PseudoList extends AbstractList { + + private static final int ALL_LIST_ID = 2; + /** + * list entry to show all caches + */ + public static final PseudoList ALL_LIST = new PseudoList(ALL_LIST_ID, R.string.list_all_lists); + + private static final int NEW_LIST_ID = 3; + /** + * list entry to create a new list + */ + public static final AbstractList NEW_LIST = new PseudoList(NEW_LIST_ID, R.string.list_menu_create); + + /** + * private constructor to have all instances as constants in the class + */ + private PseudoList(int id, final int titleResourceId) { + super(id, CgeoApplication.getInstance().getResources().getString(titleResourceId)); + } + + @Override + public String getTitleAndCount() { + return "<" + title + ">"; + } + + @Override + public boolean isConcrete() { + return false; + } + +} diff --git a/main/src/cgeo/geocaching/StoredList.java b/main/src/cgeo/geocaching/list/StoredList.java index 4946420..d3729c0 100644 --- a/main/src/cgeo/geocaching/StoredList.java +++ b/main/src/cgeo/geocaching/list/StoredList.java @@ -1,9 +1,13 @@ -package cgeo.geocaching; +package cgeo.geocaching.list; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; +import cgeo.geocaching.R; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.utils.RunnableWithArgument; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; import android.app.Activity; import android.app.AlertDialog; @@ -18,21 +22,18 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -public final class StoredList { +public final class StoredList extends AbstractList { public static final int TEMPORARY_LIST_ID = 0; + public static final StoredList TEMPORARY_LIST = new StoredList(TEMPORARY_LIST_ID, "<temporary>", 0); // Never displayed public static final int STANDARD_LIST_ID = 1; - public static final int ALL_LIST_ID = 2; - - public final int id; - public final String title; private final int count; // this value is only valid as long as the list is not changed by other database operations public StoredList(int id, String title, int count) { - this.id = id; - this.title = title; + super(id, title); this.count = count; } + @Override public String getTitleAndCount() { return title + " [" + count + "]"; } @@ -58,45 +59,43 @@ public final class StoredList { public static class UserInterface { private final Activity activity; - private final cgeoapplication app; + private final CgeoApplication app; private final Resources res; public UserInterface(final Activity activity) { this.activity = activity; - app = cgeoapplication.getInstance(); + app = CgeoApplication.getInstance(); res = app.getResources(); } - public void promptForListSelection(final int titleId, final RunnableWithArgument<Integer> runAfterwards) { + public void promptForListSelection(final int titleId, @NonNull final RunnableWithArgument<Integer> runAfterwards) { promptForListSelection(titleId, runAfterwards, false, -1); } - public void promptForListSelection(final int titleId, final RunnableWithArgument<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId) { + public void promptForListSelection(final int titleId, @NonNull final RunnableWithArgument<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId) { promptForListSelection(titleId, runAfterwards, onlyConcreteLists, exceptListId, StringUtils.EMPTY); } - public void promptForListSelection(final int titleId, final RunnableWithArgument<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId, final String newListName) { - final List<StoredList> lists = getSortedLists(); - - if (lists == null) { - return; - } + public void promptForListSelection(final int titleId, @NonNull final RunnableWithArgument<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId, final String newListName) { + final List<AbstractList> lists = new ArrayList<AbstractList>(); + lists.addAll(getSortedLists()); if (exceptListId > StoredList.TEMPORARY_LIST_ID) { - StoredList exceptList = cgData.getList(exceptListId); + StoredList exceptList = DataStore.getList(exceptListId); if (exceptList != null) { lists.remove(exceptList); } } + if (!onlyConcreteLists) { + lists.add(PseudoList.ALL_LIST); + } + lists.add(PseudoList.NEW_LIST); + final List<CharSequence> listsTitle = new ArrayList<CharSequence>(); - for (StoredList list : lists) { + for (AbstractList list : lists) { listsTitle.add(list.getTitleAndCount()); } - if (!onlyConcreteLists) { - listsTitle.add("<" + res.getString(R.string.list_menu_all_lists) + ">"); - } - listsTitle.add("<" + res.getString(R.string.list_menu_create) + ">"); final CharSequence[] items = new CharSequence[listsTitle.size()]; @@ -105,26 +104,23 @@ public final class StoredList { builder.setItems(listsTitle.toArray(items), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int itemId) { - if (itemId == lists.size() && !onlyConcreteLists) { - // all lists - runAfterwards.run(StoredList.ALL_LIST_ID); - } else if (itemId >= lists.size()) { + final AbstractList list = lists.get(itemId); + if (list == PseudoList.NEW_LIST) { // create new list on the fly promptForListCreation(runAfterwards, newListName); } else { - if (runAfterwards != null) { - runAfterwards.run(lists.get(itemId).id); - } + runAfterwards.run(lists.get(itemId).id); } } }); builder.create().show(); } + @NonNull private static List<StoredList> getSortedLists() { final Collator collator = Collator.getInstance(); - final List<StoredList> lists = cgData.getLists(); + final List<StoredList> lists = DataStore.getLists(); Collections.sort(lists, new Comparator<StoredList>() { @Override @@ -143,18 +139,17 @@ public final class StoredList { return lists; } - public void promptForListCreation(final RunnableWithArgument<Integer> runAfterwards, String newListName) { + public void promptForListCreation(@NonNull final RunnableWithArgument<Integer> runAfterwards, String newListName) { handleListNameInput(newListName, R.string.list_dialog_create_title, R.string.list_dialog_create, new RunnableWithArgument<String>() { @Override public void run(final String listName) { - final int newId = cgData.createList(listName); + final int newId = DataStore.createList(listName); + new StoredList(newId, listName, 0); - if (newId >= cgData.customListIdOffset) { + if (newId >= DataStore.customListIdOffset) { ActivityMixin.showToast(activity, res.getString(R.string.list_dialog_create_ok)); - if (runAfterwards != null) { - runAfterwards.run(newId); - } + runAfterwards.run(newId); } else { ActivityMixin.showToast(activity, res.getString(R.string.list_dialog_create_err)); } @@ -190,16 +185,14 @@ public final class StoredList { alert.show(); } - public void promptForListRename(final int listId, final Runnable runAfterRename) { - final StoredList list = cgData.getList(listId); + public void promptForListRename(final int listId, @NonNull final Runnable runAfterRename) { + final StoredList list = DataStore.getList(listId); handleListNameInput(list.title, R.string.list_dialog_rename_title, R.string.list_dialog_rename, new RunnableWithArgument<String>() { @Override public void run(final String listName) { - cgData.renameList(listId, listName); - if (runAfterRename != null) { - runAfterRename.run(); - } + DataStore.renameList(listId, listName); + runAfterRename.run(); } }); } @@ -218,9 +211,15 @@ public final class StoredList { * Return the given list, if it is a concrete list. Return the default list otherwise. */ public static int getConcreteList(int listId) { - if (listId == ALL_LIST_ID || listId == TEMPORARY_LIST_ID) { + if (listId == PseudoList.ALL_LIST.id || listId == TEMPORARY_LIST_ID) { return STANDARD_LIST_ID; } return listId; } + + @Override + public boolean isConcrete() { + return true; + } + } diff --git a/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java index 722f9f5..605f461 100644 --- a/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java @@ -1,8 +1,8 @@ package cgeo.geocaching.loaders; +import cgeo.geocaching.DataStore; import cgeo.geocaching.SearchResult; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.geopoint.Geopoint; @@ -18,7 +18,7 @@ public class HistoryGeocacheListLoader extends AbstractSearchLoader { @Override public SearchResult runSearch() { - return cgData.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL); + return DataStore.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL); } } diff --git a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java index ab8ba6a..5088484 100644 --- a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java @@ -2,7 +2,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.cgData; +import cgeo.geocaching.DataStore; import cgeo.geocaching.geopoint.Geopoint; import android.content.Context; @@ -20,7 +20,7 @@ public class OfflineGeocacheListLoader extends AbstractSearchLoader { @Override public SearchResult runSearch() { - return cgData.getBatchOfStoredCaches(searchCenter, Settings.getCacheType(), listId); + return DataStore.getBatchOfStoredCaches(searchCenter, Settings.getCacheType(), listId); } public void setListId(int listId) { diff --git a/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java b/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java index 2229afe..8ca0fa5 100644 --- a/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java +++ b/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java @@ -1,8 +1,8 @@ package cgeo.geocaching.loaders; +import cgeo.geocaching.DataStore; import cgeo.geocaching.SearchResult; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.geopoint.Geopoint; @@ -21,8 +21,8 @@ public class RemoveFromHistoryLoader extends AbstractSearchLoader { @Override public SearchResult runSearch() { - cgData.clearVisitDate(selected); - return cgData.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL); + DataStore.clearVisitDate(selected); + return DataStore.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL); } } diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 0817170..a32a669 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -1,15 +1,14 @@ package cgeo.geocaching.maps; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.DirectionProvider; import cgeo.geocaching.Geocache; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.StoredList; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; -import cgeo.geocaching.cgeocaches; +import cgeo.geocaching.DataStore; +import cgeo.geocaching.CacheListActivity; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.gc.Login; @@ -22,6 +21,7 @@ import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.maps.interfaces.CachesOverlayItemImpl; import cgeo.geocaching.maps.interfaces.GeoPointImpl; import cgeo.geocaching.maps.interfaces.MapActivityImpl; @@ -40,7 +40,7 @@ import cgeo.geocaching.utils.LeastRecentlyUsedSet; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -128,7 +128,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto private MapItemFactory mapItemFactory = null; private Activity activity = null; private MapViewImpl mapView = null; - private cgeoapplication app = null; + private CgeoApplication app = null; final private GeoDirHandler geoDirUpdate = new UpdateLoc(); private SearchResult searchIntent = null; private String geocodeIntent = null; @@ -359,9 +359,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // class init res = this.getResources(); activity = this.getActivity(); - app = (cgeoapplication) activity.getApplication(); + app = (CgeoApplication) activity.getApplication(); - int countBubbleCnt = cgData.getAllCachesCount(); + int countBubbleCnt = DataStore.getAllCachesCount(); caches = new LeastRecentlyUsedSet<Geocache>(MAX_CACHES + countBubbleCnt); final MapProvider mapProvider = Settings.getMapProvider(); @@ -491,7 +491,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (!CollectionUtils.isEmpty(dirtyCaches)) { for (String geocode : dirtyCaches) { - Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); + Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); if (cache != null) { // new collection type needs to remove first caches.remove(cache); @@ -609,7 +609,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto default: // DETAILED menu.findItem(R.id.menu_strategy_detailed).setChecked(true); } - } catch (Exception e) { + } catch (RuntimeException e) { Log.e("CGeoMap.onPrepareOptionsMenu", e); } @@ -641,7 +641,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto final List<String> geocodes = new ArrayList<String>(); for (final String geocode : geocodesInViewport) { - if (!cgData.isOffline(geocode, null)) { + if (!DataStore.isOffline(geocode, null)) { geocodes.add(geocode); } } @@ -690,7 +690,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto selectMapTheme(); return true; case R.id.menu_as_list: { - cgeocaches.startActivityMap(activity, new SearchResult(getGeocodesForCachesInViewport())); + CacheListActivity.startActivityMap(activity, new SearchResult(getGeocodesForCachesInViewport())); return true; } case R.id.menu_strategy_fastest: { @@ -948,7 +948,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto mapView.repaintRequired(overlayPosition); } } - } catch (Exception e) { + } catch (RuntimeException e) { Log.w("Failed to update location."); } } @@ -1090,7 +1090,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto SearchResult searchResult; if (mapMode == MapMode.LIVE) { - searchResult = isLiveEnabled ? new SearchResult() : new SearchResult(cgData.loadStoredInViewport(viewport, Settings.getCacheType())); + searchResult = isLiveEnabled ? new SearchResult() : new SearchResult(DataStore.loadStoredInViewport(viewport, Settings.getCacheType())); } else { // map started from another activity searchResult = searchIntent != null ? new SearchResult(searchIntent) : new SearchResult(); @@ -1100,7 +1100,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } // live mode search result if (isLiveEnabled) { - searchResult.addSearchResult(cgData.loadCachedInViewport(viewport, Settings.getCacheType())); + searchResult.addSearchResult(DataStore.loadCachedInViewport(viewport, Settings.getCacheType())); } downloaded = true; @@ -1123,7 +1123,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto || mapMode == MapMode.COORDS) { //All visible waypoints CacheType type = Settings.getCacheType(); - Set<Waypoint> waypointsInViewport = cgData.loadWaypoints(viewport, excludeMine, excludeDisabled, type); + Set<Waypoint> waypointsInViewport = DataStore.loadWaypoints(viewport, excludeMine, excludeDisabled, type); waypoints.addAll(waypointsInViewport); } else { @@ -1196,8 +1196,8 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // first remove filtered out final Set<String> filteredCodes = searchResult.getFilteredGeocodes(); Log.d("Filtering out " + filteredCodes.size() + " caches: " + filteredCodes.toString()); - caches.removeAll(cgData.loadCaches(filteredCodes, LoadFlags.LOAD_CACHE_ONLY)); - cgData.removeCaches(filteredCodes, EnumSet.of(RemoveFlag.REMOVE_CACHE)); + caches.removeAll(DataStore.loadCaches(filteredCodes, LoadFlags.LOAD_CACHE_ONLY)); + DataStore.removeCaches(filteredCodes, EnumSet.of(RemoveFlag.REMOVE_CACHE)); // new collection type needs to remove first to refresh caches.removeAll(result); caches.addAll(result); @@ -1409,7 +1409,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto break; } - if (!cgData.isOffline(geocode, null)) { + if (!DataStore.isOffline(geocode, null)) { if ((System.currentTimeMillis() - last) < 1500) { try { int delay = 1000 + (int) (Math.random() * 1000.0) - (int) (System.currentTimeMillis() - last); @@ -1418,7 +1418,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } sleep(delay); - } catch (Exception e) { + } catch (InterruptedException e) { // nothing } } @@ -1501,7 +1501,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto try { mapController.setCenter(mapItemFactory.getGeoPointBase(new Geopoint(mapState[0] / 1.0e6, mapState[1] / 1.0e6))); mapController.setZoom(mapState[2]); - } catch (Exception e) { + } catch (RuntimeException e) { // nothing at all } @@ -1512,9 +1512,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto Viewport viewport = null; if (geocodeCenter != null) { - viewport = cgData.getBounds(geocodeCenter); + viewport = DataStore.getBounds(geocodeCenter); } else if (searchCenter != null) { - viewport = cgData.getBounds(searchCenter.getGeocodes()); + viewport = DataStore.getBounds(searchCenter.getGeocodes()); } if (viewport == null) { @@ -1525,7 +1525,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (viewport.getLatitudeSpan() != 0 && viewport.getLongitudeSpan() != 0) { mapController.zoomToSpan((int) (viewport.getLatitudeSpan() * 1e6), (int) (viewport.getLongitudeSpan() * 1e6)); } - } catch (Exception e) { + } catch (RuntimeException e) { // nothing at all } diff --git a/main/src/cgeo/geocaching/maps/CachesOverlay.java b/main/src/cgeo/geocaching/maps/CachesOverlay.java index 8e117eb..cd2ff75 100644 --- a/main/src/cgeo/geocaching/maps/CachesOverlay.java +++ b/main/src/cgeo/geocaching/maps/CachesOverlay.java @@ -4,9 +4,8 @@ import cgeo.geocaching.CachePopup; import cgeo.geocaching.Geocache; import cgeo.geocaching.IWaypoint; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.WaypointPopup; -import cgeo.geocaching.cgData; +import cgeo.geocaching.DataStore; import cgeo.geocaching.activity.Progress; import cgeo.geocaching.connector.gc.GCMap; import cgeo.geocaching.enumerations.CacheType; @@ -19,11 +18,13 @@ import cgeo.geocaching.maps.interfaces.MapItemFactory; import cgeo.geocaching.maps.interfaces.MapProjectionImpl; import cgeo.geocaching.maps.interfaces.MapProvider; import cgeo.geocaching.maps.interfaces.MapViewImpl; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; import android.content.Context; +import android.content.res.Resources.NotFoundException; import android.graphics.Canvas; import android.graphics.DashPathEffect; import android.graphics.Paint; @@ -121,6 +122,8 @@ public class CachesOverlay extends AbstractItemizedOverlay { try { lazyInitializeDrawingObjects(); canvas.setDrawFilter(setFilter); + final int height = canvas.getHeight(); + final int width = canvas.getWidth(); final int radius = calculateDrawingRadius(projection); final Point center = new Point(); @@ -130,16 +133,17 @@ public class CachesOverlay extends AbstractItemizedOverlay { final Geopoint itemCoord = item.getCoord().getCoords(); final GeoPointImpl itemGeo = mapItemFactory.getGeoPointBase(itemCoord); projection.toPixels(itemGeo, center); - - // dashed circle around the waypoint - blockedCircle.setColor(0x66BB0000); - blockedCircle.setStyle(Style.STROKE); - canvas.drawCircle(center.x, center.y, radius, blockedCircle); - - // filling the circle area with a transparent color - blockedCircle.setColor(0x44BB0000); - blockedCircle.setStyle(Style.FILL); - canvas.drawCircle(center.x, center.y, radius, blockedCircle); + if (center.x > -radius && center.y > -radius && center.x < width + radius && center.y < height + radius) { + // dashed circle around the waypoint + blockedCircle.setColor(0x66BB0000); + blockedCircle.setStyle(Style.STROKE); + canvas.drawCircle(center.x, center.y, radius, blockedCircle); + + // filling the circle area with a transparent color + blockedCircle.setColor(0x44BB0000); + blockedCircle.setStyle(Style.FILL); + canvas.drawCircle(center.x, center.y, radius, blockedCircle); + } } } canvas.setDrawFilter(removeFilter); @@ -224,7 +228,7 @@ public class CachesOverlay extends AbstractItemizedOverlay { final IWaypoint coordinate = item.getCoord(); if (StringUtils.isNotBlank(coordinate.getCoordType()) && coordinate.getCoordType().equalsIgnoreCase("cache") && StringUtils.isNotBlank(coordinate.getGeocode())) { - Geocache cache = cgData.loadCache(coordinate.getGeocode(), LoadFlags.LOAD_CACHE_OR_DB); + Geocache cache = DataStore.loadCache(coordinate.getGeocode(), LoadFlags.LOAD_CACHE_OR_DB); RequestDetailsThread requestDetailsThread = new RequestDetailsThread(cache); if (!requestDetailsThread.requestRequired()) { // don't show popup if we have enough details @@ -243,7 +247,7 @@ public class CachesOverlay extends AbstractItemizedOverlay { } progress.dismiss(); - } catch (Exception e) { + } catch (NotFoundException e) { Log.e("CachesOverlay.onTap", e); if (progress != null) { progress.dismiss(); diff --git a/main/src/cgeo/geocaching/maps/MapProviderFactory.java b/main/src/cgeo/geocaching/maps/MapProviderFactory.java index a03fc47..2e43e19 100644 --- a/main/src/cgeo/geocaching/maps/MapProviderFactory.java +++ b/main/src/cgeo/geocaching/maps/MapProviderFactory.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.maps.google.GoogleMapProvider; import cgeo.geocaching.maps.interfaces.MapProvider; import cgeo.geocaching.maps.interfaces.MapSource; @@ -31,7 +31,7 @@ public class MapProviderFactory { public static boolean isGoogleMapsInstalled() { // Check if API key is available - if (StringUtils.isBlank(cgeoapplication.getInstance().getString(R.string.maps_api_key))) { + if (StringUtils.isBlank(CgeoApplication.getInstance().getString(R.string.maps_api_key))) { Log.w("No Google API key available."); return false; } diff --git a/main/src/cgeo/geocaching/maps/PositionHistory.java b/main/src/cgeo/geocaching/maps/PositionHistory.java index 9b090fc..bc6779e 100644 --- a/main/src/cgeo/geocaching/maps/PositionHistory.java +++ b/main/src/cgeo/geocaching/maps/PositionHistory.java @@ -28,7 +28,7 @@ public class PositionHistory { if (coordinates.getAccuracy() >= 50f) { return; } - if (coordinates.getLatitude() == 0.0 && coordinates.getLatitude() == 0.0) { + if (coordinates.getLatitude() == 0.0 && coordinates.getLongitude() == 0.0) { return; } if (history.isEmpty()) { diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java b/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java index 1fa38ad..cb95b2c 100644 --- a/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java +++ b/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps.google; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.maps.AbstractMapProvider; import cgeo.geocaching.maps.AbstractMapSource; import cgeo.geocaching.maps.interfaces.MapItemFactory; @@ -20,7 +20,7 @@ public final class GoogleMapProvider extends AbstractMapProvider { private final MapItemFactory mapItemFactory; private GoogleMapProvider() { - final Resources resources = cgeoapplication.getInstance().getResources(); + final Resources resources = CgeoApplication.getInstance().getResources(); registerMapSource(new GoogleMapSource(this, resources.getString(R.string.map_source_google_map))); registerMapSource(new GoogleSatelliteSource(this, resources.getString(R.string.map_source_google_satellite))); diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java index d099b79..50dc51d 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps.mapsforge; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.maps.AbstractMapProvider; import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.maps.interfaces.MapItemFactory; @@ -33,7 +33,7 @@ public final class MapsforgeMapProvider extends AbstractMapProvider { private MapItemFactory mapItemFactory = new MapsforgeMapItemFactory(); private MapsforgeMapProvider() { - final Resources resources = cgeoapplication.getInstance().getResources(); + final Resources resources = CgeoApplication.getInstance().getResources(); registerMapSource(new MapsforgeMapSource(MAPSFORGE_MAPNIK_ID, this, resources.getString(R.string.map_source_osm_mapnik), MapGeneratorInternal.MAPNIK)); registerMapSource(new MapsforgeMapSource(MAPSFORGE_CYCLEMAP_ID, this, resources.getString(R.string.map_source_osm_cyclemap), MapGeneratorInternal.OPENCYCLEMAP)); @@ -163,7 +163,7 @@ public final class MapsforgeMapProvider extends AbstractMapProvider { public void updateOfflineMaps() { MapProviderFactory.deleteOfflineMapSources(); - final Resources resources = cgeoapplication.getInstance().getResources(); + final Resources resources = CgeoApplication.getInstance().getResources(); final List<String> offlineMaps = getOfflineMaps(); for (String mapFile : offlineMaps) { final String mapName = StringUtils.capitalize(StringUtils.substringBeforeLast(new File(mapFile).getName(), ".")); diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java index aa11405..dc4e82c 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java @@ -1,7 +1,6 @@ package cgeo.geocaching.maps.mapsforge; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.maps.CachesOverlay; import cgeo.geocaching.maps.PositionOverlay; @@ -15,6 +14,7 @@ import cgeo.geocaching.maps.interfaces.MapViewImpl; import cgeo.geocaching.maps.interfaces.OnMapDragListener; import cgeo.geocaching.maps.interfaces.OverlayImpl; import cgeo.geocaching.maps.interfaces.OverlayImpl.OverlayType; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; @@ -46,6 +46,9 @@ public class MapsforgeMapView extends MapView implements MapViewImpl { public MapsforgeMapView(Context context, AttributeSet attrs) { super(context, attrs); gestureDetector = new GestureDetector(context, new GestureListener()); + if (Settings.isScaleMapsforgeText()) { + this.setTextScale(getResources().getDisplayMetrics().density); + } } @Override diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java index 348ab45..0daa588 100644 --- a/main/src/cgeo/geocaching/network/HtmlImage.java +++ b/main/src/cgeo/geocaching/network/HtmlImage.java @@ -1,18 +1,18 @@ package cgeo.geocaching.network; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.StoredList; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.files.LocalStorage; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.utils.FileUtils; -import cgeo.geocaching.utils.IOUtils; import cgeo.geocaching.utils.ImageUtils; import cgeo.geocaching.utils.Log; import ch.boye.httpclientandroidlib.HttpResponse; import ch.boye.httpclientandroidlib.androidextra.Base64; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import android.content.res.Resources; @@ -77,7 +77,7 @@ public class HtmlImage implements Html.ImageGetter { Point displaySize = Compatibility.getDisplaySize(); this.maxWidth = displaySize.x - 25; this.maxHeight = displaySize.y - 25; - this.resources = cgeoapplication.getInstance().getResources(); + this.resources = CgeoApplication.getInstance().getResources(); } @Override @@ -97,6 +97,8 @@ public class HtmlImage implements Html.ImageGetter { final File file = LocalStorage.getStorageFile(pseudoGeocode, url, true, true); if (url.startsWith("data:image/")) { if (url.contains(";base64,")) { + // TODO: when we use SDK level 8 or above, we can use the streaming version of the base64 + // Android utilities. byte[] decoded = Base64.decode(StringUtils.substringAfter(url, ";base64,"), Base64.DEFAULT); OutputStream out = null; try { diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java index 3aa1828..1810216 100644 --- a/main/src/cgeo/geocaching/network/Network.java +++ b/main/src/cgeo/geocaching/network/Network.java @@ -34,9 +34,9 @@ import ch.boye.httpclientandroidlib.params.CoreProtocolPNames; import ch.boye.httpclientandroidlib.params.HttpParams; import ch.boye.httpclientandroidlib.protocol.HttpContext; import ch.boye.httpclientandroidlib.util.EntityUtils; - import org.apache.commons.lang3.CharEncoding; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.Nullable; import org.json.JSONException; import org.json.JSONObject; @@ -54,8 +54,6 @@ import java.nio.charset.Charset; public abstract class Network { - private static final int NB_DOWNLOAD_RETRIES = 4; - /** User agent id */ private final static String PC_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"; /** Native user agent, taken from a Android 2.2 Nexus **/ @@ -75,7 +73,7 @@ public abstract class Network { static { Network.clientParams.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, CharEncoding.UTF_8); Network.clientParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000); - Network.clientParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 30000); + Network.clientParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 90000); Network.clientParams.setParameter(ClientPNames.HANDLE_REDIRECTS, true); } @@ -150,6 +148,7 @@ public abstract class Network { * @param params the parameters to add to the POST request * @return the HTTP response, or null in case of an encoding error params */ + @Nullable public static HttpResponse postRequest(final String uri, final Parameters params) { return request("POST", uri, params, null, null); } @@ -162,6 +161,7 @@ public abstract class Network { * @params headers the headers to add to the request * @return the HTTP response, or null in case of an encoding error params */ + @Nullable public static HttpResponse postRequest(final String uri, final Parameters params, final Parameters headers) { return request("POST", uri, params, headers, null); } @@ -173,6 +173,7 @@ public abstract class Network { * @param json the json object to add to the POST request * @return the HTTP response, or null in case of an encoding error params */ + @Nullable public static HttpResponse postJsonRequest(final String uri, final JSONObject json) { HttpPost request = new HttpPost(uri); request.addHeader("Content-Type", "application/json; charset=utf-8"); @@ -184,7 +185,7 @@ public abstract class Network { return null; } } - return doRepeatedRequests(request); + return doLogRequest(request); } /** @@ -197,6 +198,7 @@ public abstract class Network { * @param file the file to include in the request * @return the HTTP response, or null in case of an encoding error param */ + @Nullable public static HttpResponse postRequest(final String uri, final Parameters params, final String fileFieldName, final String fileContentType, final File file) { final MultipartEntity entity = new MultipartEntity(); @@ -214,7 +216,7 @@ public abstract class Network { request.setEntity(entity); addHeaders(request, null, null); - return doRepeatedRequests(request); + return doLogRequest(request); } /** @@ -232,7 +234,9 @@ public abstract class Network { * the cache file used to cache this query * @return the HTTP response, or null in case of an encoding error in a POST request arguments */ - private static HttpResponse request(final String method, final String uri, final Parameters params, final Parameters headers, final File cacheFile) { + @Nullable + private static HttpResponse request(final String method, final String uri, + @Nullable final Parameters params, @Nullable final Parameters headers, @Nullable final File cacheFile) { HttpRequestBase request; if (method.equals("GET")) { final String fullUri = params == null ? uri : Uri.parse(uri).buildUpon().encodedQuery(params.toString()).build().toString(); @@ -251,7 +255,7 @@ public abstract class Network { addHeaders(request, headers, cacheFile); - return doRepeatedRequests(request); + return doLogRequest(request); } /** @@ -263,7 +267,7 @@ public abstract class Network { * @param cacheFile * if non-null, the file to take ETag and If-Modified-Since information from */ - private static void addHeaders(final HttpRequestBase request, final Parameters headers, final File cacheFile) { + private static void addHeaders(final HttpRequestBase request, @Nullable final Parameters headers, @Nullable final File cacheFile) { for (final NameValuePair header : Parameters.extend(Parameters.merge(headers, cacheHeaders(cacheFile)), "Accept-Charset", "utf-8,iso-8859-1;q=0.8,utf-16;q=0.8,*;q=0.7", "Accept-Language", "en-US,*;q=0.9", @@ -275,44 +279,39 @@ public abstract class Network { } /** - * Retry a request for a few times. + * Perform an HTTP request and log it. * * @param request * the request to try * @return * the response, or null if there has been a failure */ - private static HttpResponse doRepeatedRequests(final HttpRequestBase request) { + @Nullable + private static HttpResponse doLogRequest(final HttpRequestBase request) { final String reqLogStr = request.getMethod() + " " + Network.hidePassword(request.getURI().toString()); Log.d(reqLogStr); final HttpClient client = Network.getHttpClient(); - for (int i = 0; i <= Network.NB_DOWNLOAD_RETRIES; i++) { - final long before = System.currentTimeMillis(); - try { - final HttpResponse response = client.execute(request); - int status = response.getStatusLine().getStatusCode(); - if (status == 200) { - Log.d(status + Network.formatTimeSpan(before) + reqLogStr); - } else { - Log.w(status + " [" + response.getStatusLine().getReasonPhrase() + "]" + Network.formatTimeSpan(before) + reqLogStr); - } - return response; - } catch (IOException e) { - final String timeSpan = Network.formatTimeSpan(before); - final String tries = (i + 1) + "/" + (Network.NB_DOWNLOAD_RETRIES + 1); - if (i == Network.NB_DOWNLOAD_RETRIES) { - Log.w("Failure " + tries + timeSpan + reqLogStr + " (" + e.toString() + ")"); - } else { - Log.w("Failure " + tries + " (" + e.toString() + ")" + timeSpan + "- retrying " + reqLogStr); - } + final long before = System.currentTimeMillis(); + try { + final HttpResponse response = client.execute(request); + int status = response.getStatusLine().getStatusCode(); + if (status == 200) { + Log.d(status + Network.formatTimeSpan(before) + reqLogStr); + } else { + Log.w(status + " [" + response.getStatusLine().getReasonPhrase() + "]" + Network.formatTimeSpan(before) + reqLogStr); } + return response; + } catch (final IOException e) { + final String timeSpan = Network.formatTimeSpan(before); + Log.w("Failure" + timeSpan + reqLogStr + " (" + e.toString() + ")"); } return null; } - private static Parameters cacheHeaders(final File cacheFile) { + @Nullable + private static Parameters cacheHeaders(@Nullable final File cacheFile) { if (cacheFile == null || !cacheFile.exists()) { return null; } @@ -343,7 +342,8 @@ public abstract class Network { * the name of the file storing the cached resource, or null not to use one * @return the HTTP response */ - public static HttpResponse getRequest(final String uri, final Parameters params, final File cacheFile) { + @Nullable + public static HttpResponse getRequest(final String uri, @Nullable final Parameters params, @Nullable final File cacheFile) { return request("GET", uri, params, null, cacheFile); } @@ -357,7 +357,8 @@ public abstract class Network { * the parameters to add the the GET request * @return the HTTP response */ - public static HttpResponse getRequest(final String uri, final Parameters params) { + @Nullable + public static HttpResponse getRequest(final String uri, @Nullable final Parameters params) { return request("GET", uri, params, null, null); } @@ -372,7 +373,8 @@ public abstract class Network { * the headers to add to the GET request * @return the HTTP response */ - public static HttpResponse getRequest(final String uri, final Parameters params, final Parameters headers) { + @Nullable + public static HttpResponse getRequest(final String uri, @Nullable final Parameters params, @Nullable final Parameters headers) { return request("GET", uri, params, headers, null); } @@ -383,6 +385,7 @@ public abstract class Network { * the URI to request * @return the HTTP response */ + @Nullable public static HttpResponse getRequest(final String uri) { return request("GET", uri, null, null, null); } @@ -392,10 +395,14 @@ public abstract class Network { return " (" + (System.currentTimeMillis() - before) + " ms) "; } - static public boolean isSuccess(final HttpResponse response) { + static public boolean isSuccess(@Nullable final HttpResponse response) { return response != null && response.getStatusLine().getStatusCode() == 200; } + static public boolean isPageNotFound(@Nullable final HttpResponse response) { + return response != null && response.getStatusLine().getStatusCode() == 404; + } + /** * Get the result of a GET HTTP request returning a JSON body. * @@ -403,7 +410,8 @@ public abstract class Network { * @param params the query parameters, or <code>null</code> if there are none * @return a JSON object if the request was successful and the body could be decoded, <code>null</code> otherwise */ - public static JSONObject requestJSON(final String uri, final Parameters params) { + @Nullable + public static JSONObject requestJSON(final String uri, @Nullable final Parameters params) { final HttpResponse response = request("GET", uri, params, new Parameters("Accept", "application/json, text/javascript, */*; q=0.01"), null); final String responseData = Network.getResponseData(response, false); if (responseData != null) { @@ -417,6 +425,7 @@ public abstract class Network { return null; } + @Nullable private static String getResponseDataNoError(final HttpResponse response, boolean replaceWhitespace) { try { String data = EntityUtils.toString(response.getEntity(), CharEncoding.UTF_8); @@ -435,7 +444,8 @@ public abstract class Network { * @param response a HTTP response, which can be null * @return the body if the response comes from a successful HTTP request, <code>null</code> otherwise */ - public static String getResponseData(final HttpResponse response) { + @Nullable + public static String getResponseData(@Nullable final HttpResponse response) { return Network.getResponseData(response, true); } @@ -447,17 +457,22 @@ public abstract class Network { * should be called on the body * @return the body if the response comes from a successful HTTP request, <code>null</code> otherwise */ - public static String getResponseData(final HttpResponse response, boolean replaceWhitespace) { + @Nullable + public static String getResponseData(@Nullable final HttpResponse response, boolean replaceWhitespace) { if (!isSuccess(response)) { return null; } + assert response != null; // Caught above return getResponseDataNoError(response, replaceWhitespace); } + @Nullable public static String rfc3986URLEncode(String text) { - return StringUtils.replace(Network.encode(text).replace("+", "%20"), "%7E", "~"); + final String encoded = Network.encode(text); + return encoded != null ? StringUtils.replace(encoded.replace("+", "%20"), "%7E", "~") : null; } + @Nullable public static String decode(final String text) { try { return URLDecoder.decode(text, CharEncoding.UTF_8); @@ -467,6 +482,7 @@ public abstract class Network { return null; } + @Nullable public static String encode(final String text) { try { return URLEncoder.encode(text, CharEncoding.UTF_8); diff --git a/main/src/cgeo/geocaching/network/OAuth.java b/main/src/cgeo/geocaching/network/OAuth.java index 6740096..4ef8b62 100644 --- a/main/src/cgeo/geocaching/network/OAuth.java +++ b/main/src/cgeo/geocaching/network/OAuth.java @@ -3,8 +3,8 @@ package cgeo.geocaching.network; import cgeo.geocaching.utils.CryptUtils; import ch.boye.httpclientandroidlib.NameValuePair; - import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.Nullable; import java.util.ArrayList; import java.util.Date; @@ -16,8 +16,8 @@ public class OAuth { final String method, final boolean https, final Parameters params, - final String token, - final String tokenSecret, + @Nullable final String token, + @Nullable final String tokenSecret, final String consumerKey, final String consumerSecret) { params.put( diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index 14e0b33..d5336b9 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -1,15 +1,20 @@ package cgeo.geocaching.network; +import butterknife.InjectView; + import cgeo.geocaching.R; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; +import ch.boye.httpclientandroidlib.ParseException; import ch.boye.httpclientandroidlib.client.entity.UrlEncodedFormEntity; import ch.boye.httpclientandroidlib.util.EntityUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import android.app.ProgressDialog; import android.content.Intent; @@ -19,27 +24,31 @@ import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; -import android.widget.EditText; import android.widget.TextView; +import java.io.IOException; import java.util.regex.Pattern; public abstract class OAuthAuthorizationActivity extends AbstractActivity { - private String host; - private String pathRequest; - private String pathAuthorize; - private String pathAccess; - private boolean https; - private String consumerKey; - private String consumerSecret; + public static final int NOT_AUTHENTICATED = 0; + public static final int AUTHENTICATED = 1; + + @NonNull final private String host; + @NonNull final private String pathRequest; + @NonNull final private String pathAuthorize; + @NonNull final private String pathAccess; + private final boolean https; + @NonNull final private String consumerKey; + @NonNull final private String consumerSecret; + @NonNull final private String callback; private String OAtoken = null; private String OAtokenSecret = null; private final Pattern paramsPattern1 = Pattern.compile("oauth_token=([a-zA-Z0-9\\-\\_.]+)"); private final Pattern paramsPattern2 = Pattern.compile("oauth_token_secret=([a-zA-Z0-9\\-\\_.]+)"); - private Button startButton = null; - private EditText pinEntry = null; - private Button pinEntryButton = null; + @InjectView(R.id.start) protected Button startButton; + @InjectView(R.id.auth_1) protected TextView auth_1; + @InjectView(R.id.auth_2) protected TextView auth_2; private ProgressDialog requestTokenDialog = null; private ProgressDialog changeTokensDialog = null; private Handler requestTokenHandler = new Handler() { @@ -55,10 +64,6 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { if (msg.what == 1) { startButton.setText(getAuthAgain()); - - pinEntry.setVisibility(View.VISIBLE); - pinEntryButton.setVisibility(View.VISIBLE); - pinEntryButton.setOnClickListener(new ConfirmPINListener()); } else { showToast(getErrAuthInitialize()); startButton.setText(getAuthStart()); @@ -74,33 +79,26 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { changeTokensDialog.dismiss(); } - pinEntryButton.setOnClickListener(new ConfirmPINListener()); - pinEntryButton.setEnabled(true); - - if (msg.what == 1) { + if (msg.what == AUTHENTICATED) { showToast(getAuthDialogCompleted()); - - pinEntryButton.setVisibility(View.GONE); - setResult(RESULT_OK); finish(); } else { showToast(getErrAuthProcess()); - - pinEntry.setVisibility(View.GONE); - pinEntryButton.setVisibility(View.GONE); startButton.setText(getAuthStart()); } } }; - public OAuthAuthorizationActivity(String host, - String pathRequest, - String pathAuthorize, - String pathAccess, - boolean https, - String consumerKey, - String consumerSecret) { + public OAuthAuthorizationActivity + (@NonNull String host, + @NonNull String pathRequest, + @NonNull String pathAuthorize, + @NonNull String pathAccess, + boolean https, + @NonNull String consumerKey, + @NonNull String consumerSecret, + @NonNull String callback) { this.host = host; this.pathRequest = pathRequest; this.pathAuthorize = pathAuthorize; @@ -108,6 +106,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { this.https = https; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; + this.callback = callback; } @Override @@ -116,26 +115,14 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTitle(getAuthTitle()); - init(); - } - - private void init() { - startButton = (Button) findViewById(R.id.start); - pinEntry = (EditText) findViewById(R.id.pin); - pinEntryButton = (Button) findViewById(R.id.pin_button); - - TextView auth = (TextView) findViewById(R.id.auth_1); - auth.setText(getAboutAuth1()); - auth = (TextView) findViewById(R.id.auth_2); - auth.setText(getAboutAuth2()); + auth_1.setText(getAuthExplainShort()); + auth_2.setText(getAuthExplainLong()); ImmutablePair<String, String> tempToken = getTempTokens(); OAtoken = tempToken.left; OAtokenSecret = tempToken.right; startButton.setText(getAuthAuthorize()); - pinEntryButton.setText(getAuthFinish()); - startButton.setEnabled(true); startButton.setOnClickListener(new StartListener()); @@ -145,60 +132,74 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { } else { // already have temporary tokens, continue from pin startButton.setText(getAuthAgain()); + } + } + + @Override + public void onNewIntent(final Intent intent) { + setIntent(intent); + } - pinEntry.setHint(getAuthPinHint()); - pinEntry.setVisibility(View.VISIBLE); - pinEntryButton.setVisibility(View.VISIBLE); - pinEntryButton.setOnClickListener(new ConfirmPINListener()); + @Override + public void onResume() { + super.onResume(); + final Uri uri = getIntent().getData(); + if (uri != null) { + final String verifier = uri.getQueryParameter("oauth_verifier"); + if (StringUtils.isNotBlank(verifier)) { + exchangeTokens(verifier); + } else { + // We can shortcut the whole verification process if we do not have a token at all. + changeTokensHandler.sendEmptyMessage(NOT_AUTHENTICATED); + } } } private void requestToken() { + final Parameters params = new Parameters(); + params.put("oauth_callback", callback); + final String method = "GET"; + OAuth.signOAuth(host, pathRequest, method, https, params, null, null, consumerKey, consumerSecret); + final String line = Network.getResponseData(Network.getRequest(getUrlPrefix() + host + pathRequest, params)); + int status = 0; - try { - final Parameters params = new Parameters(); - params.put("oauth_callback", "oob"); - final String method = "GET"; - OAuth.signOAuth(host, pathRequest, method, https, params, null, null, consumerKey, consumerSecret); - final String line = Network.getResponseData(Network.getRequest(getUrlPrefix() + host + pathRequest, params)); - - if (StringUtils.isNotBlank(line)) { - final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); - if (paramsMatcher1.find()) { - OAtoken = paramsMatcher1.group(1); - } - final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); - if (paramsMatcher2.find()) { - OAtokenSecret = paramsMatcher2.group(1); - } + if (StringUtils.isNotBlank(line)) { + assert line != null; + final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); + if (paramsMatcher1.find()) { + OAtoken = paramsMatcher1.group(1); + } + final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); + if (paramsMatcher2.find()) { + OAtokenSecret = paramsMatcher2.group(1); + } - if (StringUtils.isNotBlank(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { - setTempTokens(OAtoken, OAtokenSecret); - try { - final Parameters paramsBrowser = new Parameters(); - paramsBrowser.put("oauth_token", OAtoken); - final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); - status = 1; - } catch (Exception e) { - Log.e("OAuthAuthorizationActivity.requestToken(2)", e); - } + if (StringUtils.isNotBlank(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { + setTempTokens(OAtoken, OAtokenSecret); + try { + final Parameters paramsBrowser = new Parameters(); + paramsBrowser.put("oauth_token", OAtoken); + final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); + status = 1; + } catch (ParseException e) { + Log.e("OAuthAuthorizationActivity.requestToken", e); + } catch (IOException e) { + Log.e("OAuthAuthorizationActivity.requestToken", e); } } - } catch (Exception e) { - Log.e("OAuthAuthorizationActivity.requestToken(1)", e); } requestTokenHandler.sendEmptyMessage(status); } - private void changeToken() { + private void changeToken(final String verifier) { - int status = 0; + int status = NOT_AUTHENTICATED; try { - final Parameters params = new Parameters("oauth_verifier", pinEntry.getText().toString()); + final Parameters params = new Parameters("oauth_verifier", verifier); final String method = "POST"; OAuth.signOAuth(host, pathAccess, method, https, params, OAtoken, OAtokenSecret, consumerKey, consumerSecret); @@ -222,7 +223,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTokens(null, null, false); } else { setTokens(OAtoken, OAtokenSecret, true); - status = 1; + status = AUTHENTICATED; } } catch (Exception e) { Log.e("OAuthAuthorizationActivity.changeToken", e); @@ -260,68 +261,68 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { } } - private class ConfirmPINListener implements View.OnClickListener { + private void exchangeTokens(final String verifier) { + if (changeTokensDialog == null) { + changeTokensDialog = new ProgressDialog(this); + changeTokensDialog.setCancelable(false); + changeTokensDialog.setMessage(getAuthDialogWait()); + } + changeTokensDialog.show(); - @Override - public void onClick(View arg0) { - if (StringUtils.isEmpty(((EditText) findViewById(R.id.pin)).getText().toString())) { - helpDialog(getAuthDialogPinTitle(), getAuthDialogPinMessage()); - return; - } + (new Thread() { - if (changeTokensDialog == null) { - changeTokensDialog = new ProgressDialog(OAuthAuthorizationActivity.this); - changeTokensDialog.setCancelable(false); - changeTokensDialog.setMessage(getAuthDialogWait()); + @Override + public void run() { + changeToken(verifier); } - changeTokensDialog.show(); - pinEntryButton.setEnabled(false); - pinEntryButton.setOnTouchListener(null); - pinEntryButton.setOnClickListener(null); - - (new Thread() { - - @Override - public void run() { - changeToken(); - } - }).start(); - } + }).start(); } protected abstract ImmutablePair<String, String> getTempTokens(); - protected abstract void setTempTokens(String tokenPublic, String tokenSecret); + protected abstract void setTempTokens(@Nullable String tokenPublic, @Nullable String tokenSecret); - protected abstract void setTokens(String tokenPublic, String tokenSecret, boolean enable); + protected abstract void setTokens(@Nullable String tokenPublic, @Nullable String tokenSecret, boolean enable); // get resources from derived class protected abstract String getAuthTitle(); - protected abstract String getAuthAgain(); + protected String getAuthAgain() { + return getString(R.string.auth_again); + } - protected abstract String getErrAuthInitialize(); + protected String getErrAuthInitialize() { + return getString(R.string.err_auth_initialize); + } - protected abstract String getAuthStart(); + protected String getAuthStart() { + return getString(R.string.auth_start); + } protected abstract String getAuthDialogCompleted(); - protected abstract String getErrAuthProcess(); - - protected abstract String getAuthDialogWait(); - - protected abstract String getAuthDialogPinTitle(); - - protected abstract String getAuthDialogPinMessage(); + protected String getErrAuthProcess() { + return res.getString(R.string.err_auth_process); + } - protected abstract String getAboutAuth1(); + protected String getAuthDialogWait() { + return res.getString(R.string.auth_dialog_waiting, getAuthTitle()); + } - protected abstract String getAboutAuth2(); + protected String getAuthExplainShort() { + return res.getString(R.string.auth_explain_short, getAuthTitle()); + } - protected abstract String getAuthAuthorize(); + protected String getAuthExplainLong() { + return res.getString(R.string.auth_explain_long, getAuthTitle()); + } - protected abstract String getAuthPinHint(); + protected String getAuthAuthorize() { + return res.getString(R.string.auth_authorize, getAuthTitle()); + } - protected abstract String getAuthFinish(); + protected String getAuthFinish() { + return res.getString(R.string.auth_finish, getAuthTitle()); + } } diff --git a/main/src/cgeo/geocaching/network/Parameters.java b/main/src/cgeo/geocaching/network/Parameters.java index f035c4a..9cb0da5 100644 --- a/main/src/cgeo/geocaching/network/Parameters.java +++ b/main/src/cgeo/geocaching/network/Parameters.java @@ -3,8 +3,9 @@ package cgeo.geocaching.network; import ch.boye.httpclientandroidlib.NameValuePair; import ch.boye.httpclientandroidlib.client.utils.URLEncodedUtils; import ch.boye.httpclientandroidlib.message.BasicNameValuePair; - import org.apache.commons.lang3.CharEncoding; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import java.security.InvalidParameterException; import java.util.ArrayList; @@ -81,7 +82,8 @@ public class Parameters extends ArrayList<NameValuePair> { * if the number of key/values is unbalanced * @return the object itself if it is non-null, a new one otherwise */ - public static Parameters extend(final Parameters params, final String... keyValues) { + @NonNull + public static Parameters extend(@Nullable final Parameters params, final String... keyValues) { return params == null ? new Parameters(keyValues) : params.put(keyValues); } @@ -94,7 +96,8 @@ public class Parameters extends ArrayList<NameValuePair> { * the object to merge from if non-null * @return params with extra data if params was non-null, extra otherwise */ - public static Parameters merge(final Parameters params, final Parameters extra) { + @Nullable + public static Parameters merge(@Nullable final Parameters params, @Nullable final Parameters extra) { if (params == null) { return extra; } diff --git a/main/src/cgeo/geocaching/network/StatusUpdater.java b/main/src/cgeo/geocaching/network/StatusUpdater.java index ee9bc31..cb4c7f4 100644 --- a/main/src/cgeo/geocaching/network/StatusUpdater.java +++ b/main/src/cgeo/geocaching/network/StatusUpdater.java @@ -1,6 +1,6 @@ package cgeo.geocaching.network; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.utils.MemorySubject; import cgeo.geocaching.utils.PeriodicHandler; import cgeo.geocaching.utils.PeriodicHandler.PeriodicHandlerListener; @@ -42,8 +42,8 @@ public class StatusUpdater extends MemorySubject<StatusUpdater.Status> implement public void onPeriodic() { final JSONObject response = Network.requestJSON("http://status.cgeo.org/api/status.json", - new Parameters("version_code", String.valueOf(Version.getVersionCode(cgeoapplication.getInstance())), - "version_name", Version.getVersionName(cgeoapplication.getInstance()), + new Parameters("version_code", String.valueOf(Version.getVersionCode(CgeoApplication.getInstance())), + "version_name", Version.getVersionName(CgeoApplication.getInstance()), "locale", Locale.getDefault().toString())); if (response != null) { notifyObservers(new Status(get(response, "message"), get(response, "message_id"), get(response, "icon"), get(response, "url"))); diff --git a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java deleted file mode 100644 index 1fdd0de..0000000 --- a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java +++ /dev/null @@ -1,46 +0,0 @@ -package cgeo.geocaching.settings; - -import cgeo.geocaching.R; -import cgeo.geocaching.twitter.TwitterAuthorizationActivity; - -import android.content.Context; -import android.content.Intent; -import android.preference.Preference; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; - -public class AuthorizeTwitterPreference extends Preference { - - public AuthorizeTwitterPreference(Context context) { - super(context); - } - - public AuthorizeTwitterPreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public AuthorizeTwitterPreference(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - protected View onCreateView(ViewGroup parent) { - final SettingsActivity activity = (SettingsActivity) getContext(); - - setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Intent authIntent = new Intent(preference.getContext(), - TwitterAuthorizationActivity.class); - activity.startActivityForResult(authIntent, - R.string.pref_fakekey_twitter_authorization); - - return false; // no shared preference has to be changed - } - }); - - activity.setTwitterAuthTitle(); - return super.onCreateView(parent); - } -} diff --git a/main/src/cgeo/geocaching/settings/AuthorizeOcPreference.java b/main/src/cgeo/geocaching/settings/OAuthPreference.java index f5d6a57..3550947 100644 --- a/main/src/cgeo/geocaching/settings/AuthorizeOcPreference.java +++ b/main/src/cgeo/geocaching/settings/OAuthPreference.java @@ -1,9 +1,10 @@ package cgeo.geocaching.settings; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.oc.OCDEAuthorizationActivity; import cgeo.geocaching.connector.oc.OCPLAuthorizationActivity; +import cgeo.geocaching.twitter.TwitterAuthorizationActivity; import android.content.Context; import android.content.Intent; @@ -12,49 +13,50 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; -public class AuthorizeOcPreference extends Preference { +public class OAuthPreference extends Preference { private static final int NO_KEY = -1; - private enum OCAuthorizations { + private enum OAuthActivityMapping { NONE(NO_KEY, null), OCDE(R.string.pref_fakekey_ocde_authorization, OCDEAuthorizationActivity.class), - OCPL(R.string.pref_fakekey_ocpl_authorization, OCPLAuthorizationActivity.class); + OCPL(R.string.pref_fakekey_ocpl_authorization, OCPLAuthorizationActivity.class), + TWITTER(R.string.pref_fakekey_twitter_authorization, TwitterAuthorizationActivity.class); public int prefKeyId; public Class<?> authActivity; - OCAuthorizations(int prefKeyId, Class<?> clazz) { + OAuthActivityMapping(int prefKeyId, Class<?> clazz) { this.prefKeyId = prefKeyId; this.authActivity = clazz; } } - private final OCAuthorizations ocAuth; + private final OAuthActivityMapping oAuthMapping; - private OCAuthorizations getAuthorization() { + private OAuthActivityMapping getAuthorization() { final String prefKey = getKey(); - for (OCAuthorizations auth : OCAuthorizations.values()) { - if (auth.prefKeyId != NO_KEY && prefKey.equals(cgeoapplication.getInstance().getString(auth.prefKeyId))) { + for (OAuthActivityMapping auth : OAuthActivityMapping.values()) { + if (auth.prefKeyId != NO_KEY && prefKey.equals(CgeoApplication.getInstance().getString(auth.prefKeyId))) { return auth; } } - return OCAuthorizations.NONE; + return OAuthActivityMapping.NONE; } - public AuthorizeOcPreference(Context context) { + public OAuthPreference(Context context) { super(context); - this.ocAuth = getAuthorization(); + this.oAuthMapping = getAuthorization(); } - public AuthorizeOcPreference(Context context, AttributeSet attrs) { + public OAuthPreference(Context context, AttributeSet attrs) { super(context, attrs); - this.ocAuth = getAuthorization(); + this.oAuthMapping = getAuthorization(); } - public AuthorizeOcPreference(Context context, AttributeSet attrs, int defStyle) { + public OAuthPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - this.ocAuth = getAuthorization(); + this.oAuthMapping = getAuthorization(); } @Override @@ -64,17 +66,17 @@ public class AuthorizeOcPreference extends Preference { setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - if (ocAuth.authActivity != null) { - Intent authIntent = new Intent(preference.getContext(), - ocAuth.authActivity); - activity.startActivityForResult(authIntent, - ocAuth.prefKeyId); + if (oAuthMapping.authActivity != null) { + Intent authIntent = new Intent(preference.getContext(), + oAuthMapping.authActivity); + activity.startActivityForResult(authIntent, + oAuthMapping.prefKeyId); } return false; // no shared preference has to be changed } }); - activity.setOcAuthTitle(ocAuth.prefKeyId); + activity.setOcAuthTitle(oAuthMapping.prefKeyId); return super.onCreateView(parent); } } diff --git a/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java b/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java index a019c4a..fbf08fa 100644 --- a/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java +++ b/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java @@ -99,7 +99,7 @@ public class RegisterSend2CgeoPreference extends Preference { if (response != null && response.getStatusLine().getStatusCode() == 200) { //response was OK - String[] strings = Network.getResponseData(response).split(","); + String[] strings = StringUtils.split(Network.getResponseData(response), ','); try { pin = Integer.parseInt(strings[1].trim()); } catch (Exception e) { diff --git a/main/src/cgeo/geocaching/settings/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java index 71c6d4a..947fa12 100644 --- a/main/src/cgeo/geocaching/settings/Settings.java +++ b/main/src/cgeo/geocaching/settings/Settings.java @@ -1,8 +1,7 @@ package cgeo.geocaching.settings; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.StoredList; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; import cgeo.geocaching.connector.gc.GCConstants; import cgeo.geocaching.connector.gc.Login; @@ -10,6 +9,7 @@ import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.maps.google.GoogleMapProvider; import cgeo.geocaching.maps.interfaces.GeoPointImpl; @@ -24,6 +24,7 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.Nullable; import android.content.Context; import android.content.SharedPreferences; @@ -69,7 +70,7 @@ public final class Settings { } private static final SharedPreferences sharedPrefs = PreferenceManager - .getDefaultSharedPreferences(cgeoapplication.getInstance().getBaseContext()); + .getDefaultSharedPreferences(CgeoApplication.getInstance().getBaseContext()); static { migrateSettings(); Log.setDebug(sharedPrefs.getBoolean(getKey(R.string.pref_debug), false)); @@ -90,7 +91,7 @@ public final class Settings { int oldVersion = getInt(R.string.pref_settingsversion, 0); if (oldVersion < 1) { final String oldPreferencesName = "cgeo.pref"; - final SharedPreferences old = cgeoapplication.getInstance().getSharedPreferences(oldPreferencesName, Context.MODE_PRIVATE); + final SharedPreferences old = CgeoApplication.getInstance().getSharedPreferences(oldPreferencesName, Context.MODE_PRIVATE); final Editor e = sharedPrefs.edit(); e.putString(getKey(R.string.pref_temp_twitter_token_secret), old.getString(getKey(R.string.pref_temp_twitter_token_secret), null)); @@ -191,7 +192,7 @@ public final class Settings { } private static String getKey(final int prefKeyId) { - return cgeoapplication.getInstance().getString(prefKeyId); + return CgeoApplication.getInstance().getString(prefKeyId); } static String getString(final int prefKeyId, final String defaultValue) { @@ -257,7 +258,7 @@ public final class Settings { public static void setLanguage(boolean useEnglish) { final Configuration config = new Configuration(); config.locale = useEnglish ? Locale.ENGLISH : Locale.getDefault(); - final Resources resources = cgeoapplication.getInstance().getResources(); + final Resources resources = CgeoApplication.getInstance().getResources(); resources.updateConfiguration(config, resources.getDisplayMetrics()); } @@ -295,11 +296,7 @@ public final class Settings { public static boolean isPremiumMember() { // Basic Member, Premium Member, ??? - String memberStatus = Settings.getMemberStatus(); - if (memberStatus == null) { - return false; - } - return GCConstants.MEMBER_STATUS_PM.equalsIgnoreCase(memberStatus); + return GCConstants.MEMBER_STATUS_PM.equalsIgnoreCase(Settings.getMemberStatus()); } public static String getMemberStatus() { @@ -317,7 +314,7 @@ public final class Settings { return new ImmutablePair<String, String>(getString(tokenPublicPrefKey, null), getString(tokenSecretPrefKey, null)); } - public static void setTokens(final int tokenPublicPrefKey, final String tokenPublic, final int tokenSecretPrefKey, final String tokenSecret) { + public static void setTokens(final int tokenPublicPrefKey, @Nullable final String tokenPublic, final int tokenSecretPrefKey, @Nullable final String tokenSecret) { if (tokenPublic == null) { remove(tokenPublicPrefKey); } else { @@ -441,6 +438,10 @@ public final class Settings { return MapsforgeMapProvider.isValidMapFile(mapFileIn); } + public static boolean isScaleMapsforgeText() { + return getBoolean(R.string.pref_mapsforge_scale_text, true); + } + public static CoordInputFormatEnum getCoordInputFormat() { return CoordInputFormatEnum.fromInt(getInt(R.string.pref_coordinputformat, 0)); } @@ -471,7 +472,7 @@ public final class Settings { /** * @return User selected date format on GC.com - * @see Login#gcCustomDateFormats + * @see Login#GC_CUSTOM_DATE_FORMATS */ public static String getGcCustomDate() { return getString(R.string.pref_gccustomdate, null); @@ -548,16 +549,9 @@ public final class Settings { static boolean getImperialUnitsDefault() { final String countryCode = Locale.getDefault().getCountry(); - if ("US".equals(countryCode)) { - return true; // USA - } - if ("LR".equals(countryCode)) { - return true; // Liberia - } - if ("MM".equals(countryCode)) { - return true; // Burma - } - return false; + return "US".equals(countryCode) // USA + || "LR".equals(countryCode) // Liberia + || "MM".equals(countryCode); // Burma } public static boolean isLiveMap() { @@ -754,8 +748,8 @@ public final class Settings { && StringUtils.isNotBlank(getTokenSecret()); } - public static void setTwitterTokens(final String tokenPublic, - final String tokenSecret, boolean enableTwitter) { + public static void setTwitterTokens(@Nullable final String tokenPublic, + @Nullable final String tokenSecret, boolean enableTwitter) { putString(R.string.pref_twitter_token_public, tokenPublic); putString(R.string.pref_twitter_token_secret, tokenSecret); if (tokenPublic != null) { @@ -765,8 +759,8 @@ public final class Settings { setUseTwitter(enableTwitter); } - public static void setTwitterTempTokens(final String tokenPublic, - final String tokenSecret) { + public static void setTwitterTempTokens(@Nullable final String tokenPublic, + @Nullable final String tokenSecret) { putString(R.string.pref_temp_twitter_token_public, tokenPublic); putString(R.string.pref_temp_twitter_token_secret, tokenSecret); } diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index d2c73f3..22a0907 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -1,13 +1,14 @@ package cgeo.geocaching.settings; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.Intents; import cgeo.geocaching.R; import cgeo.geocaching.SelectMapfileActivity; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; import cgeo.geocaching.compatibility.Compatibility; +import cgeo.geocaching.connector.gc.GCConnector; import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.files.SimpleDirChooser; import cgeo.geocaching.maps.MapProviderFactory; @@ -151,10 +152,26 @@ public class SettingsActivity extends PreferenceActivity { getPreference(R.string.pref_connectorOCActive).setOnPreferenceChangeListener(VALUE_CHANGE_LISTENER); getPreference(R.string.pref_connectorOCPLActive).setOnPreferenceChangeListener(VALUE_CHANGE_LISTENER); getPreference(R.string.pref_connectorGCActive).setOnPreferenceChangeListener(VALUE_CHANGE_LISTENER); + setWebsite(R.string.pref_fakekey_gc_website, GCConnector.getInstance().getHost()); + setWebsite(R.string.pref_fakekey_ocde_website, "opencaching.de"); + setWebsite(R.string.pref_fakekey_ocpl_website, "opencaching.pl"); + setWebsite(R.string.pref_fakekey_gcvote_website, "gcvote.com"); + setWebsite(R.string.pref_fakekey_sendtocgeo_website, "send2.cgeo.org"); + } + + private void setWebsite(final int preferenceKey, final String host) { + Preference preference = getPreference(preferenceKey); + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(final Preference preference) { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://" + host))); + return true; + } + }); } private static String getKey(final int prefKeyId) { - return cgeoapplication.getInstance().getString(prefKeyId); + return CgeoApplication.getInstance().getString(prefKeyId); } private Preference getPreference(final int keyId) { @@ -337,7 +354,7 @@ public class SettingsActivity extends PreferenceActivity { @Override public boolean onPreferenceClick(final Preference preference) { boolean oldValue = Settings.isDbOnSDCard(); - ((cgeoapplication) SettingsActivity.this.getApplication()) + ((CgeoApplication) SettingsActivity.this.getApplication()) .moveDatabase(SettingsActivity.this); return oldValue != Settings.isDbOnSDCard(); } @@ -390,6 +407,9 @@ public class SettingsActivity extends PreferenceActivity { case R.string.pref_fakekey_ocpl_authorization: setOCPLAuthTitle(); break; + case R.string.pref_fakekey_twitter_authorization: + setTwitterAuthTitle(); + break; default: Log.e(String.format(Locale.ENGLISH, "Invalid key %d in SettingsActivity.setTitle()", prefKeyId)); } @@ -398,22 +418,22 @@ public class SettingsActivity extends PreferenceActivity { void setOCDEAuthTitle() { getPreference(R.string.pref_fakekey_ocde_authorization) .setTitle(getString(Settings.hasOCAuthorization(R.string.pref_ocde_tokenpublic, R.string.pref_ocde_tokensecret) - ? R.string.init_reregister_oc_de - : R.string.init_register_oc_de)); + ? R.string.settings_reauthorize + : R.string.settings_authorize)); } void setOCPLAuthTitle() { getPreference(R.string.pref_fakekey_ocpl_authorization) .setTitle(getString(Settings.hasOCAuthorization(R.string.pref_ocpl_tokenpublic, R.string.pref_ocpl_tokensecret) - ? R.string.init_reregister_oc_pl - : R.string.init_register_oc_pl)); + ? R.string.settings_reauthorize + : R.string.settings_authorize)); } void setTwitterAuthTitle() { getPreference(R.string.pref_fakekey_twitter_authorization) .setTitle(getString(Settings.hasTwitterAuthorization() - ? R.string.init_twitter_reauthorize - : R.string.init_twitter_authorize)); + ? R.string.settings_reauthorize + : R.string.settings_authorize)); } public static void jumpToServicesPage(final Context fromActivity) { @@ -506,7 +526,7 @@ public class SettingsActivity extends PreferenceActivity { preference.setSummary(mapSource.getName()); } else if (isPreference(preference, R.string.pref_connectorOCActive) || isPreference(preference, R.string.pref_connectorOCPLActive) || isPreference(preference, R.string.pref_connectorGCActive)) { // // reset log-in status if connector activation was changed - cgeoapplication.getInstance().checkLogin = true; + CgeoApplication.getInstance().checkLogin = true; } else if (preference instanceof ListPreference) { // For list preferences, look up the correct display value in // the preference's 'entries' list. @@ -537,7 +557,7 @@ public class SettingsActivity extends PreferenceActivity { if (Login.isActualLoginStatus()) { Login.logout(); } - cgeoapplication.getInstance().checkLogin = true; + CgeoApplication.getInstance().checkLogin = true; } return true; } diff --git a/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java index 4d1a994..3cdd393 100644 --- a/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java +++ b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java @@ -90,7 +90,9 @@ public class ComparatorUserInterface { CacheComparator comparator = entry.cacheComparator.newInstance(); runAfterwards.run(comparator); } - } catch (Exception e) { + } catch (InstantiationException e) { + Log.e("selectComparator", e); + } catch (IllegalAccessException e) { Log.e("selectComparator", e); } dialog.dismiss(); diff --git a/main/src/cgeo/geocaching/sorting/DateComparator.java b/main/src/cgeo/geocaching/sorting/DateComparator.java index 3464103..091f6a4 100644 --- a/main/src/cgeo/geocaching/sorting/DateComparator.java +++ b/main/src/cgeo/geocaching/sorting/DateComparator.java @@ -1,7 +1,7 @@ package cgeo.geocaching.sorting; import cgeo.geocaching.Geocache; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import java.util.ArrayList; import java.util.Date; @@ -27,7 +27,7 @@ public class DateComparator extends AbstractCacheComparator { final ArrayList<Geocache> list = new ArrayList<Geocache>(); list.add(cache1); list.add(cache2); - final DistanceComparator distanceComparator = new DistanceComparator(cgeoapplication.getInstance().currentGeo().getCoords(), list); + final DistanceComparator distanceComparator = new DistanceComparator(CgeoApplication.getInstance().currentGeo().getCoords(), list); return distanceComparator.compare(cache1, cache2); } return dateDifference; diff --git a/main/src/cgeo/geocaching/sorting/FindsComparator.java b/main/src/cgeo/geocaching/sorting/FindsComparator.java index ba929b8..b147fad 100644 --- a/main/src/cgeo/geocaching/sorting/FindsComparator.java +++ b/main/src/cgeo/geocaching/sorting/FindsComparator.java @@ -1,7 +1,7 @@ package cgeo.geocaching.sorting; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; -import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.LogType; public class FindsComparator extends AbstractCacheComparator { @@ -20,7 +20,7 @@ public class FindsComparator extends AbstractCacheComparator { private static int getFindsCount(Geocache cache) { if (cache.getLogCounts().isEmpty()) { - cache.setLogCounts(cgData.loadLogCounts(cache.getGeocode())); + cache.setLogCounts(DataStore.loadLogCounts(cache.getGeocode())); } Integer logged = cache.getLogCounts().get(LogType.FOUND_IT); if (logged != null) { diff --git a/main/src/cgeo/geocaching/speech/SpeechService.java b/main/src/cgeo/geocaching/speech/SpeechService.java index 1907bfc..baa843b 100644 --- a/main/src/cgeo/geocaching/speech/SpeechService.java +++ b/main/src/cgeo/geocaching/speech/SpeechService.java @@ -2,7 +2,7 @@ package cgeo.geocaching.speech; import cgeo.geocaching.DirectionProvider; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.settings.Settings; @@ -48,7 +48,7 @@ public class SpeechService extends Service implements OnInitListener { GeoDirHandler geoHandler = new GeoDirHandler() { @Override protected void updateDirection(float newDirection) { - if (cgeoapplication.getInstance().currentGeo().getSpeed() <= 5) { + if (CgeoApplication.getInstance().currentGeo().getSpeed() <= 5) { direction = DirectionProvider.getDirectionNow(startingActivity, newDirection); directionInitialized = true; updateCompass(); diff --git a/main/src/cgeo/geocaching/speech/TextFactory.java b/main/src/cgeo/geocaching/speech/TextFactory.java index 81a74fb..2a3b6d7 100644 --- a/main/src/cgeo/geocaching/speech/TextFactory.java +++ b/main/src/cgeo/geocaching/speech/TextFactory.java @@ -1,8 +1,8 @@ package cgeo.geocaching.speech; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.IConversion; import cgeo.geocaching.utils.AngleUtils; @@ -12,6 +12,13 @@ import java.util.Locale; /** * Creates the output to be read by TTS. * + * Note: some languages need to read "one hour" as "a hour" (indefinite article). Also, other languages + * use the <tt>quantity="1"</tt> plurals rule for other values than 1, such as Slovenian, so it is not + * possible to store the literal value to use for 1 in this rule. For this reason, we need to have one + * string for the unit quantity ("one meter") and a plurals rule for everything else. + * + * See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html for rules + * on unit expressions. */ public class TextFactory { public static String getText(Geopoint position, Geopoint target, float direction) { @@ -78,11 +85,11 @@ public class TextFactory { } private static String getString(int resourceId, Object... formatArgs) { - return cgeoapplication.getInstance().getString(resourceId, formatArgs); + return CgeoApplication.getInstance().getString(resourceId, formatArgs); } private static String getQuantityString(int resourceId, int quantity, Object... formatArgs) { - return cgeoapplication.getInstance().getResources().getQuantityString(resourceId, quantity, formatArgs); + return CgeoApplication.getInstance().getResources().getQuantityString(resourceId, quantity, formatArgs); } private static String getDirection(Geopoint position, Geopoint target, float direction) { diff --git a/main/src/cgeo/geocaching/twitter/Twitter.java b/main/src/cgeo/geocaching/twitter/Twitter.java index 7233764..c3f99fa 100644 --- a/main/src/cgeo/geocaching/twitter/Twitter.java +++ b/main/src/cgeo/geocaching/twitter/Twitter.java @@ -1,9 +1,9 @@ package cgeo.geocaching.twitter; +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.Trackable; -import cgeo.geocaching.cgData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter.Format; @@ -22,16 +22,16 @@ public final class Twitter { private static final int MAX_TWEET_SIZE = 140; public static void postTweetCache(String geocode) { - final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); - postTweet(cgeoapplication.getInstance(), getStatusMessage(cache), null); + final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + postTweet(CgeoApplication.getInstance(), getStatusMessage(cache), null); } public static void postTweetTrackable(String geocode) { - final Trackable trackable = cgData.loadTrackable(geocode); - postTweet(cgeoapplication.getInstance(), getStatusMessage(trackable), null); + final Trackable trackable = DataStore.loadTrackable(geocode); + postTweet(CgeoApplication.getInstance(), getStatusMessage(trackable), null); } - private static void postTweet(final cgeoapplication app, final String status, final Geopoint coords) { + private static void postTweet(final CgeoApplication app, final String status, final Geopoint coords) { if (app == null || !Settings.isUseTwitter() || !Settings.isTwitterLoginValid()) { return; } diff --git a/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java b/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java index 4d9a1f2..b813389 100644 --- a/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java @@ -1,10 +1,11 @@ package cgeo.geocaching.twitter; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; import cgeo.geocaching.network.OAuthAuthorizationActivity; +import cgeo.geocaching.settings.Settings; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.Nullable; public class TwitterAuthorizationActivity extends OAuthAuthorizationActivity { @@ -15,92 +16,33 @@ public class TwitterAuthorizationActivity extends OAuthAuthorizationActivity { "/oauth/access_token", true, Settings.getKeyConsumerPublic(), - Settings.getKeyConsumerSecret()); + Settings.getKeyConsumerSecret(), + "callback://www.cgeo.org/twitter/"); } @Override - protected ImmutablePair<String, String> getTempTokens() { + protected final ImmutablePair<String, String> getTempTokens() { return Settings.getTempToken(); } @Override - protected void setTempTokens(String tokenPublic, String tokenSecret) { + protected final void setTempTokens(@Nullable final String tokenPublic, @Nullable final String tokenSecret) { Settings.setTwitterTempTokens(tokenPublic, tokenSecret); } @Override - protected void setTokens(String tokenPublic, String tokenSecret, boolean enable) { + protected final void setTokens(@Nullable final String tokenPublic, @Nullable final String tokenSecret, final boolean enable) { Settings.setTwitterTokens(tokenPublic, tokenSecret, enable); } @Override - protected String getAuthTitle() { + protected final String getAuthTitle() { return res.getString(R.string.auth_twitter); } @Override - protected String getAuthAgain() { - return res.getString(R.string.auth_again); - } - - @Override - protected String getErrAuthInitialize() { - return res.getString(R.string.err_auth_initialize); - } - - @Override - protected String getAuthStart() { - return res.getString(R.string.auth_start); - } - - @Override - protected String getAuthDialogCompleted() { - return res.getString(R.string.auth_dialog_completed); - } - - @Override - protected String getErrAuthProcess() { - return res.getString(R.string.err_auth_process); - } - - @Override - protected String getAuthDialogWait() { - return res.getString(R.string.auth_dialog_wait); - } - - @Override - protected String getAuthDialogPinTitle() { - return res.getString(R.string.auth_dialog_pin_title); - } - - @Override - protected String getAuthDialogPinMessage() { - return res.getString(R.string.auth_dialog_pin_message); - } - - @Override - protected String getAboutAuth1() { - return res.getString(R.string.about_auth_1); - } - - @Override - protected String getAboutAuth2() { - return res.getString(R.string.about_auth_2); - } - - @Override - protected String getAuthAuthorize() { - return res.getString(R.string.auth_authorize); - } - - @Override - protected String getAuthPinHint() { - return res.getString(R.string.auth_pin_hint); - } - - @Override - protected String getAuthFinish() { - return res.getString(R.string.auth_finish); + protected final String getAuthDialogCompleted() { + return res.getString(R.string.auth_dialog_completed_twitter); } } diff --git a/main/src/cgeo/geocaching/ui/AbstractUIFactory.java b/main/src/cgeo/geocaching/ui/AbstractUIFactory.java index 2351383..0d447f2 100644 --- a/main/src/cgeo/geocaching/ui/AbstractUIFactory.java +++ b/main/src/cgeo/geocaching/ui/AbstractUIFactory.java @@ -1,9 +1,9 @@ package cgeo.geocaching.ui; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import android.content.res.Resources; public class AbstractUIFactory { - protected final static Resources res = cgeoapplication.getInstance().getResources(); + protected final static Resources res = CgeoApplication.getInstance().getResources(); } diff --git a/main/src/cgeo/geocaching/ui/AbstractUserClickListener.java b/main/src/cgeo/geocaching/ui/AbstractUserClickListener.java index b717568..f8cfb8a 100644 --- a/main/src/cgeo/geocaching/ui/AbstractUserClickListener.java +++ b/main/src/cgeo/geocaching/ui/AbstractUserClickListener.java @@ -1,7 +1,7 @@ package cgeo.geocaching.ui; import cgeo.geocaching.R; -import cgeo.geocaching.cgeocaches; +import cgeo.geocaching.CacheListActivity; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.network.Network; @@ -53,10 +53,10 @@ abstract class AbstractUserClickListener implements View.OnClickListener { public void onClick(DialogInterface dialog, int item) { switch (item) { case 0: - cgeocaches.startActivityOwner(context, name.toString()); + CacheListActivity.startActivityOwner(context, name.toString()); return; case 1: - cgeocaches.startActivityUserName(context, name.toString()); + CacheListActivity.startActivityUserName(context, name.toString()); return; case 2: context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + Network.encode(name.toString())))); diff --git a/main/src/cgeo/geocaching/ui/AddressListAdapter.java b/main/src/cgeo/geocaching/ui/AddressListAdapter.java index 736c036..0d5fba7 100644 --- a/main/src/cgeo/geocaching/ui/AddressListAdapter.java +++ b/main/src/cgeo/geocaching/ui/AddressListAdapter.java @@ -2,9 +2,9 @@ package cgeo.geocaching.ui; import butterknife.InjectView; +import cgeo.geocaching.CacheListActivity; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; -import cgeo.geocaching.cgeocaches; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; @@ -38,7 +38,7 @@ public class AddressListAdapter extends ArrayAdapter<Address> { public AddressListAdapter(final Context context) { super(context, 0); inflater = ((Activity) context).getLayoutInflater(); - location = cgeoapplication.getInstance().currentGeo().getCoords(); + location = CgeoApplication.getInstance().currentGeo().getCoords(); } @Override @@ -61,7 +61,7 @@ public class AddressListAdapter extends ArrayAdapter<Address> { @Override public void onClick(final View v) { final Activity activity = (Activity) v.getContext(); - cgeocaches.startActivityAddress(activity, new Geopoint(address.getLatitude(), address.getLongitude()), StringUtils.defaultString(address.getAddressLine(0))); + CacheListActivity.startActivityAddress(activity, new Geopoint(address.getLatitude(), address.getLongitude()), StringUtils.defaultString(address.getAddressLine(0))); activity.finish(); } }); diff --git a/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java b/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java index 9059a6b..5db562e 100644 --- a/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java +++ b/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java @@ -1,16 +1,18 @@ package cgeo.geocaching.ui; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; import android.app.Activity; import android.content.res.Resources; +import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -134,7 +136,7 @@ public final class CacheDetailsCreator { public void addDistance(final Geocache cache, final TextView cacheDistanceView) { Float distance = null; if (cache.getCoords() != null) { - final Geopoint currentCoords = cgeoapplication.getInstance().currentGeo().getCoords(); + final Geopoint currentCoords = CgeoApplication.getInstance().currentGeo().getCoords(); if (currentCoords != null) { distance = currentCoords.distanceTo(cache); } @@ -159,7 +161,7 @@ public final class CacheDetailsCreator { public void addDistance(final Waypoint wpt, final TextView waypointDistanceView) { Float distance = null; if (wpt.getCoords() != null) { - final Geopoint currentCoords = cgeoapplication.getInstance().currentGeo().getCoords(); + final Geopoint currentCoords = CgeoApplication.getInstance().currentGeo().getCoords(); if (currentCoords != null) { distance = currentCoords.distanceTo(wpt); } @@ -175,4 +177,14 @@ public final class CacheDetailsCreator { } add(R.string.cache_distance, text); } + + public void addEventDate(@NonNull Geocache cache) { + if (cache.isEventCache() && cache.getHiddenDate() != null) { + final long time = cache.getHiddenDate().getTime(); + if (time > 0) { + final String dateString = DateUtils.formatDateTime(CgeoApplication.getInstance().getBaseContext(), time, DateUtils.FORMAT_SHOW_WEEKDAY) + ", " + Formatter.formatFullDate(time); + add(R.string.cache_event, dateString); + } + } + } } diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index c6aeaa6..f4d5936 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -6,7 +6,7 @@ import cgeo.geocaching.CacheDetailActivity; import cgeo.geocaching.Geocache; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.enumerations.CacheListType; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.filter.IFilter; @@ -20,7 +20,7 @@ import cgeo.geocaching.sorting.VisitComparator; import cgeo.geocaching.utils.AngleUtils; import cgeo.geocaching.utils.Log; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -112,7 +112,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { public CacheListAdapter(final Activity activity, final List<Geocache> list, CacheListType cacheListType) { super(activity, 0, list); - final IGeoData currentGeo = cgeoapplication.getInstance().currentGeo(); + final IGeoData currentGeo = CgeoApplication.getInstance().currentGeo(); if (currentGeo != null) { coords = currentGeo.getCoords(); } diff --git a/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java b/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java index f10e13a..e2e587e 100644 --- a/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java +++ b/main/src/cgeo/geocaching/ui/DecryptTextClickListener.java @@ -2,36 +2,38 @@ package cgeo.geocaching.ui; import cgeo.geocaching.utils.CryptUtils;
+import org.eclipse.jdt.annotation.NonNull;
+
import android.text.Spannable;
import android.view.View;
import android.widget.TextView;
public class DecryptTextClickListener implements View.OnClickListener {
- @Override
- public void onClick(View view) {
- if (view == null) {
- return;
- }
+ @NonNull private final TextView targetView;
- try {
- final TextView logView = (TextView) view;
+ public DecryptTextClickListener(@NonNull final TextView targetView) {
+ this.targetView = targetView;
+ }
+ @Override
+ public final void onClick(final View view) {
+ try {
// do not run the click listener if a link was clicked
- if (logView.getSelectionStart() != -1 || logView.getSelectionEnd() != -1) {
+ if (targetView.getSelectionStart() != -1 || targetView.getSelectionEnd() != -1) {
return;
}
- CharSequence text = logView.getText();
+ CharSequence text = targetView.getText();
if (text instanceof Spannable) {
Spannable span = (Spannable) text;
- logView.setText(CryptUtils.rot13(span));
+ targetView.setText(CryptUtils.rot13(span));
}
else {
String string = (String) text;
- logView.setText(CryptUtils.rot13(string));
+ targetView.setText(CryptUtils.rot13(string));
}
- } catch (Exception e) {
+ } catch (RuntimeException e) {
// nothing
}
}
diff --git a/main/src/cgeo/geocaching/ui/DirectionImage.java b/main/src/cgeo/geocaching/ui/DirectionImage.java index 9de360c..cd7695e 100644 --- a/main/src/cgeo/geocaching/ui/DirectionImage.java +++ b/main/src/cgeo/geocaching/ui/DirectionImage.java @@ -1,6 +1,6 @@ package cgeo.geocaching.ui; -import cgeo.geocaching.StoredList; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; import org.apache.commons.lang3.StringUtils; diff --git a/main/src/cgeo/geocaching/ui/Formatter.java b/main/src/cgeo/geocaching/ui/Formatter.java index ecae9ea..963807f 100644 --- a/main/src/cgeo/geocaching/ui/Formatter.java +++ b/main/src/cgeo/geocaching/ui/Formatter.java @@ -3,7 +3,7 @@ package cgeo.geocaching.ui; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.Waypoint; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.enumerations.CacheListType; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.WaypointType; @@ -22,7 +22,7 @@ public abstract class Formatter { /** Text separator used for formatting texts */ public static final String SEPARATOR = " ยท "; - private static final Context context = cgeoapplication.getInstance().getBaseContext(); + private static final Context context = CgeoApplication.getInstance().getBaseContext(); /** * Generate a time string according to system-wide settings (locale, 12/24 hour) @@ -87,9 +87,9 @@ public abstract class Formatter { int diff = cgeo.geocaching.utils.DateUtils.daysSince(date); switch (diff) { case 0: - return cgeoapplication.getInstance().getString(R.string.log_today); + return CgeoApplication.getInstance().getString(R.string.log_today); case 1: - return cgeoapplication.getInstance().getString(R.string.log_yesterday); + return CgeoApplication.getInstance().getString(R.string.log_yesterday); default: return formatShortDate(date); } @@ -116,10 +116,10 @@ public abstract class Formatter { addShortInfos(cache, infos); if (cache.isPremiumMembersOnly()) { - infos.add(cgeoapplication.getInstance().getString(R.string.cache_premium)); + infos.add(CgeoApplication.getInstance().getString(R.string.cache_premium)); } if (cacheListType != CacheListType.OFFLINE && cacheListType != CacheListType.HISTORY && cache.getListId() > 0) { - infos.add(cgeoapplication.getInstance().getString(R.string.cache_offline)); + infos.add(CgeoApplication.getInstance().getString(R.string.cache_offline)); } return StringUtils.join(infos, Formatter.SEPARATOR); } @@ -161,7 +161,7 @@ public abstract class Formatter { infos.add(waypointType.getL10n()); } if (Waypoint.PREFIX_OWN.equalsIgnoreCase(waypoint.getPrefix())) { - infos.add(cgeoapplication.getInstance().getString(R.string.waypoint_custom)); + infos.add(CgeoApplication.getInstance().getString(R.string.waypoint_custom)); } else { if (StringUtils.isNotBlank(waypoint.getPrefix())) { infos.add(waypoint.getPrefix()); diff --git a/main/src/cgeo/geocaching/ui/ImagesList.java b/main/src/cgeo/geocaching/ui/ImagesList.java index 0f860c4..9cca5b5 100644 --- a/main/src/cgeo/geocaching/ui/ImagesList.java +++ b/main/src/cgeo/geocaching/ui/ImagesList.java @@ -2,12 +2,12 @@ package cgeo.geocaching.ui; import cgeo.geocaching.Image; import cgeo.geocaching.R; -import cgeo.geocaching.StoredList; import cgeo.geocaching.files.LocalStorage; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; -import cgeo.geocaching.utils.IOUtils; import cgeo.geocaching.utils.Log; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; diff --git a/main/src/cgeo/geocaching/ui/LoggingUI.java b/main/src/cgeo/geocaching/ui/LoggingUI.java index 0ee724a..1423da2 100644 --- a/main/src/cgeo/geocaching/ui/LoggingUI.java +++ b/main/src/cgeo/geocaching/ui/LoggingUI.java @@ -1,12 +1,11 @@ package cgeo.geocaching.ui; +import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.cgData; -import cgeo.geocaching.activity.IAbstractActivity; import cgeo.geocaching.enumerations.LogType; +import cgeo.geocaching.settings.Settings; import android.app.Activity; import android.app.AlertDialog; @@ -61,13 +60,13 @@ public class LoggingUI extends AbstractUIFactory { } } - public static boolean onMenuItemSelected(final MenuItem item, IAbstractActivity activity, Geocache cache) { + public static boolean onMenuItemSelected(final MenuItem item, final Activity activity, final Geocache cache) { switch (item.getItemId()) { case R.id.menu_log_visit: cache.logVisit(activity); return true; case R.id.menu_log_visit_offline: - showOfflineMenu(cache, (Activity) activity); + showOfflineMenu(cache, activity); return true; default: return false; @@ -75,7 +74,7 @@ public class LoggingUI extends AbstractUIFactory { } private static void showOfflineMenu(final Geocache cache, final Activity activity) { - final LogEntry currentLog = cgData.loadLogOffline(cache.getGeocode()); + final LogEntry currentLog = DataStore.loadLogOffline(cache.getGeocode()); final LogType currentLogType = currentLog == null ? null : currentLog.type; final List<LogType> logTypes = cache.getPossibleLogTypes(); @@ -100,7 +99,7 @@ public class LoggingUI extends AbstractUIFactory { if (logTypeEntry.logType == null) { switch (logTypeEntry.specialLogType) { case LOG_CACHE: - cache.logVisit((IAbstractActivity) activity); + cache.logVisit(activity); break; case CLEAR_LOG: diff --git a/main/src/cgeo/geocaching/ui/dialog/CustomProgressDialog.java b/main/src/cgeo/geocaching/ui/dialog/CustomProgressDialog.java index e80c446..97c5c29 100644 --- a/main/src/cgeo/geocaching/ui/dialog/CustomProgressDialog.java +++ b/main/src/cgeo/geocaching/ui/dialog/CustomProgressDialog.java @@ -10,6 +10,7 @@ import android.view.View; import android.widget.TextView; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** @@ -38,7 +39,11 @@ public class CustomProgressDialog extends ProgressDialog { method.invoke(textView, View.GONE); } } - } catch (Exception e) { + } catch (NoSuchMethodException e) { + Log.e("Failed to invoke the progressDialog method 'setVisibility' and set 'mProgressNumber' to GONE.", e); + } catch (IllegalAccessException e) { + Log.e("Failed to invoke the progressDialog method 'setVisibility' and set 'mProgressNumber' to GONE.", e); + } catch (InvocationTargetException e) { Log.e("Failed to invoke the progressDialog method 'setVisibility' and set 'mProgressNumber' to GONE.", e); } } diff --git a/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java b/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java index 2c4f38d..6ad59ec 100644 --- a/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java +++ b/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java @@ -2,7 +2,7 @@ package cgeo.geocaching.ui.dialog; import cgeo.geocaching.R; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import android.app.Activity; import android.app.AlertDialog; @@ -33,7 +33,7 @@ public class LiveMapInfoDialogBuilder { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - cgeoapplication.getInstance().setLiveMapHintShown(); + CgeoApplication.getInstance().setLiveMapHintShown(); if (checkBoxHide.getVisibility() == View.VISIBLE && checkBoxHide.isChecked()) { Settings.setHideLiveHint(true); } diff --git a/main/src/cgeo/geocaching/ui/logs/CacheLogsViewCreator.java b/main/src/cgeo/geocaching/ui/logs/CacheLogsViewCreator.java index 8da711e..8fe3866 100644 --- a/main/src/cgeo/geocaching/ui/logs/CacheLogsViewCreator.java +++ b/main/src/cgeo/geocaching/ui/logs/CacheLogsViewCreator.java @@ -4,7 +4,7 @@ import cgeo.geocaching.CacheDetailActivity; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.ui.UserActionsClickListener; @@ -23,7 +23,7 @@ import java.util.Map.Entry; public class CacheLogsViewCreator extends LogsViewCreator { private final boolean allLogs; - private final Resources res = cgeoapplication.getInstance().getResources(); + private final Resources res = CgeoApplication.getInstance().getResources(); public CacheLogsViewCreator(CacheDetailActivity cacheDetailActivity, boolean allLogs) { super(cacheDetailActivity); diff --git a/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java b/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java index ee2713a..15634d3 100644 --- a/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java +++ b/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java @@ -4,9 +4,9 @@ import cgeo.geocaching.Image; import cgeo.geocaching.ImagesActivity; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.StoredList; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.Progress; +import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.ui.AbstractCachingPageViewCreator; import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod; @@ -129,7 +129,7 @@ public abstract class LogsViewCreator extends AbstractCachingPageViewCreator<Lis if (null == convertView) { holder.author.setOnClickListener(createUserActionsListener()); holder.text.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance()); - holder.text.setOnClickListener(new DecryptTextClickListener()); + holder.text.setOnClickListener(new DecryptTextClickListener(holder.text)); activity.registerForContextMenu(holder.text); } } diff --git a/main/src/cgeo/geocaching/utils/ApplicationSettings.java b/main/src/cgeo/geocaching/utils/ApplicationSettings.java index 99d3142..78fa4f6 100644 --- a/main/src/cgeo/geocaching/utils/ApplicationSettings.java +++ b/main/src/cgeo/geocaching/utils/ApplicationSettings.java @@ -17,7 +17,7 @@ public class ApplicationSettings { */ public static String getPreferencesName() { // There is currently no Android API to get the file name of the shared preferences. Let's hardcode - // it without needing a cgeoapplication instance. + // it without needing a CgeoApplication instance. return "cgeo.geocaching_preferences"; } diff --git a/main/src/cgeo/geocaching/utils/CancellableHandler.java b/main/src/cgeo/geocaching/utils/CancellableHandler.java index 8cf8f28..cb4b9db 100644 --- a/main/src/cgeo/geocaching/utils/CancellableHandler.java +++ b/main/src/cgeo/geocaching/utils/CancellableHandler.java @@ -1,6 +1,6 @@ package cgeo.geocaching.utils; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import android.os.Handler; import android.os.Message; @@ -114,7 +114,7 @@ public abstract class CancellableHandler extends Handler { public static void sendLoadProgressDetail(final Handler handler, final int resourceId) { if (null != handler) { - handler.obtainMessage(UPDATE_LOAD_PROGRESS_DETAIL, cgeoapplication.getInstance().getString(resourceId)).sendToTarget(); + handler.obtainMessage(UPDATE_LOAD_PROGRESS_DETAIL, CgeoApplication.getInstance().getString(resourceId)).sendToTarget(); } } } diff --git a/main/src/cgeo/geocaching/utils/ClipboardUtils.java b/main/src/cgeo/geocaching/utils/ClipboardUtils.java index 67069b2..77250f3 100644 --- a/main/src/cgeo/geocaching/utils/ClipboardUtils.java +++ b/main/src/cgeo/geocaching/utils/ClipboardUtils.java @@ -1,6 +1,6 @@ package cgeo.geocaching.utils; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import android.content.Context; @@ -24,7 +24,7 @@ public final class ClipboardUtils { */ public static void copyToClipboard(final CharSequence text) { // fully qualified name used here to avoid buggy deprecation warning (of javac) on the import statement - final android.text.ClipboardManager clipboard = (android.text.ClipboardManager) cgeoapplication.getInstance().getSystemService(Context.CLIPBOARD_SERVICE); + final android.text.ClipboardManager clipboard = (android.text.ClipboardManager) CgeoApplication.getInstance().getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(text); } diff --git a/main/src/cgeo/geocaching/utils/CryptUtils.java b/main/src/cgeo/geocaching/utils/CryptUtils.java index 18a337d..d98585a 100644 --- a/main/src/cgeo/geocaching/utils/CryptUtils.java +++ b/main/src/cgeo/geocaching/utils/CryptUtils.java @@ -1,11 +1,17 @@ package cgeo.geocaching.utils; +import org.apache.commons.lang3.CharEncoding; +import org.apache.commons.lang3.StringUtils; + import android.text.Spannable; import android.text.SpannableStringBuilder; +import java.io.UnsupportedEncodingException; import java.math.BigInteger; +import java.security.GeneralSecurityException; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; @@ -62,7 +68,7 @@ public final class CryptUtils { public static String rot13(String text) { if (text == null) { - return ""; + return StringUtils.EMPTY; } final StringBuilder result = new StringBuilder(); Rot13Encryption rot13 = new Rot13Encryption(); @@ -76,42 +82,44 @@ public final class CryptUtils { } public static String md5(String text) { - String hashed = ""; - try { final MessageDigest digest = MessageDigest.getInstance("MD5"); - digest.update(text.getBytes(), 0, text.length()); - hashed = new BigInteger(1, digest.digest()).toString(16); - } catch (Exception e) { + digest.update(text.getBytes(CharEncoding.UTF_8), 0, text.length()); + return new BigInteger(1, digest.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + Log.e("CryptUtils.md5", e); + } catch (UnsupportedEncodingException e) { Log.e("CryptUtils.md5", e); } - return hashed; + return StringUtils.EMPTY; } public static String sha1(String text) { - String hashed = ""; - try { final MessageDigest digest = MessageDigest.getInstance("SHA-1"); - digest.update(text.getBytes(), 0, text.length()); - hashed = new BigInteger(1, digest.digest()).toString(16); - } catch (Exception e) { + digest.update(text.getBytes(CharEncoding.UTF_8), 0, text.length()); + return new BigInteger(1, digest.digest()).toString(16); + } catch (NoSuchAlgorithmException e) { + Log.e("CryptUtils.sha1", e); + } catch (UnsupportedEncodingException e) { Log.e("CryptUtils.sha1", e); } - return hashed; + return StringUtils.EMPTY; } public static byte[] hashHmac(String text, String salt) { byte[] macBytes = {}; try { - final SecretKeySpec secretKeySpec = new SecretKeySpec(salt.getBytes(), "HmacSHA1"); + final SecretKeySpec secretKeySpec = new SecretKeySpec(salt.getBytes(CharEncoding.UTF_8), "HmacSHA1"); final Mac mac = Mac.getInstance("HmacSHA1"); mac.init(secretKeySpec); - macBytes = mac.doFinal(text.getBytes()); - } catch (Exception e) { + macBytes = mac.doFinal(text.getBytes(CharEncoding.UTF_8)); + } catch (GeneralSecurityException e) { + Log.e("CryptUtils.hashHmac", e); + } catch (UnsupportedEncodingException e) { Log.e("CryptUtils.hashHmac", e); } diff --git a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java index 24f375d..b291a8a 100644 --- a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java +++ b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java @@ -1,8 +1,8 @@ package cgeo.geocaching.utils; +import cgeo.geocaching.DataStore; import cgeo.geocaching.MainActivity; import cgeo.geocaching.R; -import cgeo.geocaching.cgData; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.ui.Formatter; @@ -12,8 +12,6 @@ import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.res.Resources; -import android.os.Handler; -import android.os.Message; import java.io.File; import java.util.concurrent.atomic.AtomicBoolean; @@ -34,34 +32,31 @@ public class DatabaseBackupUtils { final Resources res = activity.getResources(); final ProgressDialog dialog = ProgressDialog.show(activity, res.getString(R.string.init_backup_restore), res.getString(R.string.init_restore_running), true, false); final AtomicBoolean restoreSuccessful = new AtomicBoolean(false); - Thread restoreThread = new Thread() { - final Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - dialog.dismiss(); - boolean restored = restoreSuccessful.get(); - String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed); - ActivityMixin.helpDialog(activity, res.getString(R.string.init_backup_restore), message); - if (activity instanceof MainActivity) { - ((MainActivity) activity).updateCacheCounter(); - } - } - }; - + new Thread() { @Override public void run() { - restoreSuccessful.set(cgData.restoreDatabaseInternal()); - handler.sendMessage(handler.obtainMessage()); + restoreSuccessful.set(DataStore.restoreDatabaseInternal()); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + dialog.dismiss(); + boolean restored = restoreSuccessful.get(); + String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed); + ActivityMixin.helpDialog(activity, res.getString(R.string.init_backup_restore), message); + if (activity instanceof MainActivity) { + ((MainActivity) activity).updateCacheCounter(); + } + } + }); } - }; - restoreThread.start(); + }.start(); } 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 (cgData.getAllCachesCount() == 0) { + if (DataStore.getAllCachesCount() == 0) { ActivityMixin.helpDialog(activity, context.getString(R.string.init_backup), context.getString(R.string.init_backup_unnecessary)); @@ -74,7 +69,7 @@ public class DatabaseBackupUtils { new Thread() { @Override public void run() { - final String backupFileName = cgData.backupDatabaseInternal(); + final String backupFileName = DataStore.backupDatabaseInternal(); activity.runOnUiThread(new Runnable() { @Override public void run() { @@ -96,8 +91,8 @@ public class DatabaseBackupUtils { } public static File getRestoreFile() { - final File fileSourceFile = cgData.getBackupFileInternal(); - return fileSourceFile.exists() ? fileSourceFile : null; + final File fileSourceFile = DataStore.getBackupFileInternal(); + return fileSourceFile.exists() && fileSourceFile.length() > 0 ? fileSourceFile : null; } public static boolean hasBackup() { diff --git a/main/src/cgeo/geocaching/utils/GeoDirHandler.java b/main/src/cgeo/geocaching/utils/GeoDirHandler.java index a143730..c85648b 100644 --- a/main/src/cgeo/geocaching/utils/GeoDirHandler.java +++ b/main/src/cgeo/geocaching/utils/GeoDirHandler.java @@ -1,7 +1,7 @@ package cgeo.geocaching.utils; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.IGeoData; -import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.settings.Settings; import android.os.Handler; @@ -29,7 +29,7 @@ public abstract class GeoDirHandler extends Handler implements IObserver<Object> private static final int STOP_GEO = 1 << 4; private static final int STOP_DIR = 1 << 5; - private static final cgeoapplication app = cgeoapplication.getInstance(); + private static final CgeoApplication app = CgeoApplication.getInstance(); @Override final public void handleMessage(final Message message) { diff --git a/main/src/cgeo/geocaching/utils/IOUtils.java b/main/src/cgeo/geocaching/utils/IOUtils.java deleted file mode 100644 index df90da3..0000000 --- a/main/src/cgeo/geocaching/utils/IOUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package cgeo.geocaching.utils; - -import java.io.Closeable; -import java.io.IOException; - -final public class IOUtils { - - private IOUtils() { - // utility class - } - - public static void closeQuietly(final Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (final IOException e) { - Log.w("closeQuietly: unable to close " + closeable, e); - } - } - } - -} diff --git a/main/src/cgeo/geocaching/utils/ImageUtils.java b/main/src/cgeo/geocaching/utils/ImageUtils.java index 478be1f..ea4498b 100644 --- a/main/src/cgeo/geocaching/utils/ImageUtils.java +++ b/main/src/cgeo/geocaching/utils/ImageUtils.java @@ -1,8 +1,11 @@ package cgeo.geocaching.utils; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.compatibility.Compatibility; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; + import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Point; @@ -13,6 +16,7 @@ import android.net.Uri; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; @@ -45,7 +49,7 @@ public final class ImageUtils { * @return BitmapDrawable The scaled image */ public static BitmapDrawable scaleBitmapTo(final Bitmap image, final int maxWidth, final int maxHeight) { - final cgeoapplication app = cgeoapplication.getInstance(); + final CgeoApplication app = CgeoApplication.getInstance(); Bitmap result = image; int width = image.getWidth(); int height = image.getHeight(); @@ -81,7 +85,7 @@ public final class ImageUtils { bitmap.compress(format, quality, bos); bos.flush(); bos.close(); - } catch (Exception e) { + } catch (IOException e) { Log.e("ImageHelper.storeBitmap", e); } } @@ -95,7 +99,8 @@ public final class ImageUtils { * boundings * @return filename and path, <tt>null</tt> if something fails */ - public static String readScaleAndWriteImage(final String filePath, final int maxXY) { + @Nullable + public static String readScaleAndWriteImage(@NonNull final String filePath, final int maxXY) { if (maxXY <= 0) { return filePath; } @@ -131,6 +136,7 @@ public final class ImageUtils { * @return the temporary image file to use, or <tt>null</tt> if the media directory could * not be created. * */ + @Nullable public static File getOutputImageFile() { // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. @@ -152,6 +158,7 @@ public final class ImageUtils { return new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); } + @Nullable public static Uri getOutputImageFileUri() { final File file = getOutputImageFile(); if (file == null) { diff --git a/main/src/cgeo/geocaching/utils/Log.java b/main/src/cgeo/geocaching/utils/Log.java index aa8dbd1..8f96f10 100644 --- a/main/src/cgeo/geocaching/utils/Log.java +++ b/main/src/cgeo/geocaching/utils/Log.java @@ -1,11 +1,15 @@ package cgeo.geocaching.utils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.CharEncoding; + import android.os.Environment; import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.Writer; public final class Log { @@ -107,7 +111,7 @@ public final class Log { } Writer writer = null; try { - writer = new BufferedWriter(new FileWriter(file, true)); + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), CharEncoding.UTF_8)); writer.write(msg); } catch (final IOException e) { Log.e("logToFile: cannot write to " + file, e); diff --git a/main/src/cgeo/geocaching/utils/ProcessUtils.java b/main/src/cgeo/geocaching/utils/ProcessUtils.java index 3345ff1..737fb35 100644 --- a/main/src/cgeo/geocaching/utils/ProcessUtils.java +++ b/main/src/cgeo/geocaching/utils/ProcessUtils.java @@ -1,8 +1,8 @@ package cgeo.geocaching.utils; -import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.CgeoApplication; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import android.content.Intent; import android.content.pm.PackageInfo; @@ -43,7 +43,7 @@ public final class ProcessUtils { * This will find installed applications even without launch intent (e.g. the streetview plugin). */ private static boolean hasPackageInstalled(final String packageName) { - final List<PackageInfo> packs = cgeoapplication.getInstance().getPackageManager().getInstalledPackages(0); + final List<PackageInfo> packs = CgeoApplication.getInstance().getPackageManager().getInstalledPackages(0); for (final PackageInfo packageInfo : packs) { if (packageName.equals(packageInfo.packageName)) { return true; @@ -59,7 +59,7 @@ public final class ProcessUtils { if (packageName == null) { return null; } - final PackageManager packageManager = cgeoapplication.getInstance().getPackageManager(); + final PackageManager packageManager = CgeoApplication.getInstance().getPackageManager(); try { // This can throw an exception where the exception type is only defined on API Level > 3 // therefore surround with try-catch @@ -70,7 +70,7 @@ public final class ProcessUtils { } public static boolean isIntentAvailable(final String intent) { - final PackageManager packageManager = cgeoapplication.getInstance().getPackageManager(); + final PackageManager packageManager = CgeoApplication.getInstance().getPackageManager(); final List<ResolveInfo> list = packageManager.queryIntentActivities( new Intent(intent), PackageManager.MATCH_DEFAULT_ONLY); diff --git a/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java b/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java index 9207c74..22cd4d7 100644 --- a/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java +++ b/main/src/cgeo/geocaching/utils/SimpleCancellableHandler.java @@ -26,7 +26,6 @@ public class SimpleCancellableHandler extends CancellableHandler { activity.showToast(msg.getData().getString(MESSAGE_TEXT)); } dismissProgress(); - return; } @Override diff --git a/main/src/cgeo/geocaching/utils/SimpleHandler.java b/main/src/cgeo/geocaching/utils/SimpleHandler.java index b01d0e1..8e0a479 100644 --- a/main/src/cgeo/geocaching/utils/SimpleHandler.java +++ b/main/src/cgeo/geocaching/utils/SimpleHandler.java @@ -3,7 +3,6 @@ package cgeo.geocaching.utils; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.Progress; -import android.content.res.Resources; import android.os.Handler; import android.os.Message; @@ -15,48 +14,20 @@ public abstract class SimpleHandler extends Handler { protected final WeakReference<Progress> progressDialogRef; public SimpleHandler(final AbstractActivity activity, final Progress progress) { - this.activityRef = new WeakReference<AbstractActivity>(activity); - this.progressDialogRef = new WeakReference<Progress>(progress); + activityRef = new WeakReference<AbstractActivity>(activity); + progressDialogRef = new WeakReference<Progress>(progress); } @Override public void handleMessage(final Message msg) { - AbstractActivity activity = activityRef.get(); + final AbstractActivity activity = activityRef.get(); if (activity != null && msg.getData() != null && msg.getData().getString(MESSAGE_TEXT) != null) { activity.showToast(msg.getData().getString(MESSAGE_TEXT)); } - dismissProgress(); - return; - } - - protected final void showToast(final int resId) { - AbstractActivity activity = activityRef.get(); - if (activity != null) { - Resources res = activity.getResources(); - activity.showToast(res.getText(resId).toString()); - } - } - - protected final void dismissProgress() { - Progress progressDialog = progressDialogRef.get(); + final Progress progressDialog = progressDialogRef.get(); if (progressDialog != null) { progressDialog.dismiss(); } } - protected final void setProgressMessage(final String txt) { - Progress progressDialog = progressDialogRef.get(); - if (progressDialog != null) { - progressDialog.setMessage(txt); - } - } - - protected final void finishActivity() { - AbstractActivity activity = activityRef.get(); - if (activity != null) { - activity.finish(); - } - - } - } diff --git a/main/src/cgeo/geocaching/utils/TextUtils.java b/main/src/cgeo/geocaching/utils/TextUtils.java index c9d4958..302a65d 100644 --- a/main/src/cgeo/geocaching/utils/TextUtils.java +++ b/main/src/cgeo/geocaching/utils/TextUtils.java @@ -3,6 +3,8 @@ */ package cgeo.geocaching.utils; +import org.eclipse.jdt.annotation.Nullable; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,7 +36,7 @@ public final class TextUtils { * Find the last occurring value * @return defaultValue or the n-th group if the pattern matches (trimmed if wanted) */ - public static String getMatch(final String data, final Pattern p, final boolean trim, final int group, final String defaultValue, final boolean last) { + public static String getMatch(@Nullable final String data, final Pattern p, final boolean trim, final int group, final String defaultValue, final boolean last) { if (data != null) { String result = null; @@ -87,7 +89,7 @@ public final class TextUtils { * Value to return if the pattern is not found * @return defaultValue or the first group if the pattern matches (trimmed) */ - public static String getMatch(final String data, final Pattern p, final String defaultValue) { + public static String getMatch(@Nullable final String data, final Pattern p, final String defaultValue) { return TextUtils.getMatch(data, p, true, 1, defaultValue, false); } diff --git a/main/src/cgeo/geocaching/utils/TranslationUtils.java b/main/src/cgeo/geocaching/utils/TranslationUtils.java index 1224f7e..619db08 100644 --- a/main/src/cgeo/geocaching/utils/TranslationUtils.java +++ b/main/src/cgeo/geocaching/utils/TranslationUtils.java @@ -3,6 +3,8 @@ package cgeo.geocaching.utils; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.network.Network; +import org.apache.commons.lang3.StringUtils; + import android.content.Intent; import android.net.Uri; @@ -11,12 +13,12 @@ import android.net.Uri; */ public final class TranslationUtils { - private static final String translationWebsite = "http://translate.google.com/"; - private static final String translationForceClassicMode = "?vi=c"; - private static final String translationAutoSelect = "#auto"; - private static final String translationFieldSeparator = "|"; + private static final String TRANSLATION_WEBSITE = "http://translate.google.com/"; + private static final String TRANSLATION_FORCE_CLASSIC_MODE = "?vi=c"; + private static final String TRANSLATION_AUTO_SELECT = "#auto"; + private static final String TRANSLATION_FIELD_SEPARATOR = "|"; - public static final int translationTextLengthToWarn = 500; + public static final int TRANSLATION_TEXT_LENGTH_WARN = 500; private static final String TRANSLATION_APP = "com.google.android.apps.translate"; private TranslationUtils() { @@ -24,8 +26,8 @@ public final class TranslationUtils { } /** - * Build a URI for Google Translate - * + * Build a URI for Google Translate. + * * @param toLang * The two-letter lowercase ISO language codes as defined by ISO 639-1 * @param text @@ -36,13 +38,13 @@ public final class TranslationUtils { String content = Network.encode(text); // the app works better without the "+", the website works better with "+", therefore assume using the app if installed if (ProcessUtils.isLaunchable(TRANSLATION_APP)) { - content = content.replace("+", "%20"); + content = StringUtils.replace(content, "+", "%20"); } - return translationWebsite + translationForceClassicMode + translationAutoSelect + translationFieldSeparator + toLang + translationFieldSeparator + content; + return TRANSLATION_WEBSITE + TRANSLATION_FORCE_CLASSIC_MODE + TRANSLATION_AUTO_SELECT + TRANSLATION_FIELD_SEPARATOR + toLang + TRANSLATION_FIELD_SEPARATOR + content; } /** - * Send Intent for Google Translate. Can be caught by Google Translate App or browser + * Send Intent for Google Translate. Can be caught by Google Translate App or browser. * * @param toLang * The two-letter lowercase ISO language codes as defined by ISO 639-1 diff --git a/main/src/cgeo/geocaching/utils/UncertainProperty.java b/main/src/cgeo/geocaching/utils/UncertainProperty.java index 5f86662..e8686e3 100644 --- a/main/src/cgeo/geocaching/utils/UncertainProperty.java +++ b/main/src/cgeo/geocaching/utils/UncertainProperty.java @@ -2,6 +2,11 @@ package cgeo.geocaching.utils; import cgeo.geocaching.connector.gc.Tile; +/** + * Property with certainty. When merging properties, the one with higher certainty wins. + * + * @param <T> + */ public class UncertainProperty<T> { private final T value; |
