diff options
Diffstat (limited to 'main')
72 files changed, 838 insertions, 823 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..9fb16cd 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 @@ -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/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.properties b/main/libs/commons-collections-3.2.1.jar.properties new file mode 100644 index 0000000..26aad36 --- /dev/null +++ b/main/libs/commons-collections-3.2.1.jar.properties @@ -0,0 +1 @@ +src=src/commons-collections-3.2.1-src.zip
\ No newline at end of file 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/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-sv/strings.xml b/main/res/values-sv/strings.xml index 6abc9a1..8230277 100644 --- a/main/res/values-sv/strings.xml +++ b/main/res/values-sv/strings.xml @@ -510,6 +510,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> diff --git a/main/res/values/preference_keys.xml b/main/res/values/preference_keys.xml index 140d3b3..38012f5 100644 --- a/main/res/values/preference_keys.xml +++ b/main/res/values/preference_keys.xml @@ -113,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 311b95a..012bfe1 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -512,7 +512,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> diff --git a/main/res/xml/preferences.xml b/main/res/xml/preferences.xml index 0cbeb71..4773acf 100644 --- a/main/res/xml/preferences.xml +++ b/main/res/xml/preferences.xml @@ -1,279 +1,282 @@ <?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.AuthorizeOcPreference + 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.AuthorizeOcPreference + 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.AuthorizeTwitterPreference + 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" @@ -281,290 +284,248 @@ 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/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index 1cf0353..03f0680 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -64,7 +64,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."); } } @@ -209,7 +209,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 } diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 4a9cc6e..e04f7ed 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -291,7 +291,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 +422,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc break; } } - } catch (final Exception e) { + } catch (final RuntimeException e) { } } break; @@ -438,7 +438,7 @@ 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())); @@ -1279,7 +1279,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc private Handler handler; public DropCacheThread(Handler handler) { - super(); this.handler = handler; } @@ -1615,7 +1614,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 +1706,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)); @@ -2452,7 +2456,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(); diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java index 002f00e..c8579e1 100644 --- a/main/src/cgeo/geocaching/CompassActivity.java +++ b/main/src/cgeo/geocaching/CompassActivity.java @@ -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/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java index 56ee959..59666e9 100644 --- a/main/src/cgeo/geocaching/EditWaypointActivity.java +++ b/main/src/cgeo/geocaching/EditWaypointActivity.java @@ -114,7 +114,7 @@ public class EditWaypointActivity extends AbstractActivity { if (own) { initializeWaypointTypeSelector(); } - } catch (Exception e) { + } catch (RuntimeException e) { Log.e("EditWaypointActivity.loadWaypointHandler", e); } finally { if (waitDialog != null) { diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index 96fbc06..7aceed4 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -2,7 +2,6 @@ package cgeo.geocaching; import cgeo.geocaching.cgData.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; @@ -33,6 +32,7 @@ import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.UncertainProperty; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -447,16 +447,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) { @@ -568,7 +568,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 +602,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 @@ -767,16 +767,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 +990,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; } /** @@ -1063,11 +1063,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 +1140,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) { diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java index c739067..cb565bd 100644 --- a/main/src/cgeo/geocaching/LogCacheActivity.java +++ b/main/src/cgeo/geocaching/LogCacheActivity.java @@ -46,7 +46,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"; @@ -79,7 +78,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; @@ -214,13 +213,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 @@ -261,7 +260,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); @@ -341,7 +340,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; @@ -424,8 +423,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; } @@ -438,9 +436,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; @@ -449,10 +447,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); @@ -539,7 +533,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); @@ -556,7 +550,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia Twitter.postTweetCache(geocode); } } - if (rating > 0) { + if (GCVote.isValidRating(rating)) { GCVote.setRating(cache, rating); } @@ -572,7 +566,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia } 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..a01c431 100644 --- a/main/src/cgeo/geocaching/LogEntry.java +++ b/main/src/cgeo/geocaching/LogEntry.java @@ -9,7 +9,6 @@ import org.apache.commons.collections.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); } diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 0fd6759..b6f267a 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -47,6 +47,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 +142,7 @@ public class MainActivity extends AbstractActivity { navLocation.setText(StringUtils.join(addressParts, ", ")); } - } catch (Exception e) { + } catch (RuntimeException e) { // nothing } @@ -542,7 +543,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."); } } @@ -721,7 +722,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..87d7ba7 100644 --- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java +++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java @@ -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 } @@ -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..8f58bcd 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -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."); } } diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java index eb59bcb..cf279c0 100644 --- a/main/src/cgeo/geocaching/StaticMapsProvider.java +++ b/main/src/cgeo/geocaching/StaticMapsProvider.java @@ -14,13 +14,9 @@ import ch.boye.httpclientandroidlib.HttpResponse; import org.apache.commons.lang3.StringUtils; -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() { diff --git a/main/src/cgeo/geocaching/StoredList.java b/main/src/cgeo/geocaching/StoredList.java index 4946420..6f49625 100644 --- a/main/src/cgeo/geocaching/StoredList.java +++ b/main/src/cgeo/geocaching/StoredList.java @@ -4,6 +4,7 @@ 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; @@ -78,10 +79,6 @@ public final class StoredList { 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; - } - if (exceptListId > StoredList.TEMPORARY_LIST_ID) { StoredList exceptList = cgData.getList(exceptListId); if (exceptList != null) { @@ -122,6 +119,7 @@ public final class StoredList { builder.create().show(); } + @NonNull private static List<StoredList> getSortedLists() { final Collator collator = Collator.getInstance(); final List<StoredList> lists = cgData.getLists(); 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/activity/AbstractListActivity.java b/main/src/cgeo/geocaching/activity/AbstractListActivity.java index 47c747f..93e9b7f 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 android.content.res.Resources; import android.graphics.drawable.Drawable; @@ -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/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/cachelist/CacheListAppFactory.java b/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java index b747eee..ca06c52 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; @@ -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/cgData.java b/main/src/cgeo/geocaching/cgData.java index 9d636f9..a2c9367 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -20,6 +20,7 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; import android.content.ContentValues; import android.content.Context; @@ -2479,6 +2480,7 @@ public class cgData { } } + @NonNull public static List<StoredList> getLists() { init(); diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 59174f5..423e9c6 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -655,7 +655,7 @@ 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) { + } catch (final RuntimeException e) { Log.e("cgeocaches.onPrepareOptionsMenu", e); } @@ -1326,7 +1326,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(); 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..9ac9c9d 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -2,6 +2,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; import cgeo.geocaching.ICache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.cgData; @@ -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.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); } diff --git a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java index 2aa5c75..dfb1f55 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,12 @@ 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 android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; @@ -38,8 +37,8 @@ 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; } diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java index 4fdde56..27d8a77 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCMap.java +++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java @@ -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); } diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index 34e48ab..7eacb8e 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -147,7 +147,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"); } @@ -309,7 +309,7 @@ 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")) { + if (coordinates != null && 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); @@ -320,7 +320,7 @@ public abstract class GCParser { LocParser.parseLoc(searchResult, coordinates); - } catch (final Exception e) { + } catch (final RuntimeException e) { Log.e("GCParser.parseSearch.CIDs", e); } } @@ -569,7 +569,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 +598,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 +632,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 +654,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"); } @@ -1083,7 +1083,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); } @@ -1396,7 +1396,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 +1427,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,7 +1476,7 @@ 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"); } diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java index 0d8fb05..10ea18d 100644 --- a/main/src/cgeo/geocaching/connector/gc/Login.java +++ b/main/src/cgeo/geocaching/connector/gc/Login.java @@ -114,7 +114,7 @@ public abstract class Login { loginResponse = Network.postRequest("https://www.geocaching.com/login/default.aspx", params); loginData = Network.getResponseData(loginResponse); - if (StringUtils.isBlank(loginData)) { + if (loginData == null || StringUtils.isBlank(loginData)) { Log.e("Login.login: Failed to retrieve login page (2nd)"); // FIXME: should it be CONNECTION_FAILED to match the first attempt? return StatusCode.COMMUNICATION_ERROR; // no login page @@ -276,7 +276,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)) { 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/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index d35e54b..663bbf7 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -1,6 +1,7 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.Geocache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.SearchResult; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; @@ -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; @@ -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); } 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/enumerations/CacheType.java b/main/src/cgeo/geocaching/enumerations/CacheType.java index c7a9130..31ec392 100644 --- a/main/src/cgeo/geocaching/enumerations/CacheType.java +++ b/main/src/cgeo/geocaching/enumerations/CacheType.java @@ -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/export/GpxExport.java b/main/src/cgeo/geocaching/export/GpxExport.java index 821a3f6..36e43a0 100644 --- a/main/src/cgeo/geocaching/export/GpxExport.java +++ b/main/src/cgeo/geocaching/export/GpxExport.java @@ -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/files/GPXImporter.java b/main/src/cgeo/geocaching/files/GPXImporter.java index a1c04d7..3f11c26 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.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(); @@ -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..3358759 100644 --- a/main/src/cgeo/geocaching/files/GPXParser.java +++ b/main/src/cgeo/geocaching/files/GPXParser.java @@ -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."); } } @@ -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 } } diff --git a/main/src/cgeo/geocaching/files/SimpleDirChooser.java b/main/src/cgeo/geocaching/files/SimpleDirChooser.java index cf969dc..ba7c679 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) { diff --git a/main/src/cgeo/geocaching/filter/DistanceFilter.java b/main/src/cgeo/geocaching/filter/DistanceFilter.java index 2f39473..4d00b65 100644 --- a/main/src/cgeo/geocaching/filter/DistanceFilter.java +++ b/main/src/cgeo/geocaching/filter/DistanceFilter.java @@ -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,7 +50,7 @@ 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 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)); } diff --git a/main/src/cgeo/geocaching/gcvote/GCVote.java b/main/src/cgeo/geocaching/gcvote/GCVote.java index 868be2b..f20a6d4 100644 --- a/main/src/cgeo/geocaching/gcvote/GCVote.java +++ b/main/src/cgeo/geocaching/gcvote/GCVote.java @@ -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/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 0817170..0703dd8 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -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); } @@ -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."); } } @@ -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 } @@ -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..8fbb3db 100644 --- a/main/src/cgeo/geocaching/maps/CachesOverlay.java +++ b/main/src/cgeo/geocaching/maps/CachesOverlay.java @@ -4,7 +4,6 @@ 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.activity.Progress; @@ -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); @@ -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/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/network/Network.java b/main/src/cgeo/geocaching/network/Network.java index 3aa1828..8c44c9c 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"); @@ -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(); @@ -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(); @@ -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", @@ -282,37 +286,32 @@ public abstract class Network { * @return * the response, or null if there has been a failure */ + @Nullable private static HttpResponse doRepeatedRequests(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 (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,7 +395,7 @@ 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; } @@ -403,7 +406,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 +421,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 +440,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 +453,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 +478,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/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index 14e0b33..221147c 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -5,6 +5,7 @@ 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; @@ -22,6 +23,7 @@ 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 { @@ -156,38 +158,36 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { private void requestToken() { 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); - } + 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(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); 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/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 680e38f..34f5dc1 100644 --- a/main/src/cgeo/geocaching/settings/Settings.java +++ b/main/src/cgeo/geocaching/settings/Settings.java @@ -475,7 +475,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); @@ -552,16 +552,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() { diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index d2c73f3..90b6145 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -8,6 +8,7 @@ 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,6 +152,22 @@ 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) { 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/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/LoggingUI.java b/main/src/cgeo/geocaching/ui/LoggingUI.java index 0ee724a..c2e2d24 100644 --- a/main/src/cgeo/geocaching/ui/LoggingUI.java +++ b/main/src/cgeo/geocaching/ui/LoggingUI.java @@ -3,10 +3,9 @@ package cgeo.geocaching.ui; 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; @@ -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/logs/LogsViewCreator.java b/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java index ee2713a..4572bc6 100644 --- a/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java +++ b/main/src/cgeo/geocaching/ui/logs/LogsViewCreator.java @@ -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/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..8aa605f 100644 --- a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java +++ b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java @@ -97,7 +97,7 @@ public class DatabaseBackupUtils { public static File getRestoreFile() { final File fileSourceFile = cgData.getBackupFileInternal(); - return fileSourceFile.exists() ? fileSourceFile : null; + return fileSourceFile.exists() && fileSourceFile.length() > 0 ? fileSourceFile : null; } public static boolean hasBackup() { diff --git a/main/src/cgeo/geocaching/utils/ImageUtils.java b/main/src/cgeo/geocaching/utils/ImageUtils.java index 6851241..34bfa1c 100644 --- a/main/src/cgeo/geocaching/utils/ImageUtils.java +++ b/main/src/cgeo/geocaching/utils/ImageUtils.java @@ -13,6 +13,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; @@ -81,7 +82,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); } } diff --git a/main/src/cgeo/geocaching/utils/Log.java b/main/src/cgeo/geocaching/utils/Log.java index aa8dbd1..1ade2f9 100644 --- a/main/src/cgeo/geocaching/utils/Log.java +++ b/main/src/cgeo/geocaching/utils/Log.java @@ -1,11 +1,14 @@ package cgeo.geocaching.utils; +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 +110,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/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/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; |
